我应该避免使用retf吗?

时间:2013-12-17 15:12:02

标签: linux function assembly x86 return

我了解到,当我们使用retn时,会弹出ip。 <{1}}使用retf时,会弹出cs

我的问题是:程序无法知道从何处调用(不知道是否使用了ipcall near),所以当我们使用call far时, call far funcfunc 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

2 个答案:

答案 0 :(得分:1)

通常,这由汇编程序处理。您声明一个过程NEAR或FAR,并且汇编程序适当地编码调用/ ret。如果你选择滥用它(例如强制远程调用近程序),就会发生不好的事情。不要让坏事发生。 : - )

答案 1 :(得分:1)

据我所知,x86上所有版本的Linux都使用扁平的32位或64位内存模型 - 段寄存器CS / DS具有恒定值(很可能为零)并且永不改变。考虑到这一点,FAR操作永远不是必需的 - call farretf都不是必需的。不要在Linux上使用它们。

出于同样的原因,Linux使用32位或64位寄存器。它是EIP / RIP,而不是IP。

唯一(曾经)突出的平台,其中细分使用的是MS-DOS和Win16。