【问题标题】:Calculating the segment address range of an 8086 assembly programm计算 8086 汇编程序的段地址范围
【发布时间】:2019-06-21 00:18:06
【问题描述】:

我有以下几行程序(为 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。它是否正确?第三部分的推理也是一样的吗?

【问题讨论】:

    标签: assembly x86 masm x86-16 real-mode


    【解决方案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 整除的地址。 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(含)。

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 2015-06-27
      • 2016-05-07
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多