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

梅根达西

我正在阅读教科书 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 指令的目标。

樱桃DT

具有立即数的跳转指令是相对的,意味着它向前或向后跳转 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。

注意:额外的0x输入0x0x400431显然是书中的一个错字,它没有任何意义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

sscanf溢出目的地地址

如何应用多个条件来决定将哪些值从数组写入目标目的地?

如何有目的地地址的方向(谷歌地图 API)

如何计算源和目的地之间的跳数?

网关和目的地在Linux网络中代表什么?

Laravel Guzzle 从页面获取目的地和截止时间

常见来源和目的地列表

Robocopy无法区分目的地和来源

如何正确更改和隐藏上传图像的目的地?

OpenCage Geocoder获取目的地和起点线标记

查询值的数量和目的地字段的数量不同

基于来源和目的地的 JSON 数组排序

确定目的地(寄存器名称或地址)和值

無法使用導航和噴氣背包組合彈出起始目的地

在链接中,运行时地址和可重定位目标文件的.text(机器代码)部分中的地址之间有什么区别?

如何显示从当前位置到某个目的地(某个地址)的路线图?

分支指令怎么会被错误地预测和淘汰?

确定到达和离开的对,以计算在目的地花费的时间

的logback - 你可以从定义变量ENV附加目的地的名称和类?

fs-extra:源和目的地不能相同。(科尔多瓦)

删除“转移”和“付款”问题“没有这样的目的地” PHP

使用起点,目的地和航路点创建MapKit JS

网站访问者消息的发送和接收目的地

从源列表和目的地列表中查找有向加权图中的最短路径

具有多个顶级目的地和后退键行为的导航图

在画布上绘画时,PorterDuff的来源和目的地指的是什么?

查询到达时间,出发时间以及源,目的地和转机火车之间的总距离

需要帮助通过多个航点获取起点和目的地之间的距离

Beds Online API - 如何设置酒店的目的地和结果的货币