ATmega8不支持JMP指令

时间:2014-03-01 10:12:59

标签: c++ c assembly microcontroller avr

现在我正在编写从内存中间开始的bootloader,但在完成之后我需要转到主应用程序,想要尝试jmp 0x00,但我的芯片不支持{{1}我应该如何启动主应用程序?

3 个答案:

答案 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字节程序存储器)