【发布时间】: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,汇编器将如何跟踪地址?
-
您的汇编器(或链接器,如果您想编写一个单独的链接器)将必须跟踪它已输出/将输出多少字节(代码和数据)。基于此以及程序/部分的定义来源,它可以确定标签的运行时地址是什么。