assembly - 在 call/jmp 指令中解码立即数
问题描述
我目前正在开发一个 Intel x86 反汇编程序。
而且我更准确地尝试支持 CALLs 指令(当然还有 JMP),但是在解码它们时我遇到了一些问题。
这是我的问题,我有e8
操作码,可以是callw
or call
。它的唯一操作数是立即值。
它看起来很容易实现,直到我尝试反汇编:call 0x12345
.
这给了:
e8 41 23 01 00 call 12346 <_main+0x12346>
我不明白为什么反汇编程序将 my call 0x12345
转换为call 0x12346
.
此外,反汇编程序call 0x12346
在以十六进制格式给出指令的同时输出e8 41 23 01 00
。
并且41 23 01 00 (0x12341)
不等于0x12345
甚至0x12346
。
过了一会儿,我发现0x12341
+指令的大小(5字节)等于0x12346
这似乎并不荒谬。
但我仍然不知道为什么它将我的原件0x12345
转换为0x12346
.
我可以记下这一点,每次在立即数上加一个并减去 5 个字节,但我更愿意知道背后的技术原因,而不是尝试随机解决我的问题以避免任何形式的未来误解。
解决方案
推荐阅读
- microservices - DB Port - 在同一个盒子上使用相同的 DB 进行微服务开发
- node.js - 连接到 Mongo 数据库时出错。bad auth 身份验证失败 heroku + atlas mongodb + strapi
- docker - 运行 Dockerized 应用程序以转换名称未知的本地文件
- view - SwiftUI:如何使用计时器在不同位置创建多个视图?
- python - 如何加快 Twilio 上的呼叫转移?- 姜戈
- php - php二维数组格式在laravel中转成echarts格式?
- scala - 如何在databricks中将字符串更改为int
- javascript - React 无法通过 prop 数组映射
- reactjs - 新应用程序上的 react-native-gesture-handler 包错误
- node.js - 如何 NPM 发布,以便消费者可以从不同的顶级目录导入