代码如下:
;NASM
section .data
a dw 0xDEAD
section .text
...
mov eax, dword [a + 1]
; eax now equals 0xDE
...
那么,这是如何工作的呢?汇编语言知道,如果我移动的字节比定义的多,那么它只会在更高的位上加零?或者这段代码只为我工作,通常它是未定义的行为或诸如此类的东西?
发布于 2019-03-14 22:41:05
即使你的计算机变成了一片冒烟的废墟,那也是为汇编而“定义”的。mov eax, dword [a + 1]
中的“类型转换”dword
只是通知汇编器您知道自己在做什么,并且不想收到警告或错误。在目标文件中,类型消失了,处理器不知道您移动的字节数比定义的多。
处理器从地址a+1读取4个字节,并且存在随机或非随机的值DE 00 00 00
。这些零是怎么到那里的无关紧要。可能是NASM将文本段对齐,也可能是操作系统为数据段请求了一整页(4096字节)并用零填充了其余部分,也可能是文本段以零开始,因为入口点在后面。程序的行为也有可能在某一时刻随机改变。
TLDR:不要这样做!
发布于 2019-03-15 16:17:28
a dw 0xDEAD
告知汇编程序存储2个字节(DW -定义字(16位),btw - DB =8位,DD=32bit)并使用a
指向它。因为(我敢打赌)你使用的是x86-64机器,所以它是“小端”的,这意味着它首先存储从最低有效字节开始的多字节值,所以在内存中,你的0xDEAD
值将像这样存储:首先是0xAD
,然后是0xDE
。由于您的数据段肯定填充为16字节的倍数(例如),因此它很可能是用零填充的。现在,如果我们假设你的数据段是16个字节-前2个定义你的a
变量-其余的将是零。
现在数据段看起来像这样(假设0填充到16字节)(不带0x前缀的十六进制值):
AD, DE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
^
\__ (a+1) points here at DE
通过编写dword ptr [a + 1]
,您告诉汇编器以从地址a+1
抓取dword
(4字节)的方式对此类机器代码指令进行编码。这些将是字节: DE,0,0,0,因为(正如我前面所说的) x86是低端的,如果读取为4字节值,这4个字节意味着0x00000DE
,因此EAX等于这个值。
当然,您的数据段可能不是16字节,但可能是整个页面的长度,但这是没有意义的。
https://stackoverflow.com/questions/55171752
复制相似问题