x86 asm,解除引用的指针没有得到更新

时间:2012-12-02 06:37:49

标签: pointers assembly x86

这是我正在处理的程序的测试程序,我通过堆栈传递一些parm,其中一个是指针。当我尝试更改解除引用的指针的值时,不更新该变量。

_testProc proc
    push bp                             ;Save base pointer to stack
    mov bp, sp                          ;Set new base pointer
    sub sp, 4                           ;Allocate stack space for locals
    pusha                               ;Save registers to stack

    mov di, [bp + 08]                   ;Parm 3 - ptr to variable

    mov word ptr [di], 10   ; <---- Doesn't work. di contains an address, 
                            ;       but what it points at doesn't get updated

    popa                                ;Restore registers from stack
    mov sp, bp                          ;Remove local vars by restoring sp
    pop bp                              ;Restore base pointer from stack
    ret 6                               ;Return and also clean up parms on stack
_testProc endp

2 个答案:

答案 0 :(得分:3)

8086通过组合寄存器和索引寄存器的内容来产生和寻址;我将其显示为[SR,IR]。

您通过寄存器di更新正在更新[DS,DI]定义的位置;没有任何特殊前缀的mov指令默认使用DS寄存器。如果您将地址DI作为某个其他段(ES?SS?)的偏移量,那么您实际上是将错误的寄存器组合在一起以达到您想要的地址。

你的错误在于不清楚将“指针”传递给你的例程的惯例是什么。您定义的内容假设与DS相对偏移。

答案 1 :(得分:2)

您可以做的最好的事情就是尽快放弃16位分段代码! :)

如果失败了,就会有“远程数据”和“远指针”指向它。你的“proc”不会说它是近还是远 - 我假设在附近(或Parm3可能不在你认为它在堆栈上的位置......因为远返回地址是4个字节)。如果您想要更改的变量位于堆栈中,那么您可能会遇到更复杂的问题。至少mov word ptr ss:[di], 10。如果你需要处理本地或静态变量,我认为你需要一个远指针(4个字节,段和偏移量)来找到它。

我首先想到的是你说你试图改变一个解除引用指针的值,你不要“取消引用”它(据我所知)。从堆栈中获取值后尝试mov di, [di]。反正很容易尝试。 :)

如果所有其他方法都失败了,请告诉我们调用代码。 (并尽快进入32位代码!)