在尺寸指令的上下文中了解PTR

时间:2018-06-22 21:36:38

标签: assembly x86

我正在尝试了解PTRSize Directive的上下文中的工作方式,我很困惑/不确定我的理解是否正确。

让我以here中的3条陈述为例,并尝试解释我认为这里正在发生的事情。语句如下(x86,Intel语法):

mov BYTE PTR [ebx], 2
; Move 2 into the single byte at the address stored in EBX. 

mov WORD PTR [ebx], 2
; Move the 16-bit integer representation of 2 into the 2 bytes starting at the address in EBX. 

mov DWORD PTR [ebx], 2     
; Move the 32-bit integer representation of 2 into the 4 bytes starting at the address in EBX. 

对于mov BYTE PTR [ebx], 2,我认为这是正在发生的事情:

BYTE (8 Bits) → [2] (that is 2h, or am I wrong?)

连续:

WORD (16 Bits = BYTE + BYTE) → [0][2] (that is 0002h, or am I wrong?)
DWORD (32 Bits = WORD + WORD) → [0][0][0][2] (that is 0000,0002h, or am I wrong?)

我选择的结尾是

  

从EBX中的地址开始。

因为我认为这是x86中的小尾数格式。

我的理解正确吗?谢谢。

1 个答案:

答案 0 :(得分:1)

是的,看起来很正确。

基本单位为1个字节。 4位十六进制数字只是使用ASCII文本中的数字表示方式的结果。字节存储(mov r/m8, imm8)的机器代码为opcode, modrm, imm8,因此在由汇编器创建的机器代码中,高4位中的0是显式的。

实际上,与其他大小相同,因为没有mov形式的符号扩展字节。汇编程序必须将imm32编码为02 00 00 00(因为x86机器代码中的立即数是低位字节序,与数据相同。)

查看反汇编(包括机器码的十六进制转储)可能会很有帮助。了解asm的关键一件事是,它只是用于表达机器代码的文本语法。真正重要的是机器可以做什么。一旦您知道您将了解为什么存在某些限制。例如,[ebx + edi*8]中的比例因子被编码为2位字段中的0..3移位计数,这就是为什么比例因子限制为1,2,4,8的原因。

存在用于描述同一机器代码的不同asm语法。在asm中,当寄存器操作数隐含dword ptr时,可以省去它,但是在机器码中,操作数的大小始终由操作码+前缀确定。