相对跳转到PC内的地址 - 2K +1和PC + 2K(字)。在汇编程序中,使用标签而不是相对操作数。对于程序存储器不超过4K字(8K字节)的AVR微控制器,该指令可以从每个地址位置寻址整个存储器。
基于http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_RJMP.html,rjmp
命令应相对更改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进行构建并运行我的程序。任何人都可以解释一下吗?
答案 0 :(得分:1)
这是预期的。为方便汇编语言程序员,rjmp
操作采用绝对地址而不是相对地址。在实际编译二进制机器代码时,绝对地址将转换为相对地址,如果地址距离太远而无法跳转,则会收到错误。
顺便说一句,您可以在操作数中使用$
符号。它是当前指令的地址。因此rjmp $+2
之类的东西会跳过下一条指令后的两个字节。