assembly - 汇编程序如何将标签转换为地址

标签 assembly label

首先,我是在移动设备上写这篇文章,所以请原谅拼写错误。

我正在用 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/

相关文章:

c++ - 如何将 __asm block 转换为基于字符串的 asm(与 G++ 兼容)?

c - ARM Cortex 上的 super 简单 Tasker

c - Arm 上的内部函数实现

C#加载文件按钮标签

ClearCase:查找仅具有一个特定标签而不是更多标签的文件

r - 将计数作为标签添加到 geom_count 中的点

r - 在二分网络图中使用不同的字体作为顶点标签(Rstudio)

linux - 获取系统(主机)名称的程序集/Shellcode

汇编 (x86) 循环段错误

python - 标签上的 Tkinter 透明度