1

我正在阅读一些 MASM 程序集,但我无法理解段指令的目的。在装配过程中地址计算与标签有何不同?假设表单指令只是name segment at addr,我不太关心它具有的其他选项。什么是

BootSeg segment at 0x7c0
BootSeg end

如果它里面什么都没有呢?

如果你这样做,你在 ax 中会有什么价值:

mov ax, BootSeg

?

4

1 回答 1

5

segment指令具有多种用途。

第一个用途是将事物组合成段。

第二种用途是正确引用(=计算地址)各个段中的对象。根据代码中访问的对象段,汇编器可以将适当的segment override prefixes( es:, ss:, cs:, fs:, gs:) 插入到生成的代码中。procedure同样,当从不同的代码段调用 a 时,汇编器可以生成far call指令而不是near call. AFAIR,为此您实际上需要将其procedure本身标记为far(这也将在例程中变得很简单)retsfar rets

然后这些段由链接器处理并转换为操作系统使用的重定位信息。

为什么我们有这些细分市场?因为 CPU 有它们,我们不能总是忽略它们的存在。有 DOS .COM 程序将它们的代码、数据和堆栈放入单个段中,在这种情况下,程序不必因段的概念而变得复杂(除了需要访问一些“外部”代码的情况/数据,而不是来自其自己的段)。

是的,这个AT东西基本上将一个对象覆盖在另一个对象之上。所以mov ax, BootSeg应该得到你ax= 0x7c0,就像任何其他段一样,除了这里段在“编译”时是已知的。

使用调试器,进行实验。

于 2012-09-23T20:36:14.363 回答