【问题标题】:How assemblers translate labels to addresses汇编程序如何将标签转换为地址
【发布时间】:2014-11-07 14:55:40
【问题描述】:

首先我是从移动设备上写的,所以请原谅拼写错误。

我正在用 C 编写一个汇编器,并且我了解如何汇编基本的汇编指令和汇编器宏,但标签真的让我卡住了。

在下面的代码中说,它只是将 A 寄存器增加 10 次:

LDX #$00

label:

INC
INX
CPX #$0A
BNE label

汇编器如何知道label:的地址?还有它使用什么机制将BNE指令中的标签与循环前的标签定义相关联?

除此之外,假设在循环中触发了硬件中断(汇编程序不知道,因为它发生在运行时)。 PC 会发生变化,因此中断服务程序中的任何标签都将位于完全不同的地址,并且由于大多数 RISC 处理器使用 PC 相对寻址,这将改变标签地址。

另外作为旁注,我如何正确粘贴代码,使其不会像现在那样显示在一行上?

【问题讨论】:

  • 您似乎对这里的一些基础知识感到困惑。中断发生、服务和返回的事实应该对这段代码完全透明(假设中断服务程序表现良好)。代码没有任何变化,所有地址都一样。
  • 对于代码块 - 突出显示代码块,然后点击编辑器顶部的{} 按钮(我认为是 CTRL-K)
  • 好吧,也许我用错了。如果我为不同的中断向量编写具​​有多个例程的 ISR,汇编器将如何跟踪地址?
  • 您的汇编器(或链接器,如果您想编写一个单独的链接器)将必须跟踪它已输出/将输出多少字节(代码和数据)。基于此以及程序/部分的定义来源,它可以确定标签的运行时地址是什么。

标签: assembly labels


【解决方案1】:

一般概念比较简单。

如果标签在引用之前,就像在您的示例中那样,汇编器将标签名称与当前指令指针一起记录在一个表中以供以后引用。在汇编器中,当前指令指针将与当前代码块相关 - 链接器负责建立已完成程序的整体内存布局,从而建立与标签关联的真实 IP。跳转指令在表中查找要跳转到的地址,如果地址是绝对地址,还要注意在链接期间必须修复该地址以指向真实(不是相对于段的)地址。

如果跳转发生在标签之前,它会更复杂但并不多:

汇编程序在表中记录对标签名称的引用,并发出带有虚拟地址的跳转。稍后,当遇到标签定义并且因此知道指令指针时,汇编器会遍历该标签的引用表并修补 - 现在已知 - 地址。

-

中断处理程序必须保留所有状态,因此与上述无关。

【讨论】:

  • 这个答案对我有帮助,谢谢。我正在 Arduino 环境中修改 ASM,并且一直在研究位置计数器的作用。您介意详细说明位置计数器在整个过程中的作用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2021-02-26
  • 2011-10-22
  • 2021-04-23
  • 2021-03-17
  • 2017-08-31
相关资源
最近更新 更多