通过寄存器传递存储器地址

问题描述 投票:3回答:1

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

码:

START ORG $1000


    MOVE.L T,D0
    MOVE.L D0,-(SP)
    BSR PRINTS



PRINTS:       
        MOVE.L D0,(SP)+
        MOVE.W D0,A1
        MOVE #14,D0
        TRAP #15
        RTS

T DC.B 'HELLO',0
    END START

更新:我更新了方法,因为参数被推送并从堆栈中弹出。改为使用qazxsw poi指令看起来像我想要的那样但它仍然不起作用。

PEA
assembly stack parameter-passing 68000 easy68k
1个回答
2
投票

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

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)

要正确地从堆栈中获取参数,您实际上并不想在被调用的函数中弹出它。那是因为 PEA.L T 推送了一个返回地址。相反,您需要使用索引寻址,如下所示:

BSR

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

BSR

生成的程序(我在EASy68K中测试过)看起来像这样:

    ADDA.L #4, SP      ; remove argument from stack.

并且不要忘记 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。您不希望从主代码落入子例程。

哦,你可能已经发现:

PRINTS

确实可以代替

        PEA.L  T(PC)

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

© www.soinside.com 2019 - 2024. All rights reserved.