Assembly 通过寄存器传递内存地址

Assembly 通过寄存器传递内存地址,assembly,stack,parameter-passing,68000,easy68k,Assembly,Stack,Parameter Passing,68000,Easy68k,如何将内存地址从寄存器传递到其他寄存器?我下面的例程从堆栈接收字符串内存地址(是的,这是必要的),然后尝试将其放入D1寄存器中,但它不工作,当我尝试运行时,模拟器崩溃(或进入无限循环?) 代码: 更新:我更新了从堆栈中推送和弹出参数的方式。更改为使用PEA指令,该指令看起来像是完全按照我的意愿执行,但仍然无法工作 START ORG $1000 PEA T(PC) *MOVE.L D0,-(SP) BSR PRINTS ADDQ.L

如何将内存地址从寄存器传递到其他寄存器?我下面的例程从堆栈接收字符串内存地址(是的,这是必要的),然后尝试将其放入
D1
寄存器中,但它不工作,当我尝试运行时,模拟器崩溃(或进入无限循环?)

代码:

更新:我更新了从堆栈中推送和弹出参数的方式。更改为使用
PEA
指令,该指令看起来像是完全按照我的意愿执行,但仍然无法工作

START ORG $1000
        PEA T(PC)
        *MOVE.L D0,-(SP)
        BSR PRINTS
        ADDQ.L #4,SP

    MOVE #9,D0       
        TRAP #15 

PRINTS:        
        MOVE 4(SP),A1
        MOVE #14,D0
        TRAP #15
        RTS

要将参数正确地放入堆栈,您需要执行以下操作之一:

    LEA    T,  A0
    MOVE.L A0, D0
    MOVE.L D0, -(SP)

要正确地将参数从堆栈中取出,实际上不希望将其弹出到被调用的函数中。这是因为
BSR
推送一个返回地址。相反,您需要使用索引寻址,如下所示:

    MOVE.L (4,SP), A1  ; read argument from stack, overlooking return address
最后,您需要通过在
BSR
指令之后添加该参数,从调用者(而不是被调用者)的堆栈中“弹出”参数:

    ADDA.L #4, SP      ; remove argument from stack.
生成的程序(我在EASy68K中测试过)如下所示:

        ORG    $1000
START:  
        PEA.L  T           ; push argument to stack
        BSR    PRINTS      ; call PRINTS; also pushes return address on stack
        ADDA.L #4, SP      ; remove argument from stack.
        SIMHALT

PRINTS:
        MOVE.L (4,SP), A1  ; read argument from stack, overlooking return address
        MOVE.L #14, D0
        TRAP   #15
        RTS

T       DC.B   'HELLO', 0

        END    START        ; last line of source
不要忘记,
打印之前的
SIMHALT
。您不想从主代码落入子例程

哦,正如你可能已经发现的:

        PEA.L  T(PC)
代替

        PEA.L  T

主要区别在于代码大小。第一个使用PC相对寻址来生成地址,而第二个将完整的32位地址存储在目标代码中。

Yes。谢谢我解决了这个问题,但看起来问题已经解决了一半。它仍然不工作。不应该移动。L t,D0
leat,D0
?您想要的是
T
的地址,而不是
T
的内容。移动的方式与当前代码相同。
leat,D0
返回一个错误:
error:Invalid addressing mode
我查看了手册以确定。
LEA
指令仅适用于
AN
寄存器。很抱歉,我的68K已生锈。我下载了EASy68K,并对上面的答案进行了适当的编辑。
        PEA.L  T(PC)
        PEA.L  T