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