dword 操作数在汇编中有什么作用

lay*_*cat 2 x86 assembly opcode

你好,我正在尝试在 intel32 上安装程序集,

我的完整问题是,这是什么意思?

mov dword ptr [esp+18h], 0AH
Run Code Online (Sandbox Code Playgroud)

我特别不明白 [esp+18h] 的部分

vhu*_*vhu 8

括号中的[ESP+18h]意思MOV是 ESP+18h 处的内存位置。例如,如果 ESP 的值为 10000000h,那么您的目标是内存位置 10000018h。

DWORD定义用于移动操作的内存位置的“大小”。在您的示例中,您会将 0000000Ah(4 个字节)移动到内存位置 ESP+18h。作为0Ah立即数,如果不使用、或其他类似限定符DWORD,则无法确定其大小。WORDBYTE

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


Mic*_*ael 5

这意味着将双字(x86 上的 4 个字节)值0AH(与 相同0000000AH)存储在内存中的地址 处esp+18h。例如,如果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
Run Code Online (Sandbox Code Playgroud)

之后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
Run Code Online (Sandbox Code Playgroud)

mov [esp+18h], 0AH因为0AH不能从指令中推断出立即数 ( )的大小,所以仅仅写入会产生歧义。因此dword ptr添加来告诉汇编器内存操作数是 a dword,因此立即数也应该是 a dword