0

我正在阅读教科书 Randal E. Bryant, David R. O'Hallaron - Computer Systems。程序员的视角 [第 3 版](2016 年,Pearson)

我遇到了这个问题,我不确定作者是如何获得答案的。

In the following excerpts from a disassembled binary, some of the information has been replaced by Xs. 
Answer the following questions about these instructions. (You do not need to know anything about the callq instruction here.)
    


What is the target of the je instruction below?

40042f: 74 F4       je  XXXXXX

400431: 5D              pop %rbp

给出的答案如下 来自tb的回答

有人可以帮助解释为什么这样的解释吗?我不确定他们如何获得 -12 和 0xf4 值,以及为什么需要它们来计算此处的 je 指令的目标。

4

1 回答 1

4

具有立即值的跳转指令是相对的,意味着它向前或向后跳转 X 个字节,而不是到绝对地址,因此指令本身的地址(或下一个,见下文)很重要。

偏移操作数是有符号的,它是一个字节长(因为74跳转指令,允许 -128 和 +127 之间的跳转范围 - 有符号 8 位整数的范围)。因此 0xF4 是负数(其最左边的位的值为 -0x80 而不是 +0x80 并且已设置),它等于 -0xC(因为 0xF4 - 0x100 = -0xC),或十进制的 -12。正如解释所说:

(因为 0xf4 是 -12 的 1 字节二进制补码表示)

他们首先是如何获得 0xF4 的:从指令(74 F4 - 74 是操作码,je shortF4 是偏移量)。

现在,跳转的目标是通过将偏移量添加到下一条指令的地址来计算的,在本例中为 0x400431。(您可以想象处理器首先读取指令,使指令指针从指令的结尾前进到下一条指令的开头,然后才从指令指针的当前位置向前或向后应用跳转。 )

所以,0x400431 - 0xC = 0x400425。

注:extra 0xin0x0x400431显然是书中的错字,没有任何意义。

于 2021-09-18T15:45:26.820 回答