【发布时间】:2013-12-22 09:36:55
【问题描述】:
我正在阅读装配艺术,第 250 页上写着:
您只能推送 cs 寄存器(弹出 cs 寄存器会产生一些有趣的程序流控制问题)。
第 291 页上写着:
retf: popd cs:ip
在我看来,有两种选择:
pop cs: ip 是允许的,但你不应该使用它,因为 ret 指令更短。
pop cs:ip 是不允许的,只有 ret 指令才能做到。
此外,如果 call 和 ret 过去使用分段,并且在现代计算机中不再使用这种“hack”(或仅由操作系统程序员使用),这是否意味着我们所做的每个 CALL 都是 FAR-JUMP ?
我们总是推送 32 位地址还是 NEAR-JUMP 仍然存在?
【问题讨论】:
-
“这是否意味着我们所做的每个 CALL 都是 FAR-JUMP?” IIRC,它们都是 NEAR 处于 32 位保护模式(因为它们都会位于您的单个 4GB“段”内)。
-
@Michael:错了;远跳转/调用指令仍然存在于 32 位保护模式中。一些操作系统(或 DOS 扩展程序)甚至使用分段的 32 位内存模型(其中指针长度为 48 位)。然而,大多数操作系统使用非分段内存布局。