MASM段指令

时间:2012-09-23 11:44:18

标签: assembly masm

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

BootSeg segment at 0x7c0
BootSeg end

如果里面什么都没有,那还好吗?

如果你这样做,你会对斧头有什么价值:

mov ax, BootSeg

1 个答案:

答案 0 :(得分:3)

segment指令有点多用途。

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

第二种用法是适当地引用(=计算)各个段中对象的地址。根据代码中正在访问的对象的片段,汇编器可以插入适当的segment override prefixeses:ss:cs:fs:,{{ 1}})生成的代码。同样,当从不同的代码段调用gs:时,汇编程序可以生成procedure指令而不是far call。 AFAIR,因为您实际上需要将near call本身标记为procedure(并且这会在例程中将所有普通far变为rets

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

为什么我们有这些细分?因为CPU有它们,我们不能总是忽略它们的存在。有一些DOS .COM程序可以将它们的代码,数据和堆栈整合到一个段中,在这种情况下,程序不必因段的概念而复杂化(除非那些需要访问某些“外部”代码的情况/数据,而非来自其自身的细分市场。)

是的,far rets事物基本上将一个对象叠加在另一个上面。所以AT应该像任何其他段一样得到mov ax, BootSeg = 0x7c0,除非此处的段在“编译”时已知。

使用调试器,实验。