masm x86 assembly *仅* return 解引用存储在给定地址的值

masm x86 assembly does a dereference *only* return the value being stored at a given address

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

.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 找到,因为取消引用。

对于我的情况,我需要能够 're-push' 在 ESP 找到的地址,以及在 ESP + 04h 找到的地址到堆栈上。

总而言之,即使 'value' 是另一个地址,取消引用是否仅 return 存储在给定地址的值?

谢谢

LEA 加载 "effective address"。所以你在推送两个地址。

要从这些地址获取数据并推送它们,您可以这样做:

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

你所做的与你想做的不一样:

        PUSH    [ESP]

将简单地将值(地址)再次压入栈顶,换句话说,它只是重复地址。它不做双重间接寻址,即它不会获取地址的内容,这显然是你想要的。