你好,我正在尝试学习Intel32汇编语言。
我的问题是:这句话是什么意思?
mov dword ptr [esp+18h], 0AH
我特别不理解[esp+18h]这部分。
你好,我正在尝试学习Intel32汇编语言。
我的问题是:这句话是什么意思?
mov dword ptr [esp+18h], 0AH
我特别不理解[esp+18h]这部分。
[ESP+18h]
中的括号表示MOV
的目标是存储在ESP+18h内存位置中的值。例如,如果ESP的值为10000000h,则您的目标是内存位置10000018h。
DWORD
定义了移动操作使用的内存位置的“大小”。在您的示例中,您要将0000000Ah(4个字节)移动到内存位置ESP + 18h中。由于0Ah
是即时值,因此无法确定其大小,除非使用DWORD
,WORD
,BYTE
或其他类似的限定词。
英特尔的惯例是定义目标内存位置的“大小”,而不是即时值本身(例如,MOV DWORD PTR [ESP+18h], 0Ah
与MOV [ESP+18h], dword 0Ah
)。
esp+18h
的内存中存储双字(x86上的4个字节)数值0AH
(与0000000AH
相同)。例如,如果esp
包含值4
,并且内存内容如下:Address Contents
-----------------------------------------------------
0000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
mov dword ptr [esp+18h], 0AH
之后,你会得到如下结果:Address Contents
-----------------------------------------------------
0000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0010: 10 11 12 13 14 15 16 17 18 19 1A 1B 0A 00 00 00
只写 mov [esp+18h], 0AH
是不明确的,因为指令中无法推断立即数 (0AH
) 的大小。因此,加上 dword ptr
告诉汇编器内存操作数是一个 dword
,因此立即数也应该是一个 dword
。
这很可能是指正在用作变量位置的内存位置。[esp+18h]类似于C语言中的指针(*)。ESP代表扩展堆栈指针。ESP寄存器包含一个指向存储值的内存表的地址。您将ESP的值加上18h偏移量以找到要存储值0AH的最终内存地址位置。