在倒车时,我们会看到一些像call dword ds:[004000238h]
或call dword ptr ds:_imp_atoi
这样的模块间通话
为什么使用数据段而不是使用代码段(CS
)?
答案 0 :(得分:1)
call dword ds:[004000238h]
是间接近距离呼叫,它在 004000238h 读取DWORD的值并使用它来进行呼叫。
请注意,方括号和dword ptr
是用于确定指令类型的点。
由于指令的操作数是一个内存操作数,DS
被隐式用于读取它(反汇编程序在使用段覆盖语法显示它时很迂腐)。
呼叫接近(保护模式中的远程呼叫很少并带有特殊语义)因此CS
的当前值不会改变。
我们可以说CS
被隐式使用,因为调用是相对于CS
的当前值。
Intel manual 3描述了protected mode中的调用机制。
作为旁注,即使对于32位系统,分段也被有效禁用(所有描述符都基数为零),因此您可以忘记选择器寄存器但是对于TLS和SEH(通常使用{{1} } / fs
寄存器。)