[英]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.