汇编中的dword操作数是什么?

5

你好,我正在尝试学习Intel32汇编语言。

我的问题是:这句话是什么意思?

mov dword ptr [esp+18h], 0AH

我特别不理解[esp+18h]这部分。


你考虑查阅文档了吗? - user207421
此问题似乎不适合,因为提问者没有进行任何研究。 - user207421
我从阅读http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html?iid=tech_vt_tech+64-32_manuals的文档中找到了答案。我怀疑这不是大多数人感兴趣的内容。 - laycat
1
问题是,是否准备好经历它。很高兴看到你最终做到了。这只意味着一件事:双字。 - user207421
3个回答

11

[ESP+18h]中的括号表示MOV的目标是存储在ESP+18h内存位置中的值。例如,如果ESP的值为10000000h,则您的目标是内存位置10000018h。

DWORD定义了移动操作使用的内存位置的“大小”。在您的示例中,您要将0000000Ah(4个字节)移动到内存位置ESP + 18h中。由于0Ah是即时值,因此无法确定其大小,除非使用DWORDWORDBYTE或其他类似的限定词。

英特尔的惯例是定义目标内存位置的“大小”,而不是即时值本身(例如,MOV DWORD PTR [ESP+18h], 0AhMOV [ESP+18h], dword 0Ah)。


7
这意味着在地址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


2

这很可能是指正在用作变量位置的内存位置。[esp+18h]类似于C语言中的指针(*)。ESP代表扩展堆栈指针。ESP寄存器包含一个指向存储值的内存表的地址。您将ESP的值加上18h偏移量以找到要存储值0AH的最终内存地址位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接