AVR(atmega8515)rjmp没有相对跳跃

时间:2017-05-22 16:24:38

标签: avr

  

相对跳转到PC内的地址 - 2K +1和PC + 2K(字)。在汇编程序中,使用标签而不是相对操作数。对于程序存储器不超过4K字(8K字节)的AVR微控制器,该指令可以从每个地址位置寻址整个存储器。

基于http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_RJMP.htmlrjmp命令应相对更改PC寄存器。但我的下面的代码跳转到确切的地址(在本例中为地址0x00的ldi temp, low(RAMEND)命令)

.include "m8515def.inc"

.def temp = r16


STACK_INIT:
    ; init stack pointer
    ldi temp, low(RAMEND)
    out SPL, temp
    ldi temp, high(RAMEND)
    out SPH, temp

TES:
    rjmp 0x00

END:
    rjmp END

我已尝试将rjmp命令更改为jmp,但atmega8515不支持该命令

我不知道是否因为配置或其他原因。我正在使用AVR Studio 4进行构建并运行我的程序。任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

这是预期的。为方便汇编语言程序员,rjmp操作采用绝对地址而不是相对地址。在实际编译二进制机器代码时,绝对地址将转换为相对地址,如果地址距离太远而无法跳转,则会收到错误。

顺便说一句,您可以在操作数中使用$符号。它是当前指令的地址。因此rjmp $+2之类的东西会跳过下一条指令后的两个字节。