根据doc1022,p。 17(AVR汇编器用户指南):
用户定义的标签,在其所在的位置给出位置计数器的值 出现。
我的问题是,在jmp
和rjmp
指令中使用标签时,操作码会涉及什么,因为标签实际上是标签出现处的位置计数器的值?其次,如果有一个官方(或非官方)文件回答我的问题,你知道我在哪里可以找到它吗?
由于
答案 0 :(得分:1)
汇编程序使用跳转指令的正确编码,该指令跳转到作为操作数给出的标签。也就是说,在执行指令后,PC的值将等于标签的地址。对于RJMP
指令,这意味着汇编器不直接在编码指令中使用标签的地址,而是将其编码为常量操作数k
,其中k
求解等式label = PC + k + 1
。
我不知道这是否在任何官方文件中明确说明,但这是所有装配工的工作方式。否则它会非常愚蠢。特别是如果AVR汇编程序没有以这种方式工作,AVR Assembler Guide的4.3节中给出的以下示例实际上将是无限循环:
test: rjmp test ; Infinite loop (Instruction)
答案 1 :(得分:0)
标签出现在汇编代码中,但必须将汇编代码转换为要在设备上运行的机器指令。
这句话的意思是,在处理汇编文件时,jmp
指令中的标签将替换为标签后面的指令的地址。在编译过程中会发现地址本身,因为整理了指令。
如果要查看生成的实际机器代码,可以查看avr-gcc生成的intel .hex
文件。有一个wikipedia entry可以帮助您解释英特尔hex文件格式。
根据OP的评论进行编辑:
对于rjmp
,提供的数字由编译器通过获取标签后面的指令地址并减去rjmp
指令的地址来计算。请注意,rjmp
仅在跳转足够小时才有效,而jmp
可以转到任何地址。
如果您需要描述该过程的实际文档,则需要研究您正在使用的编译器。可能没有这样的文档准确解释你想要什么,但源代码可用于avr-gcc。
请注意,大多数汇编代码实际上是由编译器自己在处理高级语言代码(如C)时生成的。jmp
与rjmp
的选择以及如何计算指令的编号甚至可以依赖于编译器开关。使用-O3
或-Os
进行编译会得到不同的结果汇编代码。