我正在阅读一些 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,就像任何其他段一样,除了这里段在“编译”时是已知的。
使用调试器,进行实验。