【问题标题】:AVR Assembler LabelsAVR 汇编器标签
【发布时间】:2014-11-22 18:39:18
【问题描述】:

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

用户定义的标签,它们在它们所在的位置被赋予位置计数器的值 出现。

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

谢谢

【问题讨论】:

  • 我不确定你的问题是什么。您是在问jmp 指令是如何编码的,还是在问jmp 指令跳转到哪里?
  • [1] 在“8 位 AVR 指令集”文档中,在 RJMP 下,执行的操作表示为:“PC ← PC + k + 1”,并说明了该操作的语法如:“RJMP k”。现在,如果我们认为标签为:==,RJMP 应该总是失败,因为在这种情况下,跳转的绝对地址被提供给 RJMP,而不是相对地址。所以我要问:在使用标签作为操作数的 rjmp 操作中,我猜不是提供它的实际值,而是完成了一些相对值(类似于“PC - someLabel”)。如果是这样,我在哪里可以获得相关的
  • 【2】官方文档?

标签: assembly avr


【解决方案1】:

汇编器使用跳转指令的正确编码,跳转到作为操作数给出的标签。即在指令执行后,PC 的值将等于标签的地址。对于RJMP 指令,这意味着汇编程序不直接在编码指令中使用标签的地址,而是将其编码为常量操作数k,其中k 求解方程label = PC + k + 1

我不知道这是否在任何官方文档中明确说明,但这是所有汇编程序的工作方式。不然就很傻了。特别是如果 AVR 汇编器不以这种方式工作,AVR Assembler Guide 第 4.3 节中给出的以下示例实际上不会是无限循环:

test: rjmp test ; Infinite loop (Instruction)

【讨论】:

  • 谢谢。实际上,我问这个问题的原因是,我的目标是使用一个标签,就好像它是“指向程序内存数组开头的指针”一样。那就是:我正在尝试做:如果(someArgument - someConstant)== 0,去someLabel。如果 (someArgument - someConstant) == N,则转到 (someLabel + N*someProgramMemorySpaceConstant)。我可以通过一个特定的指针寄存器来完成这项工作,但它被我程序中的另一个任务占用了。因此,如果我能准确了解 rjmp 的工作原理,我就能做到。
  • 您不能使用 rjmp 加载数据。当然,您可以将标签用作数据的索引,但如果您想读取数据,则必须将地址加载到指针寄存器集之一。
【解决方案2】:

标签出现在汇编代码中,但汇编代码必须转化为机器指令才能在设备上运行。

这句话的意思是,在处理汇编文件时,jmp 指令中的标签被替换为标签后面的指令地址。地址本身是在编译过程中在整理指令时发现的。

如果您想查看生成的实际机器代码,可以查看由 avr-gcc 生成的 intel .hex 文件。有一个wikipedia entry可以帮助你解释intel hex文件格式。

根据 OP 的评论进行编辑:

对于rjmp,提供的数字由编译器通过获取标签后面的指令地址并减去rjmp 指令的地址来计算。请注意,rjmp 仅在跳转足够小的情况下才有效,而jmp 可以转到任何地址。

如果您想要描述该过程的实际文档,则需要研究您正在使用的编译器。可能没有这样的文档准确地解释你想要什么,但源代码可用于 avr-gcc。

请注意,在处理 C 等高级语言代码时,大多数汇编代码实际上是由编译器自己生成的。jmprjmp 的选择以及如何计算赋予指令的数字甚至取决于编译器开关。使用-O3-Os 编译会得到不同的汇编代码。

【讨论】:

  • 谢谢。实际上,我想了解的是,将标签提供给 rjmp 指令时究竟会发生什么。 (请在此线程的初始帖子下查看我的 cmets)
  • 根据参考手册。现在,如果有人认为标签确实是某个常数(即等于标签出现位置的位置计数器的值),那么当我写“rjmp someLabel”并且如果它被解释为“rjmp someLabelsValue”时,那么我应该得到一个错误的执行,因为 someLabelsValue 是我要跳转的地方的绝对地址,而不是相对地址。所以这表明,在解释 rjmp 指令时
  • [2] 使用标签时,汇编器应将指令“rjmp someLabel”视为“rjmp someLabelsValue”而不是“rjmp ”。最后,我的问题是,使用标签的 rjmp 指令被这样解释的信息在哪里?
  • 实际上我现在正在使用汇编程序,所以问题不是关于编译器,而是关于汇编程序。
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2016-05-12
  • 1970-01-01
相关资源
最近更新 更多