微軟的組譯器 (ML.exe)

簡介

微軟組譯器 MASM 的執行檔在 Visual Studio 2008 當中稱為 ml.exe,您可以啟動 Visual Studio 的命令列工具,然後使用 ml /Fl <asmFile> 的方式進行組譯,並且同時產生出組譯報表檔。以下是我們組譯 sum.asm 的過程,參數中的 /Fl 選項會導致 ml 組譯器將組譯報表輸出到 sum.lst 檔當中,範例 4.19顯示了該組譯報表的內容。報表檔中顯示了各個指令的編碼與位址、變數的位址、區段的長度等等。

C:\ccc\SP\code\ch03>ml /Fl sum.asm
Microsoft (R) Macro Assembler Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: sum.asm
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

/OUT:sum.exe
sum.obj

微軟組譯器的報表檔

先讓我們將焦點鎖定再以下報表檔中的資料段 (.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

Microsoft (R) Macro Assembler Version 9.00.21022.08        09/08/09 12:12:08
add_print.asm                             Page 1 - 1

                .386
                .model    flat
                INCLUDELIB LIBCMT
                printf PROTO C, format:PTR BYTE, args:VARARG
 00000000            .data
 00000000 00000000        num DWORD 0
 00000004 6E 75 6D 3D 25    formatStr BYTE "num=%d", 0dh, 0ah, 0
       64 0D 0A 00
                PUBLIC    _main
 00000000            .code
 00000000            _main    PROC
 00000000  B8 00000001            MOV eax, 1
 00000005  83 C0 04            ADD eax, 4
 00000008  83 E8 02            SUB eax, 2
 0000000B  A3 00000000 R        MOV num, eax
                    INVOKE printf, ADDR formatStr, num
 00000023  C3                ret    0
 00000024            _main    ENDP
                END
Microsoft (R) Macro Assembler Version 9.00.21022.08        09/08/09 12:12:08
add_print.asm                             Symbols 2 - 1

Segments and Groups:

                N a m e                 Size     Length   Align   Combine Class

FLAT . . . . . . . . . . . . . .    GROUP
_DATA  . . . . . . . . . . . . .    32 Bit     0000000D DWord      Public  'DATA'    
_TEXT  . . . . . . . . . . . . .    32 Bit     00000024 DWord      Public  'CODE'    

Procedures, parameters, and locals:

                N a m e                 Type     Value    Attr

_main  . . . . . . . . . . . . .    P Near     00000000 _TEXT    Length= 00000024 Public
printf . . . . . . . . . . . . .    P Near     00000000 FLAT    Length= 00000000 External C

Symbols:

                N a m e                 Type     Value    Attr

@CodeSize  . . . . . . . . . . .    Number     00000000h   
@DataSize  . . . . . . . . . . .    Number     00000000h   
@Interface . . . . . . . . . . .    Number     00000000h   
@Model . . . . . . . . . . . . .    Number     00000007h   
@code  . . . . . . . . . . . . .    Text        _TEXT
@data  . . . . . . . . . . . . .    Text        FLAT
@fardata?  . . . . . . . . . . .    Text        FLAT
@fardata . . . . . . . . . . . .    Text        FLAT
@stack . . . . . . . . . . . . .    Text        FLAT
formatStr  . . . . . . . . . . .    Byte     00000004 _DATA    
num  . . . . . . . . . . . . . .    DWord     00000000 _DATA    

       0 Warnings
       0 Errors

範例:sum.asm

Microsoft (R) Macro Assembler Version 9.00.21022.08        09/08/09 12:14:46
sum.asm                                 Page 1 - 1

                .386
                .model    flat
                INCLUDELIB LIBCMT
                printf PROTO C, format:PTR BYTE, args:VARARG
 00000000            .data
 00000000 00000000        sum DWORD 0
 00000004 73 75 6D 3D 25    formatStr BYTE "sum=%d", 0dh, 0ah, 0
       64 0D 0A 00
                PUBLIC    _main
 00000000            .code
 00000000            _main    PROC
 00000000  B8 00000001            MOV eax, 1
 00000005            FOR1:
 00000005  01 05 00000000 R        ADD sum, eax
 0000000B  83 C0 01            ADD eax, 1
 0000000E  83 F8 0A            CMP eax, 10
 00000011  7E F2            JLE FOR1
                    INVOKE printf, ADDR formatStr, sum
 00000026  C3                ret    0
 00000027            _main    ENDP
                END
Microsoft (R) Macro Assembler Version 9.00.21022.08        09/08/09 12:14:46
sum.asm                                 Symbols 2 - 1

Segments and Groups:

                N a m e                 Size     Length   Align   Combine Class

FLAT . . . . . . . . . . . . . .    GROUP
_DATA  . . . . . . . . . . . . .    32 Bit     0000000D DWord      Public  'DATA'    
_TEXT  . . . . . . . . . . . . .    32 Bit     00000027 DWord      Public  'CODE'    

Procedures, parameters, and locals:

                N a m e                 Type     Value    Attr

_main  . . . . . . . . . . . . .    P Near     00000000 _TEXT    Length= 00000027 Public
  FOR1 . . . . . . . . . . . . .    L Near     00000005 _TEXT    
printf . . . . . . . . . . . . .    P Near     00000000 FLAT    Length= 00000000 External C

Symbols:

                N a m e                 Type     Value    Attr

@CodeSize  . . . . . . . . . . .    Number     00000000h   
@DataSize  . . . . . . . . . . .    Number     00000000h   
@Interface . . . . . . . . . . .    Number     00000000h   
@Model . . . . . . . . . . . . .    Number     00000007h   
@code  . . . . . . . . . . . . .    Text        _TEXT
@data  . . . . . . . . . . . . .    Text        FLAT
@fardata?  . . . . . . . . . . .    Text        FLAT
@fardata . . . . . . . . . . . .    Text        FLAT
@stack . . . . . . . . . . . . .    Text        FLAT
formatStr  . . . . . . . . . . .    Byte     00000004 _DATA    
sum  . . . . . . . . . . . . . .    DWord     00000000 _DATA    

       0 Warnings
       0 Errors

另外,範例 4.19的報表檔中也顯示了符號表的內容,像是 FOR1標記的位址為 _TEXT 段的 00000005,formatStr 變數的位址為 _DATA 段的 00000004,而 sum 的位址則為 _DATA 段的 00000000 等等。仔細觀察這些報表檔,您將會更瞭解組譯器的設計原理,以及 x86 的指令集架構。

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License