【问题标题】:Pass a memory address by register通过寄存器传递内存地址
【发布时间】:2013-11-27 23:13:09
【问题描述】:

如何将内存地址从寄存器传递给其他?我的以下例程从堆栈接收字符串内存地址(是的,这是必要的),然后尝试放入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

更新:我更新了从堆栈中推送和弹出参数的方式。改为使用 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

【问题讨论】:

    标签: assembly stack parameter-passing 68000 easy68k


    【解决方案1】:

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

        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 指令之后添加:

        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
    

    别忘了SIMHALTPRINTS 之前。你不想从你的主代码掉入你的子程序。

    哦,你可能已经发现了:

            PEA.L  T(PC)
    

    确实可以代替

            PEA.L  T
    

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

    【讨论】:

    • 是的。谢谢。我解决了这个问题,但它看起来像是问题的一半。它仍然无法正常工作。
    • 不应该MOVE.L T,D0LEA T,D0 吗?你想要T 的地址,而不是T 的内容。
    • 移动的工作方式与当前代码相同。 LEA T,D0 返回错误:ERROR: Invalid addressing mode
    • 我检查了手册以确保。 LEA 指令仅适用于 AN 寄存器。
    • 抱歉,我的 68K 生锈了。我下载了 EASy68K 并在上面适当地编辑了我的答案。
    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多