ASM 中的 PTR 指令,它是如何工作的?
PTR Directive in ASM, how does it work?
我有这个带有几个变量和 1 条指令的 ASM 代码块:
.data
g BYTE 32h
a DWORD 11111111h
h BYTE 64h
.code
mov ebx, DWORD PTR g
谁能解释为什么 ebx 的值不是 11 11 11 32
而不是 00 00 00 32
或者至少 PTR 是如何工作的?
我认为 PTR 指令会将操作数表示为 32 位操作数?
提前致谢。
如果您的代码确实与您发布的代码相似,请参阅@Jester 的评论。
但是从你的问题来看,我猜你的代码实际上包含这一行:
mov ebx, DWORD PTR g
I thought that the PTR directive would represent the operand as a 32-bit operand ?
这取决于你的意思。当大小不明确时,DWORD PTR
将用作大小说明符。
例如,指令 mov [eax], 0
将是不明确的,因为汇编器不知道你是想写一个字节、一个字、一个双字等。所以在那种情况下你可以使用 DWORD PTR
来说明您想将 DWORD
写入内存:mov DWORD PTR [eax], 0
.
如果你想从内存中读取一个字节并将其转换为 DWORD
你需要使用 movzx
或 movsx
:
movzx ebx, BYTE PTR g ; if g should be treated as unsigned
movsx ebx, BYTE PTR g ; if g should be treated as signed
不幸的是 x86 的汇编语言太通用了,使用
mov ebx,a
如果您查看指令编码(如果您是 writing/learning 程序集,您应该手边有一个参考并打开)您会发现这可能意味着读取地址 8 处的一个字节或一个 16 位字在地址 a 或者可能是地址 a 的 32 位字。它可能会或可能不会更进一步并允许或不允许符号扩展。因此,为了获得您想要的正确说明,您需要添加更多内容。
汇编语言不是某种标准,它是由汇编器定义的,程序读取 ASCII 文件,因此用于同一指令集的一种汇编语言不会规定另一种是什么。 x86 特别是从 intel vs AT&T 开始,然后是 gcc vs masm vs nasm 等等。很自然地,对于 gcc 和 AT&T 以及其他所有故意不想与已经存在的东西一起使用的人,您如何指定这是字节读取还是字读取还是双字读取会有所不同。同样,如果您未指定所需内容,则会生成默认指令(如果有的话)。
我有这个带有几个变量和 1 条指令的 ASM 代码块:
.data
g BYTE 32h
a DWORD 11111111h
h BYTE 64h
.code
mov ebx, DWORD PTR g
谁能解释为什么 ebx 的值不是 11 11 11 32
而不是 00 00 00 32
或者至少 PTR 是如何工作的?
我认为 PTR 指令会将操作数表示为 32 位操作数?
提前致谢。
如果您的代码确实与您发布的代码相似,请参阅@Jester 的评论。
但是从你的问题来看,我猜你的代码实际上包含这一行:
mov ebx, DWORD PTR g
I thought that the PTR directive would represent the operand as a 32-bit operand ?
这取决于你的意思。当大小不明确时,DWORD PTR
将用作大小说明符。
例如,指令 mov [eax], 0
将是不明确的,因为汇编器不知道你是想写一个字节、一个字、一个双字等。所以在那种情况下你可以使用 DWORD PTR
来说明您想将 DWORD
写入内存:mov DWORD PTR [eax], 0
.
如果你想从内存中读取一个字节并将其转换为 DWORD
你需要使用 movzx
或 movsx
:
movzx ebx, BYTE PTR g ; if g should be treated as unsigned
movsx ebx, BYTE PTR g ; if g should be treated as signed
不幸的是 x86 的汇编语言太通用了,使用
mov ebx,a
如果您查看指令编码(如果您是 writing/learning 程序集,您应该手边有一个参考并打开)您会发现这可能意味着读取地址 8 处的一个字节或一个 16 位字在地址 a 或者可能是地址 a 的 32 位字。它可能会或可能不会更进一步并允许或不允许符号扩展。因此,为了获得您想要的正确说明,您需要添加更多内容。
汇编语言不是某种标准,它是由汇编器定义的,程序读取 ASCII 文件,因此用于同一指令集的一种汇编语言不会规定另一种是什么。 x86 特别是从 intel vs AT&T 开始,然后是 gcc vs masm vs nasm 等等。很自然地,对于 gcc 和 AT&T 以及其他所有故意不想与已经存在的东西一起使用的人,您如何指定这是字节读取还是字读取还是双字读取会有所不同。同样,如果您未指定所需内容,则会生成默认指令(如果有的话)。