调用指令:编译为机器代码

问题描述 投票:0回答:1

汇编调用指令如何编译成机器代码?标签会发生什么?标签不再存在时,机器代码调用指令如何引用特定功能?

我知道编译后的代码中的标签已替换为函数的地址。

但是,仅在程序运行后,该功能的指令才会加载到内存中。那么内部的机器代码如何指示在编译之前通过标签指示的特定功能?

[请以简单易懂的方式回答我,可能还附有实际例子。

assembly machine-code
1个回答
0
投票

汇编语言标签是编译时的汇编时和链接时的构造—在汇编和/或链接期间,这些标签被赋予一个内存地址,有时是绝对地址,但通常是从开始时的相对地址。标签所在的部分。

标签(以及从符号/标签名称到地址或偏移量的映射)在机器代码中被省略-当今的处理器不了解或看不到机器代码中的汇编标签。

在汇编语言中,调用指令以及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 当前分支指令-偏差)/比例尺

然后将此偏移量编码在分支或调用指令的立即数字段中。

© www.soinside.com 2019 - 2024. All rights reserved.