2010-11-04 99 views
1

這是一款來自破刺的操作系統開發系列。有三行代碼。加載第二行需要512字節,第三行需要514字節。我們如何計算這個?如果可能,請給我一個鏈接,我可以詳細閱讀它。提前致謝。如何計算彙編代碼所需的內存?

在彙編語言中,我們可以很容易地超越512字節的標記。 所以,代碼可能看起來很好, 但只有一部分將在 內存。例如,coinsider這樣:

mov ax, 4ch 
inc bx ; 512 byte 
mov [var], bx ; 514 byte 

彙編語言編寫,執行 從文件 向下的頂部開始。不過請記住, 在內存中加載文件時,我們是 加載扇區。這些 扇區中的每一個都是512字節,所以它只會將 將512字節的文件複製到 的內存中。

如果在執行上面的代碼,並且只有第一扇區 被加載到內存中,它只會 起來複制到512字節(INC BX 指令)。所以,雖然最後的mov 指令仍然在磁盤上,但它不在內存中! ! 處理器在inc bx之後會做什麼?它將通過 繼續到514字節。由於此 不在內存中,它會在我們的文件末尾執行 !結束 結果?崩潰。

回答

5

這個例子令人困惑。前兩條指令只佔用幾個字節。筆者認爲inc bx落在512字節。一般來說,您必須組裝代碼以知道x86將會有多大,因爲操作碼具有不同的長度(從大約7個字節[*]開始)。你可以在你的代碼之前和之後放置一個標籤,並減去它們以知道它有多大。

在其他體系結構(例如PowerPC)中,每條指令的大小相同,您可以對它們進行計數並乘以4並且非常接近。

[*]我期望幾個回覆一正在增加彼此前綴指令冗長的x86 ...彙編語言編寫

+0

謝謝,我明白了。 – narayanpatra 2010-11-04 04:52:56

0

代碼被轉換成它們由CPU解釋的處理器指令。根據Itel x86規範,指令可以是可變長度的。

我不知道,如果這個答案是完全CORRCT,但它煤層合理的,所需的內存將代表所有的彙編指令字節由應用

3

加載的總規模,以及任何數據文章是關於bootloader的。當您編寫boot sector(其大小爲512字節)的代碼時,必須注意最多使用512個字節(準確地說,因爲最後2個字節用作簽名)。

編輯:這3條指令有3,1和3(或2?)個字節。當這段代碼已經以大偏移量開始時,他正在解釋這種情況。

計算代碼大小的常用方法是在代碼塊周圍的兩個標籤之間取差值。

+0

我知道。我的問題是關於他如何計算512字節和514字節? – narayanpatra 2010-11-04 04:54:46

+0

感謝您的解釋。 – narayanpatra 2010-11-04 05:02:00