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