Assembly 在Size指令的上下文中理解PTR

Assembly 在Size指令的上下文中理解PTR,assembly,x86,Assembly,X86,我试图理解PTR在Size指令的背景下是如何工作的,我很困惑/不确定我的理解是否正确 让我从下面的三个陈述中试着解释一下我认为这里发生了什么。语句如下(x86,英特尔语法): 所以对于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?

我试图理解
PTR
Size指令
的背景下是如何工作的,我很困惑/不确定我的理解是否正确

让我从下面的三个陈述中试着解释一下我认为这里发生了什么。语句如下(x86,英特尔语法):

所以对于
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中的little endian格式

我的理解正确吗?谢谢。

是的,看起来很正确

但基本单位是1字节。4位十六进制数字只是使用ASCII文本表示数字的方法的结果。字节存储()的机器码是
操作码、modrm、imm8
,因此高4位中的0在汇编程序创建的机器码中是显式的

实际上,其他大小也是一样的,因为没有任何形式的
mov
符号扩展一个字节。汇编器必须将imm32编码为
02 00
(因为x86机器代码中的立即数与数据一样是小尾数)

您可能会发现,查看包含机器代码的hextump的反汇编非常有用。了解asm的一个关键点是,它只是一种用于表示机器代码的文本语法。真正重要的是机器能做什么;一旦你知道了,你就会明白为什么存在某些限制。例如,
[ebx+edi*8]
中的比例因子被编码为2位字段中的0..3移位计数,这就是比例因子被限制为1,2,4,8的原因


不同的asm语法用于描述相同的机器代码。在asm中,如果寄存器操作数暗示了dword ptr,则可以省略它,但在机器码中,操作数大小始终由操作码+前缀决定。

为什么要将8位拆分为4+4,以及[0][2]是什么意思?一个字节是可在内存中寻址的基本单元,因此第一个
mov
将在
ebx
地址处向内存写入00000010位。从机器的角度来看,没有理由将其拆分为两个4位(半字节)。任何内存单元都包含8位,允许256个不同的值。(你也把小endian搞错了,但我很好奇,
[0][2]
首先,为了更好地理解你)。@Ped7g实际上这是一个错误,我按照我的意图更正了它。很好。是的,如果您想“查看”所有32位,您可以将32位“2”写为0000000 2h。汇编程序将文本源代码转换为机器代码后,只剩下32位(无格式信息),因此它们在源代码中都是相等的(2=2h=00002h…),您应该尝试选择最适合人类阅读的源代码,例如,使用位掩码非常适合六进制或二进制格式,但用“1920[像素]”初始化循环计数器可能最好用小数点。最后的机器代码总是二进制的,因为这是PC中唯一可用的东西。是的,我在
基本的是字节部分犯了一个错误,同样地更正了这个问题。
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?)