簡體   English   中英

計算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 語法中,后跟 BYTE/WORD/PARA 的SEGMENT指令表示對齊。 對齊告訴匯編器在發出段之前,地址必須向上舍入到最近的 BYTE/WORD/PARA 邊界。 顯然字節對齊不會強制調整,因為每個內存地址都在字節邊界上。 一個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

字對齊意味着我們必須在發出該部分之前向上舍入到可以被 2 整除的地址。 向上舍入到下一個 WORD 邊界的 1007h 是 1008h。 1008h 可以被 2 整除。我們發出 200 個 16 位字, dw 200 dup (?) ,總共 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 ?發出一個字dw ? 總共 5 個字節。 該數據跨越地址范圍 11A0h 和 11A4h(含)。 此部分發出后,程序計數器將為 11A5h。

所有段組合的地址范圍將是 1000h 到 11A4h(含)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM