gpt4 book ai didi

assembly - 你能从机器代码中判断一条指令是否可重定位吗?

转载 作者:行者123 更新时间:2023-12-05 03:09:40 27 4
gpt4 key购买 nike

根据 Assemblers And Loaders (一本关于汇编器工作原理的 24 年前的书):

...a one-pass assembler cannot generate a relocatable object file. The type of the instruction (absolute or relocatable) can be determined only by examining the original source instruction. The one-pass assembler loads the machine instructions directly in memory. Once in memory, the instruction is just a number. By looking at a machine instruction in memory, it is impossible to tell whether the original instruction was absolute or relocatable.

书上给出了如下一条可重定位和一条绝对指令的伪代码:

    JMP TO
...
TO: ADD 1,2

第一条指令使用符号 TO,第二条指令将寄存器“​​1”和寄存器“2”中的值相加。

据我了解,您不需要源代码就知道第一条指令的机器代码是可重定位的。应该可以使用操作码表来确定它是 JMP 指令,并且它必须跳转到需要可重定位的地址。

我的假设是否正确?

背景:虽然这本书很旧,但我正在阅读它以更好地理解 6502 和 65816 等旧 CPU 的汇编。

最佳答案

您的书具有误导性,单程汇编器(正如大多数人所理解的术语)可以通过发出称为重定位的特殊数据来生成可重定位的目标文件,该数据告诉链接器/加载器如何重定位代码。这本书似乎使用了“一次性汇编程序”的特定定义,根据其自身的定义,该汇编程序无法输出带有重定位的“可重定位目标文件”。

然而,一般来说,您无法判断给定的机器代码指令是否可重定位,除非有一组重定位可用于判断什么是可重定位的或不可重定位的(以及如何重定位不可重定位的指令) ).某些指令使其显而易见,例如,您可以根据目标地址的编码方式判断 JMP TO 指令是否可重定位。如果目标地址被编码为 JMP 指令地址的相对偏移量,那么它是可重定位的。另一方面,如果被编码为绝对地址,则指令不可重定位。在第一种情况下,程序可以在不修改的情况下重新定位到内存中,并且 JMP 指令仍将跳转到相同的代码。在第二种情况下,JMP 指令将始终跳转到相同的地址,无论代码已重新定位到何处,除非将指令更改为跳转到正确的位置。

在 x86 汇编中,第一种情况的具体示例如下:

0056: EB 10     JMP LO

指令中的第一个字节是操作码EB(我在这里使用的数字都是十六进制的),它表示具有8 位相对偏移量的near JMP 指令。指令中的第二个字节是 8 位相对偏移量。它实际上是相对于后面指令的开始,所以跳转到的地址是0056 + 2 + 100068

在 6502 汇编中,第二种情况的例子是:

0056: 4C 68 00   JMP LO

在这种情况下,操作码字节 4C 表示 JMP 指令已使用 2 字节绝对地址编码到指令中。接下来的两个字节以小端字节顺序构成该地址:0068

另一个简单的例子是ADD 1,2,它只使用寄存器。由于不涉及地址,因此可以在不修改的情况下重定位指令,因为指令中没有编码地址。问题在于像 ADD #1000,2 这样的指令,它将字面值 1000 添加到寄存器 2 中存储的值。在这种情况下,数字 1000 被编码在指令中,没有办法知道该号码是否被用作地址。脱离上下文,无法知道指令中是否包含编码地址。

16 位 x86 汇编语言中的 ADD #1000,2 示例如下:

0068: 81 C3 EB 03    ADD BX, 1000

指令 EB 03 的最后两个字节是十进制值 1000,是指令的立即数(文字)操作数的编码位置。该指令将 1000 添加到 BX 寄存器。没有更多的上下文就不可能知道 1000 是否应该是一个地址。例如,代码可能会计算从地址 1000 开始的表中某物的地址。

你可能想找另一本书,因为它似乎花了很多时间来处理 24 年前已经过时并且今天完全过时的机器架构。

关于assembly - 你能从机器代码中判断一条指令是否可重定位吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42146498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com