2015-11-02 147 views
1

的我有點新的x86架構,並組裝。我有這段我不明白的代碼。的英特爾x86架構「DB」,並DOSBOX

data1 SEGMENT 
    dat1 db 'ABCDEFGH' 
data1 ENDS 

這是在代碼的開頭。後來我們正在使用這個數據1中的代碼:

mov ax, data1 
mov ds, ax 

我使用DOSBOX作爲仿真器和渦輪調試器,並在那裏它顯示爲:

mov ax, 0B14 
mov ds, ax 

任何想法,爲什麼?一般來說,我也不瞭解db的用法。有時用於顯示消息,有時與我的示例類似。

非常感謝你提前:)

+0

這是一個錯字? 'mov ax,donnee1'你是不是指'mov ax,data1'? –

+0

@ user3144770是的,它是謝謝:) – Ege

回答

1

db語句用於定義字節。這實際上不是指令,而是程序集用戶將自定義數據放在某處。該數據是在存儲器中的特定位置,所以拆卸後的數據示出,而不是標籤,其在所用的代碼的地址。標籤只是地址的佔位符,由彙編程序分配。

1

事實上,data1是在代碼的開頭並不太重要。彙編器/鏈接器將在EXE中給它一個合適的位置。所以在調試器中看到mov ax, 0B14是完全可能的。 0B14h是該數據段放置在EXE中的地址。

這裏沒有你的榜樣和使用db顯示消息相差無幾。至多在後一種情況下,會添加一個終止字節。

dat1 db 'ABCDEFGH' 

dat1 db 'ABCDEFGH',0 

dat1 db 'ABCDEFGH','$' 
+0

確定非常感謝你,但現在我有一個問題:)然後當我去到DS我0B14應該能夠看到「ABCDEFGH」,可能是在ASCII但是當我做,我看到一些隨機數字。順便說一句,假設ds:data1,所以它應該在ds – Ege

+0

如果值0B14h是EXE中的實際編碼值,那麼它將通過程序加載程序的重定位過程而被更改。因此,當您使用調試器時,您必須知道事情的具體位置。無法幫助你。 –

+0

@thebok和用戶numberguy:0B14是* *段,而不是段內的地址。一旦你的代碼執行了'mov ds,ax','ds:[dat1]'處的內存應該保存你的ASCII字符串。請注意'data1'是一個段標籤,'dat1'是一個常規標籤。 IDK如果DOS程序得到任何運行時重定位。 16位分段存儲器模型並不是一個非常有用的東西,尤其是要學習。如果你只是想學習裝配。這些天對asm有用的東西主要是編寫優化的內部循環(例如,用於像視頻編解碼器之類的東西),它在64位模式下運行,具有分頁內存。見http://agner.org/optimize/ –