2016-11-28 30 views
1

我試圖找出一個MBR代碼(在實模式下的16位彙編代碼),我準備好這些行:使用BYTE PTR確定地址大小使用數據段

mov si,0x7cd8 
lods al,BYTE PTR ds:[si] 

中會發生什麼實時,是物理地址是'D8' - 我怎麼知道這一點?因爲這用於加載字符串並將其打印到字符串。這是我在運行這個程序時能夠看到的第一件事,而這些是代碼的第一行。

我的問題是關於第二行,是我得到的物理地址是由於計算是爲了獲得物理地址(段* 16 +偏移量)還是BYTE PTR告訴SI地址將會是BYTE類型,我們將讀取的數據類型是字節類型?

+2

該類型並不重要,這是因爲'segment * 16 + offset'。物理地址爲'0x7cd8',其中'ds = 0',否則它將不起作用;} – Jester

+0

只有在目標大小不明顯時才需要「BYTE PTR」。你的'lods ...'通常寫成'lodsb'。最後,'ds'無論如何都是'lodsxx'的默認段寄存器,所以段覆蓋是不必要的。 –

回答

3

第二行

lods al,BYTE PTR ds:[si] 

是簡單地輸出的分解器的指令LODSB的(從地址DS:SIINC SI裝入一個字節)。

在彙編你會簡單的寫LODSB這意味着

負載從地址DS字節:SI的字節寄存器AL和增量SI之後

關於的DS段問題:當然訪問的地址是通過公式(segment * 16 + offset)計算的,但是您可以將DS設置爲任何你想要的和只有SI由instruc增加(後讀)儘管如此。

DS可以有任何價值。

+0

我現在明白了。關於DS沒有被手動更改,它將始終保持爲0(默認)? – sitoNz

+3

@sitoNz:我(認真)不知道。在執行這兩行之前,'DS'的值肯定會在某處定義。假設默認值在MBR中是非常糟糕的做法。 – zx485