我有以下几行程序(为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个字节,因此范围将简单地为:1000h:1006h
对于第二个字节,有200 x 2 = 400 = 190h字节(因为1个字= 2个字节)
我知道现在我必须将其添加到初始地址,但是我不知道那是什么。
我猜它仍然是1007,因此之后第二段的范围将是:1007h:(1007 + 190)h。它是否正确?同样的推理也可以用于第三部分吗?
答案 0 :(得分:1)
在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。从1000h到1006h(含),我们用db 7 dup (?)
发出7个字节。发出此部分之后的程序计数器为1007h(紧接发出的最后一个字节之后)。然后,我们遇到下一部分:
second SEGMENT WORD
b dw 200 dup (?)
second ENDS
WORD对齐意味着我们必须四舍五入到一个能被2整除的地址,然后再发出该节。向上舍入到下一个WORD边界的1007h是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(含)。