ASM中的PTR指令,它是如何工作的?

时间:2017-02-09 15:57:52

标签: pointers assembly x86 masm32

我有一些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位操作数?

提前致谢。

2 个答案:

答案 0 :(得分:0)

如果您的代码看起来像您发布的内容,请参阅@ Jester的评论。

但根据您的问题判断,我猜测您的代码确实包含此行:

mov ebx, DWORD PTR g
  

我认为PTR指令将操作数表示为32位操作数?

这取决于你的意思。当大小不明确时,DWORD PTR将用作大小说明符 例如,指令mov [eax], 0将是不明确的,因为汇编程序不知道您是否打算写一个字节,一个单词,一个双字等。所以在这种情况下你可以使用DWORD PTR来声明您要将DWORD写入记忆:mov DWORD PTR [eax], 0

如果您想从内存中读取一个字节并将其转换为DWORD,则需要使用movzxmovsx

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以及其他所有人都故意不想继续使用已有的内容,如何指定这是字节读取还是单词读取或双字读取会有所不同。同样,如果您未指定所需内容,则生成默认指令。

相关问题