为什么我们使用DS来调用程序?

时间:2017-01-20 09:04:31

标签: assembly x86 reverse-engineering

在倒车时,我们会看到一些像call dword ds:[004000238h]call dword ptr ds:_imp_atoi这样的模块间通话 为什么使用数据段而不是使用代码段(CS)?

1 个答案:

答案 0 :(得分:1)

call dword ds:[004000238h]间接近距离呼叫,它在 004000238h 读取DWORD的值并使用它来进行呼叫。

请注意,方括号和dword ptr是用于确定指令类型的点。

由于指令的操作数是一个内存操作数,DS被隐式用于读取它(反汇编程序在使用段覆盖语法显示它时很迂腐)。

呼叫接近(保护模式中的远程呼叫很少并带有特殊语义)因此CS的当前值不会改变。
我们可以说CS被隐式使用,因为调用是相对于CS的当前值。

Intel manual 3描述了protected mode中的调用机制。

作为旁注,即使对于32位系统,分段也被有效禁用(所有描述符都基数为零),因此您可以忘记选择器寄存器但是对于TLS和SEH(通常使用{{1} } / fs寄存器。)