2017-02-09 55 views
0

Assemblers And Loaders符号是绝对的还是可重定位的,意味着什么?

在未来符号的情况下,汇编器不知道类型 缺少的符号(绝对或重定位)。因此它不能 生成重定位位...

未来的符号是一个符号之前遇到它已被声明。例如:

JMP TO 
    ... 
TO: ADD 1,2 

JMP TO指令组装,符号TO是未来的象征,因为它的定义还没有遇到过。

由于符号是指内存中的一个位置,它怎么可能而不是可重定位?

+1

很难说,没有更多的背景知道本书认为“重定位位”是什么。据猜测,架构对绝对和相对地址采用不同的指令编码。如果是这样,那么程序中可能会发射相对偏移量,允许在没有修复的情况下任意重新定位程序。相反地​​,如果TO以操作系统中的绝对地址('EQU $ 1000')结束引用ROM向量,则绝对寻址模式将是适当的。 – doynax

+0

这是一个非常过时的问题。那么,这本书不是所谓的“汇编器,连接器和装载机”。没有人再使用单程汇编程序,这只是在60年代才重要的一件事情,那就是汇编程序可以对内存进行严格的限制。 –

回答

0

我没去读过你的书。我喜欢它谈论当时正在做的汇编器和链接器的历史,但是现在工具好了很多。

你是非常正确的。我认为这个概念有一些指令集,不需要特定的指令集,提供接近版本的东西或通过引用的指令,基本上应用于程序计数器的某些偏移量是引用东西或跳转到的地方。并且在某种程度上还提供了一种方法来使用(可变长度)指令中编码的绝对地址,或者可以跳转到从位置(pc相对)或通过即时mov等加载的寄存器中的地址。我认为这个作者暗示的是,一旦你对这个地址进行了硬编码,它就永远是固定的,绝对的,链接器永远不会再改变它。

那么只需要几秒钟就可以证明连接器今天可以做什么。他们可以并且将会修改指令,或者生成所需的指令,而不是汇编器完成所有指令生成。即使你有汇编器完成所有的事情,你仍然没有被卡住,汇编器也不能完成整个事情,汇编器会例如做一个pc的相对读取附近的位置,这个位置对于汇编器和链接器是已知的成为某个不在此对象中的标签的地址,即外部标签。汇编程序将所有的CODE写入寄存器中的跳转到注册,链接器填入地址。一旦链接看起来像一个绝对地址,但链接器可以重新定位,并且可以争论使用的二进制格式可以指示该位置是某个标签的地址,以便即使在加载时加载器也可以改变它。

一些指令集可以将绝对地址放在指令中,并且没有真正的理由说明为什么链接器不能负责在链接时填写指令的这一部分。

我认为唯一的问题就是设计不好,如果在一个对象中你已经解决了一个标签并且使用了一个pc相对跳转,但是某种程度上,工具链允许你撕开那个对象的一部分,其余的部分。那只会是糟糕的设计。一种情况是gnu工具至少可以很好地处理,而其他人却不能这么做的原因是采取手臂和拇指的方式,bl指令不能改变模式,所以如果不告知其他情况,汇编器会假设某个标签将会处于相同的模式因为你的程序员使用bl而不是blx或bx。链接器出现并发现标签处于另一种模式,如果它能够找到可触及的空间,则它会在同一模式下添加一些蹦床,这些指令在功能上是不可见的(返回地址被保留,模式被更改并且目的地标签/地址到达)。真的很酷,我在SO上发布了这个例子。

问题出在连接器无法找到空间被绘制到一个角落,它不能制作蹦床,它需要插入对象的指令不适合,它们不能在指令集的规则内蹦床,以及那么链接器必须保释出来。我认为今天救市的门槛与当时的门槛大不相同。即使在上面提到的gnu连接器和其他人并不是那么聪明,只有少数几个版本以前,少数几年或更少的时候,他们会在这种情况下救助而不是仅仅修复它。我认为,如果你保持在相同的模式,并试图在地址空间太远,它将保释出来,而不是仅仅修复它。它也可以很容易地解决这种情况。