1

我对此感到困惑;我不认为这两种情况应该有任何区别,程序最终成为 exe 文件。如果您认为不同,请提供帮助....


让我澄清一下我的问题:当我创建“独立”汇编程序和从C程序调用汇编例程时,数据段定义或处理是否存在差异?

在这两种情况下,谁来定义日期段的位置或大小?这是编译器还是操作系统?以及在这两种情况下数据段的值是如何确定的?

4

1 回答 1

0

取决于操作系统!

如果我们正在寻找 IA32 下的 windows 操作系统,那么 API 会保留一些应用程序的虚拟内存地址空间,并且:

  • CS 段,指向程序或代码存储器的开始。
  • DS 段,指向变量或数据存储器的开始。
  • SS段,指向栈内存的开始,与DS相同。
  • ES 作为额外段通常用于字符串传输指令(lodsb、stosw、...),并且与 DS 相同。
  • FS 作为操作系统内核数据的另一个额外段点,如Win32 线程信息块
  • GS 作为另一个额外的段是 0 作为已加载应用程序分配的虚拟内存地址空间的开始。

通过 FS 段访问“Win32 线程信息块”的示例:

function GetThreadId: integer;
//result := GetCurrentThreadId;
asm
  mov   eax, fs:[$18]      //eax := thread information block
  mov   eax, [eax + $24]   //eax := thread id
end; { GetThreadId }

Sheck 还:x86 内存分段

于 2010-04-25T07:57:30.413 回答