AVR汇编程序标签

时间:2014-11-22 18:39:19

标签: assembly avr

根据doc1022,p。 17(AVR汇编器用户指南):

  

用户定义的标签,在其所在的位置给出位置计数器的值   出现。

我的问题是,在jmprjmp指令中使用标签时,操作码会涉及什么,因为标签实际上是标签出现处的位置计数器的值?其次,如果有一个官方(或非官方)文件回答我的问题,你知道我在哪里可以找到它吗?

由于

2 个答案:

答案 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)时生成的。jmprjmp的选择以及如何计算指令的编号甚至可以依赖于编译器开关。使用-O3-Os进行编译会得到不同的结果汇编代码。