組合語言簡介處理器BIOS啟動程式微軟組譯器組合語言DOSWindowsVisualStudioGNUGNU 組譯器C 轉組語連結 C 語言嵌入 C 語言訊息相關網站參考文獻最新修改簡體版English |
簡介微軟組譯器 MASM 的執行檔在 Visual Studio 2008 當中稱為 ml.exe,您可以啟動 Visual Studio 的命令列工具,然後使用 ml /Fl <asmFile> 的方式進行組譯,並且同時產生出組譯報表檔。以下是我們組譯 sum.asm 的過程,參數中的 /Fl 選項會導致 ml 組譯器將組譯報表輸出到 sum.lst 檔當中,範例 4.19顯示了該組譯報表的內容。報表檔中顯示了各個指令的編碼與位址、變數的位址、區段的長度等等。
微軟組譯器的報表檔先讓我們將焦點鎖定再以下報表檔中的資料段 (.data),其中的00000000 00000000 sum DWORD 0 這行代表 sum 變數位於資料段的位址 0之處,而從資料段位址00000004 的兩行中,我們可以看到formatStr BYTE "sum=%d", 0dh, 0ah, 0 這行指令被組譯為 73 75 6D 3D 25 64 0D 0A 00。 若將焦點移向程式段 (.code),我們會看到 MOV eax, 1 指令被編在程式段的位址0之處,其目的碼為 B8 00000001,而ADD sum, eax 之位址為00000005,其目的碼為01 05 00000000。 從報表檔中我們可以清楚的看到 x86 的指令長度是不固定的,像是 ret 0 指令之目的碼為 C3,其長度為 1 bytes,但是CMP eax, 10 指令的目的碼為 83 F8 0A,其長度為 3 bytes,至於ADD sum, eax指令的目的碼為01 05 00000000,其長度達到 6 bytes。 範例:add_print.asm
範例:sum.asm
另外,範例 4.19的報表檔中也顯示了符號表的內容,像是 FOR1標記的位址為 _TEXT 段的 00000005,formatStr 變數的位址為 _DATA 段的 00000004,而 sum 的位址則為 _DATA 段的 00000000 等等。仔細觀察這些報表檔,您將會更瞭解組譯器的設計原理,以及 x86 的指令集架構。 |
微軟的組譯器 (MASM)
page revision: 6, last edited: 11 Oct 2010 07:06
Post preview:
Close preview