汇编程序生成的可重定位机器码有什么用?以及为什么它之后会转化为绝对值?

What is the use of relocatable machine code which is generated by Assembler? and why its get converted into absolute afterwards?

汇编器生成的可重定位机器码有什么用?如果生成,那么获取可重定位机器代码将其转换为绝对代码有什么用?

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

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

so the relocatable code uses relative addresses?

没有。至少不一定。

或者您的意思是 "position-independent code" 而不是 "relocatable code"?

What is the use of relocatable machine code which is generated by Assembler?

理论上您可以一次 assemble 整个程序。 (事实上​​ ,当我为具有历史意义的 CPU 编写 assembler 时,我已经这样做了。)

然而这有一个主要缺点:

考虑以下代码行:

mov [myVariable], eax

假设变量 myVariable 位于地址 0x1234560。然后在机器代码中你将有以下指令:

mov [0x1234560], eax

现在您修改项目中的一个文件,该文件由大约 200 个文件组成(这对于汽车行业的项目来说很典型)。假设您在项目开始时向某个文件添加了一些说明。

这意味着项目中该文件之后的所有元素(文件)的地址都将更改。假设 myVariable 现在的地址不再是 0x1234560 而是 0x1234870.

这意味着我们的代码行现在必须翻译成以下指令:

mov [0x1234870], eax

因此,您项目中的所有文件都必须再次 assembled!

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

mov [0], eax

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

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