Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编程序如何将标签转换为地址_Assembly_Labels - Fatal编程技术网

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

Assembly 汇编程序如何将标签转换为地址,assembly,labels,Assembly,Labels,首先,我是用移动设备写的,请原谅我的拼写错误 我正在用C写一个汇编程序,我知道如何汇编基本的汇编指令和汇编宏,但标签真的让我卡住了 在以下代码中,只需将A寄存器的值增加10倍: LDX #$00 label: INC INX CPX #$0A BNE label 汇编程序如何知道标签的地址:?它使用什么机制将BNE指令中的标签与循环之前的标签定义相关联 除此之外,假设硬件中断是在循环中触发的(这对于汇编程序来说是未知的,因为它发生在运行时)。PC会发生变化,因此中断服务例程中的任何标签都将

首先,我是用移动设备写的,请原谅我的拼写错误

我正在用C写一个汇编程序,我知道如何汇编基本的汇编指令和汇编宏,但标签真的让我卡住了

在以下代码中,只需将A寄存器的值增加10倍:

LDX #$00

label:

INC
INX
CPX #$0A
BNE label
汇编程序如何知道标签的地址:?它使用什么机制将BNE指令中的标签与循环之前的标签定义相关联

除此之外,假设硬件中断是在循环中触发的(这对于汇编程序来说是未知的,因为它发生在运行时)。PC会发生变化,因此中断服务例程中的任何标签都将位于完全不同的地址,因为大多数RISC处理器使用PC相对寻址,这将改变标签地址


另外,作为旁注,如何正确粘贴代码,使其不会像现在一样显示在一行上?

一般概念相对简单

如果标签在引用之前,就像在您的示例中一样,汇编程序会将标签名和当前指令指针一起记录在一个表中,以供以后参考。在汇编程序中,当前的指令指针将与当前的代码块相关——链接器负责建立完成程序的整体内存布局,从而建立与标签相关的真实IP。跳转指令在表中查找要跳转到的地址,如果地址是绝对地址,还应注意,在链接到实际地址(而不是段相对)的过程中,地址必须固定

如果跳转发生在标签之前,则会稍微复杂一些,但不会太多:

Assembler将对标签名称的引用记录在表中,并发出带有虚拟地址的跳转。稍后,当遇到标签定义并且因此知道指令指针时,汇编程序将遍历该标签的引用表以及现在已知地址中的补丁

-


中断处理程序必须保留所有状态,因此这些状态与上述内容无关。

您似乎对这里的一些基本知识感到相当困惑。中断已经发生、被服务和从中返回的事实对于该代码应该是完全透明的(假设中断服务例程表现良好)。代码没有以任何方式移动,所有的地址都是相同的。对于代码块,突出显示代码块,然后点击编辑器顶部的
{}
按钮(或者我认为是CTRL-K),也许我的措辞是错误的。如果我为不同的中断向量编写具有多个例程的ISR,汇编器如何跟踪地址?您的汇编器(或链接器,如果您想编写单独的链接器)必须跟踪它已输出/将输出的字节数(代码和数据)。基于这一点和程序/节的定义来源,它可以确定标签的运行时地址。这个答案对我很有帮助,谢谢。我正在Arduino环境中修补ASM,并一直在研究位置计数器的作用。请您详细说明一下位置计数器在整个过程中的作用好吗?