Assembly masm x86程序集执行解引用*仅*返回存储在给定地址的值

Assembly masm x86程序集执行解引用*仅*返回存储在给定地址的值,assembly,x86,masm,Assembly,X86,Masm,我为我的程序分配了一个基本缓冲区: .DATA? buffer DWORD 01FFFh DUP(?) .CODE MOV ESI, OFFSET buffer 我想获取缓冲区中两个值的地址,并将它们推送到堆栈上,以便将来引用: LEA EAX, [ESI + 04h * 00h] LEA EBX, [ESI + 04h * 0Ah] PUSH EAX PUSH EBX 稍后我想调用一个过程,它以起始地址和结束地址作为参数,以ESP和ESP+04h作为参数 PUSH [ESP] ;ESP c

我为我的程序分配了一个基本缓冲区:

.DATA?
buffer DWORD 01FFFh DUP(?)
.CODE
MOV ESI, OFFSET buffer
我想获取缓冲区中两个值的地址,并将它们推送到堆栈上,以便将来引用:

LEA EAX, [ESI + 04h * 00h]
LEA EBX, [ESI + 04h * 0Ah]
PUSH EAX
PUSH EBX
稍后我想调用一个过程,它以起始地址和结束地址作为参数,以ESP和ESP+04h作为参数

PUSH [ESP] ;ESP contains the end address
PUSH [ESP + 08h] ;ESP + 08h contains the start address
CALL myProc
但是,我不确定它是否会最终推送在地址ESP处找到的地址的值和在地址ESP+04h处找到的地址的值,或者它是否会因为取消引用而推送在ESP处找到的地址和在ESP+04h处找到的地址

对于我的情况,我需要能够“重新推送”在ESP上找到的地址,以及在ESP+04h上找到的地址到堆栈上

总之,即使“值”是另一个地址,解引用是否只返回存储在给定地址的值

谢谢

LEA加载“有效地址”。所以你推了两个地址

要从这些地址获取数据并推送它们,您可以执行以下操作:

        MOV     EAX,[ESP]
        MOV     EDX,[ESP + 4]
        MOV     EAX,[EAX]
        MOV     EDX,[EDX]
        PUSH    EDX
        PUSH    EAX 
        CALL    SomeProc
你所做的并不是你想要的:

        PUSH    [ESP]
只需将值(地址)再次推送到堆栈顶部,换句话说,它只是复制地址。它不会执行双重间接寻址,即它不会获取地址的内容,这显然是您想要的。

LEA加载“有效地址”。所以你推了两个地址

要从这些地址获取数据并推送它们,您可以执行以下操作:

        MOV     EAX,[ESP]
        MOV     EDX,[ESP + 4]
        MOV     EAX,[EAX]
        MOV     EDX,[EDX]
        PUSH    EDX
        PUSH    EAX 
        CALL    SomeProc
你所做的并不是你想要的:

        PUSH    [ESP]

只需将值(地址)再次推送到堆栈顶部,换句话说,它只是复制地址。它不会进行双重间接寻址,也就是说,它不会获取地址的内容,这显然是您想要的。

BTW,在第一次
push[esp]
之后,esp会进行调整以适应新推送的值,因此下一条指令中的
[esp+4]
实际上是指向原始
[esp]
的第一个
按钮
。这就是为什么在过程序言中将
ebp
初始化为“stackframe”指针的原因:
mov ebp,esp
,然后进一步代码中的
[ebp+4]
将始终以相同的堆栈内存为目标,即使您执行了额外的
推送/pop
(只要您不修改
ebp
)。如果你坚持使用
esp
,你必须在每次
esp
更改后动态调整偏移量,即:
push[esp]
push[esp+8]
是的,我意识到刚才回头看我的代码,因为推新的东西也会改变esp指向的东西!看起来我也应该在上面的代码示例中更改同样的内容。感谢您的提醒,在第一次
推送[esp]
后,esp将进行调整以适应新推送的值,因此下一条指令中的
[esp+4]
实际上指向第一次
推送的原始
[esp]
。这就是为什么在过程序言中将
ebp
初始化为“stackframe”指针的原因:
mov ebp,esp
,然后进一步代码中的
[ebp+4]
将始终以相同的堆栈内存为目标,即使您执行了额外的
推送/pop
(只要您不修改
ebp
)。如果你坚持使用
esp
,你必须在每次
esp
更改后动态调整偏移量,即:
push[esp]
push[esp+8]
是的,我意识到刚才回头看我的代码,因为推新的东西也会改变esp指向的东西!看起来我也应该在上面的代码示例中更改同样的内容。谢谢你的提醒