我有一些ASM代码块,带有一些变量和1条指令:
.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位操作数?
提前致谢。
答案 0 :(得分:0)
如果您的代码看起来像您发布的内容,请参阅@ Jester的评论。
但根据您的问题判断,我猜测您的代码确实包含此行:
mov ebx, DWORD PTR g
我认为PTR指令将操作数表示为32位操作数?
这取决于你的意思。当大小不明确时,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
答案 1 :(得分:0)
不幸的是,使用
,x86的汇编语言过于通用了mov ebx,a
如果你看一下指令编码(如果你正在编写/学习汇编,你应该有一个方便的参考并且打开),你会发现这可能意味着读取地址8处的字节,或地址a处的16位字或也许是地址a的32位字。它可能会或可能不会进一步允许符号扩展或不允许。因此,为了获得您想要的正确指令,您需要添加更多内容。
汇编语言不是汇编程序定义的一些标准,程序读取ASCII文件,因此同一指令集的一种汇编语言并不代表另一种汇编语言。 x86特别是从intel vs AT& T开始,然后是gcc vs masm vs nasm等等。自然而然地,gcc和AT& T以及其他所有人都故意不想继续使用已有的内容,如何指定这是字节读取还是单词读取或双字读取会有所不同。同样,如果您未指定所需内容,则生成默认指令。