MIPS Assembly Linker练习

时间:2018-12-09 23:17:36

标签: assembly mips

我已经得到了一份链接练习的讲义。我知道我需要识别哪些指令需要修改,这些指令涉及哪些地址,并找出地址。但是实际上,我不知道该怎么办。下面是上述锻炼的照片。任何帮助表示赞赏。

Linker Exercise

1 个答案:

答案 0 :(得分:0)

如果您擅长手动编码和解码说明,这实际上对您来说很容易。在下面的底部中考虑这一行:

38:    08000014    j    50 <check+0x50>

因为这是一条跳转指令,所以我们必须像链接程序一样对其进行修改。最后,我们尝试跳到第50行,内容为:

50:    8fc20000    lw v0,0(s8)

我们必须考虑两点,第50行的实际地址,以及第38行的内容,当前为 08000014

如果将 08000014 分解为二进制,则会得到:

0000 1000 0000 0000 0000 0000 0001 0100

如果我还不知道这是一条跳转指令(例如本例),那么我将如何确定它是什么格式?按格式,我指的是MIPS参考数据表,其中包含 R I J 指令格式。您必须使用6个最高有效位!

0000 10|00 0000 0000 0000 0000 0001 0100

如果6个最高有效位为0,则我们将采用 R 格式。但是,在这种情况下, 000010 是二进制的 2 。如果您扫描数据表中的 OPCODE / FUNCT 列,则会在与 jump 指令相对应的行中找到2个十六进制,该指令的 J < / strong>格式:

6 bit opcode | 26 bit instruction

如果我们继续将上述二进制序列的其余部分分解为四组,则为

0000 10|00 00|00 00|00 00|00 00|00 00|01 01|00

然后向左移动两位,我们得到:

0010 0000 0000 0000 0000 0000 0101 0000

将其转换回十六进制以获取:

2 0 0 0 0 0 5 0

注意2个最低有效十六进制值。他们读到 50 。巧合?我想不要让我们继续...

请注意, check 的地址为 00400690 ,而我们试图跳转到的行与该地址偏移了50。这意味着我们必须做一些十六进制加法运算。 400690 + 50 = 4006E0

取该 20000050 值,并用 4006E0 替换6个最低有效位,以获取..... 鼓声 .... 。 204006E0 !我们差不多完成了,我们只需要逆转我们之前所做的步骤。取这个数字,并将其分解为二进制:

0010 0000 0100 0000 0000 0110 1110 0000

然后将所有内容右移2位以获取:

0000 1000 0001 0000 0000 0001 1011 1000

然后转换回十六进制:

0 8 1 0 0 1 B 8

这将是内容列中的值。至于此跳转指令的地址,我们只需要执行以下操作即可找到第50行的地址。跳转指令相对于 check 偏移了38,所以我们取00400690并将其加38。获取此单词的地址,即 4006C8