你好我想在intel32上拿起程序集,
我的完整问题是,这是什么意思?
mov dword ptr [esp+18h], 0AH
我特别不参与[esp + 18h]
答案 0 :(得分:2)
这意味着在地址0AH
的内存中存储双字(x86上的4个字节)值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
您将拥有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
。
答案 1 :(得分:2)
[ESP+18h]
中的括号表示MOV
的目的地是ESP + 18h的记忆位置。例如,如果ESP的值为10000000h,那么您的目标是内存位置10000018h。
DWORD
定义用于移动操作的内存位置的“大小”。在您的示例中,您将0000000Ah(4个字节)移动到内存位置ESP + 18h。由于0Ah
是立即值,因此如果不使用DWORD
,WORD
,BYTE
或其他类似限定符,则无法确定其大小。
英特尔惯例是定义目标内存位置的“大小”而不是直接本身(例如MOV DWORD PTR [ESP+18h], 0Ah
vs MOV [ESP+18h], dword 0Ah
)。
答案 2 :(得分:1)
这可能是指用作变量位置的内存位置。 [esp + 18h]是C中指针(*)的引用.ESP代表扩展堆栈指针。 ESP寄存器包含存储值的存储器表的地址。您取值为ESP并添加18h偏移量以查找要存储值0AH的内存地址的最终位置。
答案 3 :(得分:0)
mov dword ptr [esp+18h], 0AH
我几天前问过这个问题:
我使用的是Intel ia-32,所以DWORD对我来说意味着4个字节或32位
读取[..]符号为;使用此处的值作为包含数据的内存中的位置地址。
在MOV操作数的情况下,当与dword ptr一起使用时,它意味着在内存中访问该位置并引用存储在那里的值。我提出这一点是因为如果使用LEA操作数而不是结果可能会有所不同。
所以上面显示的代码表示,使用值esp + 18h作为内存中的地址并添加10; 10因为A是十六进制的10。