计算8086汇编程序的段地址范围

Calculating the segment address range of an 8086 assembly programm

我有以下几行程序(为 8086 微处理器编写):

first SEGMENT BYTE
  a db 7 dup (?)
first ENDS      

second SEGMENT WORD
  b dw 200 dup (?)
second ENDS

third SEGMENT PARA
  c db 3 dup (?)
  d dw ?
third ENDS

知道第一个可用地址是 1000h,我需要找出这三个段的地址范围是多少。

对于第一个,因为段中定义了 7 x 个字节,范围将简单地为:1000h:1006h

第二个有 200 x 2 = 400 = 190h 字节(因为 1 字 = 2 字节)

我知道现在我必须将它添加到初始地址,但我不知道那到底是什么。

我猜它仍然是 1007,所以之后第二段的范围将只是:1007h:(1007+190)h。这个对吗?同样的推理也适用于第三部分?

在 MASM 语法中,SEGMENT 指令后跟 BYTE/WORD/PARA 表示对齐。对齐告诉汇编程序,在发出段之前,必须将地址向上舍入到最近的 BYTE/WORD/PARA 边界。显然 BYTE 对齐不会强制调整,因为每个内存地址都在字节边界上。一个WORD是2个字节,PARA是16个字节(一个PARAgraph的大小)

段(默认情况下)按遇到的顺序输出(可以覆盖此行为,但提供的代码没有进行此类修改)。

我们得到的起始程序计数器是1000h。鉴于第一部分:

first SEGMENT BYTE
  a db 7 dup (?)
first ENDS 

BYTE 的对齐不会改变任何内容,因此起始地址仍然是 1000h。我们用 db 7 dup (?) 从 1000h 到 1006h(含)发出 7 个字节。发出此部分后的程序计数器为 1007h(紧接发出的最后一个字节之后)。然后我们遇到下一节:

second SEGMENT WORD
  b dw 200 dup (?)
second ENDS

WORD 对齐意味着我们必须在发出该部分之前四舍五入到一个可以被 2 整除的地址。 1007h 向上舍入到下一个 WORD 边界是 1008h。 1008h 可以被 2 整除。我们用 dw 200 dup (?) 发出 200 个 16 位字,总共 400 个字节。 400 十进制是 190h。本节将跨越 1008h 到 1197h 的范围。程序计数器将为 1198h。

third SEGMENT PARA
  c db 3 dup (?)
  d dw ?
third ENDS

PARA 表示程序计数器在发出该部分之前需要被 16(十进制)整除。 1198h 已经不能被 16(十进制)整除,因此需要调整。下一个可以被 16 整除的地址是 11A0h(任何以十六进制数字 0 结尾的数字都可以被 16 整除)。我们的程序计数器现在是 11A0h。 db 3 dup (?) 发出 3 个字节,dw ? 发出一个字,总共 5 个字节。该数据跨越地址范围 11A0h 和 11A4h(含)。发出此部分后,程序计数器将为 11A5h。

所有部分的地址范围是 1000h 到 11A4h(含)。