assembly - x86 - 通过 RETF 从 32 位切换到 64 位

标签 assembly x86 x86-64 memory-segmentation

我正在研究一些反反汇编技术,并发现了以下代码片段:

push 0x33
call $+5
add  [esp+0x10+var_10], 5
retf
; next instruction here

简而言之,这会立即跳转到 RETF 之后的指令,但会弄乱 32 位反汇编程序。我仍然不清楚为什么会这样。

现在,我被告知 RETF 返回到 64 位段,因此在 32 位调试器上调试它会产生错误的反汇编结果。当在 64 位调试器(在我的例子中是 Windbg)上运行此代码片段时,它会产生正确的结果。

我的问题是:push 0x33 有什么特别之处吗? 0x33 是某种特殊值吗?

最佳答案

retf 本身并不意味着“返回 64 位段”。它的意思是“返回到指定的段和地址”,而不是near ret 的意思是“返回到指定的地址而不改变段”。 0x33 是要返回的段,它恰好是用于 64 位代码的段。 (0x23 是 32 位段。)

关于assembly - x86 - 通过 RETF 从 32 位切换到 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77442941/

相关文章:

c - C 开发人员如何使用对他们来说陌生的汇编?

linux - PERF STAT 不计算内存加载但计算内存存储

x86-64 - 为什么 1 的补码仍然用于编码向量指令?

c - 单个 sqrt() 的运行速度如何比放入 for 循环时慢两倍

c - 汇编:在函数中访问同一个寄存器的四字、双字、字节数

performance - 现代 PC 视频硬件是否支持硬件中的 VGA 文本模式,或者 BIOS 是否模拟它(使用系统管理模式)?

assembly - 英特尔 8080 : How to MOV DE to B?

assembly - 从哪里开始学习汇编 - IDE、示例

c# - 为什么 C# 结构实例方法在结构字段上调用实例方法首先检查 ecx?

c - x86指令中的非阻塞内存写入?