我了解到,当我们使用retn
时,会弹出ip
。 <{1}}使用retf
时,会弹出cs
。
我的问题是:程序无法知道从何处调用(不知道是否使用了ip
或call near
),所以当我们使用call far
时, call far func
以func
ret
结束cs
。{/ p>
另一方面,当我们使用call func
func
结束retf
时,会弹出错误的cs
。如何解决这个问题?我应该避免使用retf
(避免在另一个段中调用过程)吗?
[section A]
....
call dword func ; call func in section B
[section B]
....
call func
func:
....
ret ; in section B,use "call func", so ret is OK,
; but in section A, use call dword, push cs,ip, but only ip popped
答案 0 :(得分:1)
通常,这由汇编程序处理。您声明一个过程NEAR或FAR,并且汇编程序适当地编码调用/ ret。如果你选择滥用它(例如强制远程调用近程序),就会发生不好的事情。不要让坏事发生。 : - )
答案 1 :(得分:1)
据我所知,x86上所有版本的Linux都使用扁平的32位或64位内存模型 - 段寄存器CS / DS具有恒定值(很可能为零)并且永不改变。考虑到这一点,FAR
操作永远不是必需的 - call far
和retf
都不是必需的。不要在Linux上使用它们。
出于同样的原因,Linux使用32位或64位寄存器。它是EIP / RIP,而不是IP。
唯一(曾经)突出的平台,其中细分使用的是MS-DOS和Win16。