汇编:从C调用或作为独立程序创建时的数据段

时间:2010-04-24 15:10:16

标签: c assembly data-segment

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

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

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

1 个答案:

答案 0 :(得分:0)

取决于操作系统!

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

  • CS段,指向开头 程序或代码存储器。
  • DS细分,指向开始 变量或数据存储器。
  • SS段,指向开头 堆栈内存与DS相同。
  • ES作为额外片段通常在 用于字符串传输指令 (lodsb,stosw,......)和DS一样。
  • FS作为另一个额外的分段点 在诸如Win32 Thread Information Block的操作系统内核数据上。
  • 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 memory segmentation