陳鍾誠

Version 1.0

微軟的組譯器

簡介

微軟組譯器 MASM 的執行檔在 Visual Studio 2008 當中稱為 ml.exe,您可以啟動 Visual Studio 的命令列工具,然後使用 ml /Fl 的方式進行組譯,並且同時產生出組譯報表檔。以下是我們組譯 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 的指令集架構。 Help | Terms of Service | Privacy | Report a bug | Flag as objectionable Powered by Wikidot.com Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License Other interesting sites