2013-05-04 43 views
0

我剛剛開始使用程序集進行一些操作,所以如果我的問題是愚蠢的,請原諒我。程序集x86瞭解定義字(DF)指令

我的問題是關於這個(我想用5分100,內存當然變量玩!)

https://dl.dropboxusercontent.com/u/78049918/Pics/Capture.png

爲什麼在DW(定義字)指令等執行那? 我的意思是,我理解所有其他線路,但特別是對我來說是一個黑暗的線路。

另外,你能解釋爲什麼var在地址0010Ah實例化? 我認爲這是因爲實例化之前的4個構造佔用4 * 16bits = 4 * 2bytes = 8bytes, ,所以var在堆棧後立即提交。 但不應該在其他地方的指示?一旦程序開始運行,它們是否加載到堆棧上?

獎勵問題:如何查看emu8086中的堆棧內容?

回答

5

因爲您正在使用彙編器,而不是編譯器。它實際上將你的助記符和數據翻譯成一個扁平的二進制文件(或者更常見的是,包含頭文件,即PE)。

dw完全是字面上的「聲明一個字」。它將代碼中的$0200放置在該位置。如果我們look at this handy table,我們可以看到操作碼

add r8, r/m8 

雖然我不打算進入全碼結構和拆卸,你還會看到[r]這意味着它有一個modrm字節碼以下。顯示modrm字節的含義的Here's another handy table。我們可以看到$00[bx+si]

裝配整體教學,我們得到

add ax, [ax+si] 

(我們從0斧頭在reg2位 - ax是索引的第一個寄存器,cx 2,dx 3,bx 4等)。下面是我的彙編程序的文檔的簡單表:

modrm: 
0 0 0 0 0 0 0 0 
| | | | |___| 
|_| | | reg1 
mod |___| (r/m) 
    reg2 

即:op reg2, reg1

此去一點點深入,但希望你明白,你正在使用匯編程序,而不是一個編譯器,和一個小有關指令編碼。有些東西可能會有點偏離(我習慣於32位)。

這就是大多數可執行格式都有數據和代碼段或16位段爲「隔離」的原因。在一個扁平的二進制文件中,你可以在結尾處或者在jmp之上/在被調用函數之間的空白區域中擁有一個數據段。