繁体   English   中英

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

[英]Assembly: data segment when called from C or created as an independent program

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

让我澄清一下我的问题:数据段的定义或处理是否有所不同
在我创建一个“独立”的汇编程序与从C程序中调用汇编例程之间?

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

取决于操作系统!

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

  • CS段,指向程序或代码存储器的开始。
  • DS段,指向变量或数据存储器的开始。
  • SS段,指向堆栈存储器的开始,与DS相同。
  • ES作为额外的段通常用于字符串传输指令(lodsb,stosw等),并且与DS相同。
  • FS是OS内核数据(如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 }

还可以: x86内存分段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM