我有一个带有几个变量和一个指令的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位操作数?
提前谢谢。
发布于 2017-02-09 17:58:36
如果您的代码看起来真的像您发布的内容,请参见@Jester的评论。
但从您的问题判断,我猜您的代码实际上包含了这一行:
mov ebx, DWORD PTR g我认为PTR指令会将操作数表示为32位操作数?
这取决于你的意思。当大小不明确时,DWORD PTR将用作大小说明符。
例如,指令mov [eax], 0将是模棱两可的,因为汇编程序不知道您是否打算编写一个字节、一个单词、一个dword等等。因此,在这种情况下,您可以使用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发布于 2017-02-09 19:13:05
不幸的是,x86的汇编语言过于通用,使用
mov ebx,a如果您查看指令编码(如果您正在编写/学习程序集,那么无论如何您应该有一个方便且打开的引用),您会发现这可能意味着在地址8处读取一个字节,或者在地址a处读取一个16位字,或者在地址a处有一个32位字。它可能会或不会更进一步,允许符号扩展与否。所以,为了得到你想要的正确的指令,你需要增加更多的东西。
汇编语言不是某种标准,它是由汇编程序定义的,程序读取ASCII文件,所以同一指令集的一种汇编语言并不规定另一种汇编语言是什么。尤其是x86,首先是英特尔对AT&T,然后是gcc对masm对nasm等等。当然,对于gcc和AT&T,以及其他有意不想与已经存在的内容相一致的人,你如何指定这是字节读,读字还是读dword,这是不同的。同样,如果没有指定所需内容,则生成默认指令。
https://stackoverflow.com/questions/42141282
复制相似问题