汇编调用指令如何编译成机器代码?标签会发生什么?标签不再存在时,机器代码调用指令如何引用特定功能?
我知道编译后的代码中的标签已替换为函数的地址。
但是,仅在程序运行后,该功能的指令才会加载到内存中。那么内部的机器代码如何指示在编译之前通过标签指示的特定功能?
[请以简单易懂的方式回答我,可能还附有实际例子。
汇编语言标签是编译时的汇编时和链接时的构造—在汇编和/或链接期间,这些标签被赋予一个内存地址,有时是绝对地址,但通常是从开始时的相对地址。标签所在的部分。
标签(以及从符号/标签名称到地址或偏移量的映射)在机器代码中被省略-当今的处理器不了解或看不到机器代码中的汇编标签。
在汇编语言中,调用指令以及if-then,while等的分支指令将分支目标作为其操作数之一。对于大多数这些指令,在机器代码中,操作数被编码为pc相对偏移量,并作为机器代码指令的操作数存储在立即数字段中。]
请参见pc-relative addressing mode。
立即数中相对于pc的偏移量由硬件使用类似于指令地址+立即数的公式由硬件恢复为绝对地址:
pc 下一个周期
:= pc 当前分支指令 +立即数*标度+偏差。CPU Scale Bias ------------------- x86 1 0 MIPS 4 4 RISC V 2 0
汇编器/链接器使用相同的公式,尽管可以立即解决,但有效地逆转了此计算:
偏移量=(标签目标
-pc 当前分支指令-偏差)/比例尺然后将此偏移量编码在分支或调用指令的立即数字段中。