陳鍾誠

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