我为我的程序分配了一个基本缓冲区:
.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在堆栈上找到的地址。
总而言之,取消引用仅是否会返回存储在指定地址的值,即使该值为'是另一个地址?
由于
答案 0 :(得分:3)
LEA加载"有效地址"。所以你要推两个地址。
要从这些地址获取数据并推送它们,您可以执行以下操作:
MOV EAX,[ESP]
MOV EDX,[ESP + 4]
MOV EAX,[EAX]
MOV EDX,[EDX]
PUSH EDX
PUSH EAX
CALL SomeProc
你在做什么并不能做你想做的事:
PUSH [ESP]
只会再次将堆栈顶部的值(地址)推送,换句话说,它只是复制地址。它没有双重间接,即它不会得到地址的内容,这显然是你想要的。