我正在阅读一些 MASM 程序集,但我无法理解段指令的目的。它与汇编期间地址计算中的标签有何不同?假设表单指令只是name segment at addr,我不太关心它具有的其他选项。什么是
BootSeg segment at 0x7c0
BootSeg end
Run Code Online (Sandbox Code Playgroud)
如果里面什么都没有的话有什么好处?
如果你这样做的话,你的 axe 会有什么价值:
mov ax, BootSeg
Run Code Online (Sandbox Code Playgroud)
?
该segment指令具有多种用途。
第一个用途是将事物组合成片段。
第二个用途是正确引用(=计算地址)各个段中的对象。根据代码中访问的对象段,汇编器可以将适当的segment override prefixes( es:, ss:, cs:, fs:, gs:) 插入到生成的代码中。同样,当从不同的代码段调用 a 时procedure,汇编器可以生成指令far call而不是near call. AFAIR,为此,您实际上需要将其procedure自身标记为far(并且这也会在例程中将所有内容变为普通)rets。far rets
然后,这些段由链接器处理,并转换为操作系统使用的重定位信息。
为什么我们有这些细分市场?因为CPU有它们,我们不能总是忽视它们的存在。有些 DOS .COM 程序将其代码、数据和堆栈放入单个段中,在这种情况下,程序不必因段的概念而变得复杂(除了需要访问某些“外部”代码的情况/数据,而不是来自其自己的段)。
是的,这个AT东西基本上将一个物体覆盖在另一个物体之上。所以mov ax, BootSeg应该让你ax= 0x7c0 就像任何其他段一样,除了这里该段在“编译”时是已知的。
使用调试器进行实验。
| 归档时间: |
|
| 查看次数: |
2976 次 |
| 最近记录: |