首先,我是在移动设备上写这篇文章,所以请原谅拼写错误。
我正在用 C 编写一个汇编程序,我了解如何汇编基本的汇编指令和汇编程序宏,但标签确实让我陷入困境。
在下面的代码中说,它只是将 A 寄存器递增 10 次:
LDX #$00
label:
INC
INX
CPX #$0A
BNE label
汇编程序如何知道label:的地址?又是通过什么机制将BNE指令中的标号关联到循环前的标号定义?
除此之外,假设在循环中触发了硬件中断(汇编程序不知道,因为它发生在运行时)。 PC 会改变,因此中断服务程序中的任何标签都将位于完全不同的地址,并且因为大多数 RISC 处理器使用 PC 相对寻址,这会改变标签地址。
另请注意,如何正确粘贴代码,使其不会像现在这样出现在一行中?
最佳答案
总体概念比较简单。
如果标 checkout 现在引用之前,就像在您的示例中那样,汇编程序会在表中记录标签名称和当前指令指针以供以后引用。在汇编器中,当前指令指针将与当前代码块相关联——链接器负责建立已完成程序的整体内存布局,从而建立与标签关联的真实 IP。跳转指令在表中查找要跳转到的地址,如果该地址是绝对地址,还需要注意该地址必须在链接期间固定以指向真实(非段相关)地址。
如果跳转发生在标签之前,它会稍微复杂一点,但不会太多:
汇编器在表中记录对标签名称的引用,并发出带有虚拟地址的跳转。稍后,当遇到标签定义并因此知道指令指针时,汇编程序会遍历该标签的引用表并在 - 现在已知 - 地址中进行修补。
-
中断处理程序必须保留所有状态,因此这些与上述内容无关。
关于assembly - 汇编程序如何将标签转换为地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26803922/