Assembly 符号是绝对的或可重新定位的意味着什么?

Assembly 符号是绝对的或可重新定位的意味着什么?,assembly,Assembly,根据: 对于将来的符号,汇编程序不知道其类型 (绝对或可重新定位)缺少的符号。因此,它不能 生成重新定位位 未来符号是在声明之前遇到的符号。例如: JMP TO ... TO: ADD 1,2 组装JMP TO指令时,符号TO是未来的符号,因为尚未遇到其定义 既然一个符号指的是内存中的一个位置,它怎么可能不可重新定位呢?我没有去读你的书。我喜欢它谈论汇编程序和链接器的历史,这在当时是正确的,但现在工具要好得多 你说得很对。我认为这里的概念是,一些指令集,不需要特定于某个指令集,

根据:

对于将来的符号,汇编程序不知道其类型 (绝对或可重新定位)缺少的符号。因此,它不能 生成重新定位位

未来符号是在声明之前遇到的符号。例如:

    JMP TO
    ...
TO: ADD 1,2
组装
JMP TO
指令时,符号
TO
是未来的符号,因为尚未遇到其定义


既然一个符号指的是内存中的一个位置,它怎么可能不可重新定位呢?

我没有去读你的书。我喜欢它谈论汇编程序和链接器的历史,这在当时是正确的,但现在工具要好得多

你说得很对。我认为这里的概念是,一些指令集,不需要特定于某个指令集,提供接近版本的东西或指令,这些东西或指令基本上是通过引用,应用于程序计数器的某些偏移量是引用东西或跳转到哪里。在某种程度上,它还提供了一种使用绝对地址的方法,可以在(可变长度)指令中编码,也可以跳转到寄存器中的地址,该地址是从一个位置(pc相对位置)加载的,或者是通过一个即时mov加载的。我想作者的意思是,一旦你硬编码了地址,它就永远固定了,绝对值,链接器再也无法更改它

我只需要几秒钟就可以演示链接器今天可以做什么。它们可以并且将修改指令并生成所需的指令,而不是由汇编程序生成所有指令。即使你让汇编器做了整件事,你仍然没有被卡住,好吧,汇编器没有做整件事,例如,汇编器会对附近的某个位置进行pc相关读取,汇编器和链接器知道该位置是某个标签的地址,而该标签不在这个对象中,一个外部标签。汇编程序将加载附近的所有代码写入寄存器,跳转到寄存器,链接器填充地址。一旦链接,它看起来像一个绝对地址,但链接器可能已经重新定位了它,人们可能会争辩说,使用的二进制格式可以指示位置是某个标签的地址,因此即使在加载时,加载程序也可以更改它

有些指令集可以将绝对地址放在指令中,链接器没有真正的理由不负责在链接时填充指令的该部分

我认为唯一的问题是糟糕的设计,如果你在一个对象内解析了一个标签,并使用了pc相对跳转,但不知何故,工具链允许你将该对象的一部分撕开,并将其与其他对象分开。那就是糟糕的设计。gnu工具至少可以很好地处理一种情况,并且没有其他工具无法处理的原因,就是bl指令不能改变模式,因此如果不告诉汇编程序,汇编程序会假定某个标签的bl将处于相同的模式,因为程序员使用的是bl而不是blx或bx。链接器出现并发现标签处于另一种模式,如果它能在伸手可及的范围内找到空间,它会在相同模式下添加一个蹦床和一些功能上不可见的指令(返回地址被保留,模式被更改,目标标签/地址被到达)。真的很酷,我在这里发布了一些例子


当链接器找不到它被画进一个角落的空间,它不能做蹦床,它需要插入到对象中的指令不合适,它们不能在该指令集的规则内蹦床,然后链接器必须跳出。我认为今天的救市门槛与当时的门槛大不相同。即使在上述bl案例中,gnu链接器和其他一些版本在几年前、几年或更短的时间内还没有那么聪明,他们也会在这种情况下摆脱困境,而不仅仅是解决问题。我认为,在arm的情况下,如果您保持相同的模式,并试图在地址空间中bl过远,它将退出,而不仅仅是修复它。它也可以很容易地解决这种情况。

如果没有更多的上下文,很难说这本书认为的
重新定位位是什么。据猜测,这些体系结构对绝对地址和相对地址采用了不同的指令编码。如果是这样,则可能会在程序内发出相对偏移量,从而允许在不进行修复的情况下进行任意程序重新定位。相反,如果TO最终引用操作系统中绝对地址处的ROM向量(
到等于$1000
),则绝对寻址模式是合适的。这是一个非常老式的问题。嗯,这本书不叫“汇编程序、链接程序和加载程序”。再也没有人使用一次通过的汇编程序了,这在60年代才很重要,当时内存严重限制了汇编程序的功能。