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

时间:2017-07-22 21:50:38

标签: 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 contains the end address
PUSH [ESP + 08h] ;ESP + 08h contains the start address
CALL myProc

但是我不确定它是否会最终推送在地址ESP处找到的地址处找到的值以及在地址ESP + 04h处找到的地址处找到的值,或者它是否只是推送在地址处找到的地址ESP,以及在ESP + 04h发现的地址,因为这是解除引用。

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

总而言之,取消引用是否会返回存储在指定地址的值,即使该值为'是另一个地址?

由于

1 个答案:

答案 0 :(得分:3)

LEA加载"有效地址"。所以你要推两个地址。

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

        MOV     EAX,[ESP]
        MOV     EDX,[ESP + 4]
        MOV     EAX,[EAX]
        MOV     EDX,[EDX]
        PUSH    EDX
        PUSH    EAX 
        CALL    SomeProc

你在做什么并不能做你想做的事:

        PUSH    [ESP]

只会再次将堆栈顶部的值(地址)推送,换句话说,它只是复制地址。它没有双重间接,即它不会得到地址的内容,这显然是你想要的。