gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:33:29 24 4
gpt4 key购买 nike

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com