Assembler生成的可重定位机器代码的用途是什么?为什么之后它会被转换成绝对的?

时间:2017-09-04 15:03:51

标签: assembly architecture compiler-construction machine-language

Assembler生成的可重定位机器代码的用途是什么?如果生成然后使用获取可重定位的机器代码将其转换为绝对代码?

我看了这个视频。 https://www.youtube.com/watch?v=Qkwj65l_96I&t=309s

他提到了绝对和相对机器代码

1 个答案:

答案 0 :(得分:2)

  

所以可重定位代码使用相对地址?

没有。至少不一定。

或者你的意思是"与位置无关的代码"代替"可重定位代码"?

  

Assembler生成的可重定位机器代码的用途是什么?

理论上你可以一次组装一个完整的程序。 (事实上​​,当我为一个历史性的CPU编写汇编程序时,我已经这样做了。)

然而,这有一个主要缺点:

考虑以下代码行:

mov [myVariable], eax

我们假设变量myVariable位于地址0x1234560。然后在机器代码中,您将获得以下指令:

mov [0x1234560], eax

现在您修改项目中的一个文件,其中包含约200个文件(这是汽车行业中的典型项目)。我们假设您在项目开始时向某个文件添加了一些说明。

这意味着项目中该文件后面的所有元素(文件)的地址都会发生变化。我们现在说myVariable的地址不再是0x1234560,而是0x1234870

这意味着我们的代码行现在必须转换为以下指令:

mov [0x1234870], eax

因此,必须再次组装项目中的所有文件!

如果您有可重定位代码,则会生成以下指令:

mov [0], eax

...以及地址0必须替换为myVariable地址的一些信息。

这意味着当200个文件中的一个发生更改时,只能替换地址。