JE 分支指令的目标目的地,给定其机器代码和起始地址

Target destination of a JE branch instruction, given its machine code and starting address

我正在阅读教科书 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

给出的答案如下

谁能帮忙解释一下为什么这样解释?我不确定他们是如何获得 -12 和 0xf4 值的,以及为什么需要它们来计算此处 je 指令的目标。

立即数的跳转指令是relative,意思是向前或向后跳转X个字节,而不是绝对地址,所以指令本身的地址(或后面的一,见下文)很重要。

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

(since 0xf4 is the 1-byte two's-complement representation of -12)

他们最初是如何获得 0xF4 的:来自指令(74 F4 - 74 是 je short 的操作码,F4 是偏移量)。

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

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

注:0x0x400431中多出的0x明显是书中的错字,没有任何意义。