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