如何将寄存器中的存储器地址传递给其他寄存器?我的以下例程从堆栈接收字符串内存地址(是的,这是必要的),然后尝试放入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
UPDATE:我更新了参数被推送和从堆栈中加载的方式。更改为使用看起来像我想要的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
答案 0 :(得分:2)
要正确地将参数放入堆栈,您需要执行以下操作:
LEA T, A0
MOVE.L A0, D0
MOVE.L D0, -(SP)
或
PEA.L T
要正确地获取参数 off ,您实际上并不想在被调用的函数中弹出它。那是因为BSR
推送了一个返回地址。相反,您需要使用索引寻址,如下所示:
MOVE.L (4,SP), A1 ; read argument from stack, overlooking return address
然后最重要的是,你需要在调用者(而不是被调用者)中从堆栈中“弹出”参数,方法是在BSR
指令后添加:< / p>
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
之前的PRINTS
。您不希望从主代码落入子例程。
哦,你可能已经发现了:
PEA.L T(PC)
代替
起作用 PEA.L T
主要区别在于代码大小。第一个使用PC相对寻址生成地址,第二个使用目标代码存储完整的32位地址。