首页 > 解决方案 > 如果我将定义为字节的字值大小移动到 32 位寄存器,就好像它是 dword 定义的一样,会发生什么?

问题描述

这是代码:

;NASM

section .data
a dw 0xDEAD

section .text 
...
mov eax, dword [a + 1]
; eax now equals 0xDE
...

那么,这是如何工作的呢?大会知道,如果我移动的字节数比定义的多,那么它只会在高位添加零?或者可能是这段代码对我有用,通常是未定义的行为或类似的东西?

标签: assemblyx86

解决方案


a dw 0xDEAD

告诉汇编器存储 2 个字节(DW - 定义字(16 位),顺便说一句 - DB = 8 位,DD = 32 位)并用于a指向它。由于(我敢打赌)您使用的是 x86-64 机器,因此它是“小端序”,这意味着它首先存储从最低有效字节开始的多字节值,因此在内存中您的0xDEAD值将像这样存储:0xAD首先,0xDE下一个。由于您的数据段肯定会被填充为 16 个字节的倍数(例如),因此它可能会填充零。现在,如果我们假设您的数据段是 16 个字节 - 前 2 个定义您的a变量 - 其余的将为零。

现在数据段看起来像这样(假设零填充到 16 个字节)(没有 0x 前缀的十六进制值):

AD, DE, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0
    ^
     \__ (a+1) points here at DE

通过编写,您告诉您的汇编程序以从 address 中获取(4 个字节)dword ptr [a + 1]的方式对此类机器代码指令进行编码。这些将是字节: DE, 0, 0, 0 因为(正如我之前所说)x86 是小端,如果读取为 4 字节值意味着这 4 个字节,因此 EAX 等于该值。dworda+10x00000DE

当然,您的数据段可能不是 16 字节,但可能是整页长度,但没有意义。


推荐阅读