首先,我是从移动设备上写的,所以请原谅拼写错误。
我正在用 C 编写一个汇编程序,我了解如何组装基本的汇编指令和汇编宏,标签真的让我卡住了。
在下面的代码中说,它只是将 A 寄存器递增 10 次:
LDX #$00
label:
INC
INX
CPX #$0A
BNE label
Run Code Online (Sandbox Code Playgroud)
汇编器如何知道标签的地址:?还有它使用什么机制将 BNE 指令中的标签与循环之前的标签定义相关联?
除此之外,假设在循环中触发了硬件中断(汇编程序不知道,因为它发生在运行时)。PC 会改变,因此中断服务程序中的任何标签都将处于完全不同的地址,并且因为大多数 RISC 处理器使用 PC 相对寻址,这会改变标签地址。
另外作为旁注,我如何正确粘贴代码,使其不像现在那样显示在一行上?
一般概念比较简单。
如果标签出现在引用之前,就像在您的示例中一样,汇编程序会将标签名称与当前指令指针一起记录在表中以供以后参考。在汇编程序中,当前指令指针将与当前代码块相关 - 链接器负责建立已完成程序的整体内存布局,从而建立与标签相关联的真实 IP。跳转指令在表中查找要跳转到的地址,如果地址是绝对地址,还要注意在链接期间必须修复地址以指向实际(非段相对)地址。
如果跳转发生在标签之前,它会更复杂一点但不多:
汇编器在表中记录对标签名称的引用,并发出一个带有虚拟地址的跳转。之后,当遇到标签定义并因此知道指令指针时,汇编器会检查对该标签的引用表,并在现在已知的地址中打补丁。
——
中断处理程序必须保留所有状态,因此它们与上述无关。