现在我正在编写从内存中间开始的bootloader,但在完成之后我需要转到主应用程序,想要尝试jmp 0x00
,但我的芯片不支持{{1}我应该如何启动主应用程序?
答案 0 :(得分:4)
我会使用RJMP
:
相对跳转到PC内的地址 - 2K +1和PC + 2K(字)。在 汇编程序使用标签代替相对操作数。
例如:
entry:
rjmp reset
.org 512
reset:
rjmp foo
.org 3072
foo:
rjmp entry
顺便说一下,还有其他一些跳转指令(RJMP,IJMP,RCALL,ICALL,CALL,RET,RETI等)。请参阅this relevant discussion。
答案 1 :(得分:3)
好好看一下RET
指令。它返回到上一个位置,因此您可以尝试:
push 0x00
push 0x00
ret
这应该有效,因为在进入任何功能时,您会推送当前位置,而RET
会让您返回。
据我所知,ATmege8有16位地址线,但如果我不对,你可能需要更多push 0x00
答案 2 :(得分:3)
为什么不简单地使用IJMP?
将Z设置为0x00并使用IJMP。可能比2xpush和ret
更快EOR R30, R30 ; clear ZL
EOR R31, R31 ; clear ZH
IJMP ; set PC to Z
应为4个周期和3个指令字(6字节程序存储器)