2012-09-23 69 views
0

我正在閱讀MASM的一些程序集,我無法理解段指令的用途。在裝配過程中,它與地址計算中的標籤有什麼不同?假設形式指令只是name segment at addr,我不太在乎它的其他選項。什麼是MASM段指令

BootSeg segment at 0x7c0 
BootSeg end 

如果它沒有什麼內在的好處?

你需要什麼價值斧頭,如果你做的事:

mov ax, BootSeg 

+0

這是一個內存尋址問題,特別是實模式尋址。我建議您從英特爾的開發人員手冊或維基百科中瞭解更多信息。或者檢查這個類似的問題:http://stackoverflow.com/questions/12439241/finding-physical-address-in-8086-microprocessor – Jay

+0

@Jay我知道什麼段寄存器,以及它們是如何工作的。我不明白怎麼可能彙編程序確保這些寄存器加載它在這個指令中說的 – Pyjong

+1

它不。它只告訴編譯器該段內的任何內容都位於該特定的內存段中,以便該段內的任何代碼可以正確引用它,例如:'mov ax,BootSeg'。顯式段地址(以及ORG指令)通常用於中斷向量表,BIOS數據區,視頻存儲器等,實際數據不是從二進制文件提供的。這就像固定到特定內存段的數據結構模板。 – Jay

回答

3

segment指令是一種多用途。

第一個用途是將事物組合成段。

第二種用法是適當地引用(=計算各段中的對象的地址)。根據代碼中正在訪問的對象的段,彙編器可以將相應的segment override prefixeses:,ss:,cs:, fs:,gs:)插入到生成的代碼中。同樣,當從不同的代碼段調用procedure時,彙編程序可以生成far call指令而不是near call。 AFAIR,因爲你實際上需要將procedure本身標記爲far(並且這將在例程中將全部普通的rets變成far rets)。

這些段然後由鏈接器處理並轉換爲OS所使用的重定位信息。

爲什麼我們有這些細分市場?因爲CPU有他們,我們不能總是忽視他們的存在。有一些DOS .COM程序可以將它們的代碼,數據和堆棧合併到一個單獨的段中,在這種情況下,程序不必因段的概念而變得複雜(除非需要訪問某些「外部」代碼/數據,而不是來自它自己的部分)。

是的,AT東西基本上疊加在一個對象之上。所以mov ax, BootSeg應該讓你ax = 0x7c0就像其他任何段一樣,除了這裏段已知在「編譯」時間。

使用調試器,實驗。