满意答案

ssxian168
推荐于 2017.09.17

采纳率:43% 等级:6
已帮助:257人
如果只是想得到C语言或C++语言的汇编代码
可以通过指定编译器的选项来达成目的,这里我们用1998年生产的Windows平台VC6.0的SDK举例(以传统的命令行编译环境方式,对应的IDE集成开发环境可在工程》设置里在编译选项里加入/Fa即可):
开始》运行,输入cmd启动命令行,
若安装了VC6.0的SDK(或其IDE集成开发环境),默认路径为"C:\Program Files\Microsoft Visual Studio“
命令行输入"C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"回车执行初始化编译环境
命令行输入 mkdir CtoASMTest建立测试目录,并进入该目录,命令行输入 cd CtoASMTest
用记事本建立测试代码,命令行输入notepad CtoASM_test.c回车确认,输入以下测试C代码
int main(int argc,char* argv[]){
int i;
for(i = 0; i < argc; ++i){
printf("argv[%d] is:\t%s\n",i,argv[i]);
}
printf("CtoASM_test end.\n");
}
若直接默认编译,命令行输入cl CtoASM_test.c,则会产生对象文件*.obj和目标文件*.exe
命令行输入dir 列出测试目录文件清单如下,多了obj和exe编译产生的文件
CtoASM_test.c
CtoASM_test.exe
CtoASM_test.obj
若想得到c文件对应的汇编语言文件,可以指定汇编文件产生选项 /Fa,即cl /Fa CtoASM_test.c则会同时产生汇编文件CtoASM_test.asm,内容如下
TITLECtoASM_test.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXTSEGMENT PARA USE32 PUBLIC 'CODE'
_TEXTENDS
_DATASEGMENT DWORD USE32 PUBLIC 'DATA'
_DATAENDS
CONSTSEGMENT DWORD USE32 PUBLIC 'CONST'
CONSTENDS
_BSSSEGMENT DWORD USE32 PUBLIC 'BSS'
_BSSENDS
_TLSSEGMENT DWORD USE32 PUBLIC 'TLS'
_TLSENDS
FLATGROUP _DATA, CONST, _BSS
ASSUMECS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC_main
EXTRN_printf:NEAR
_DATASEGMENT
$SG41DB'argv[%d] is:', 09H, '%s', 0aH, 00H
ORG $+3
$SG42DB'CtoASM_test end.', 0aH, 00H
_DATAENDS
_TEXTSEGMENT
_argc$ = 8
_argv$ = 12
_i$ = -4
_mainPROC NEAR
; File CtoASM_test.c
; Line 1
pushebp
movebp, esp
pushecx
; Line 3
movDWORD PTR _i$[ebp], 0
jmpSHORT $L37
$L38:
moveax, DWORD PTR _i$[ebp]
addeax, 1
movDWORD PTR _i$[ebp], eax
$L37:
movecx, DWORD PTR _i$[ebp]
cmpecx, DWORD PTR _argc$[ebp]
jgeSHORT $L39
; Line 4
movedx, DWORD PTR _i$[ebp]
moveax, DWORD PTR _argv$[ebp]
movecx, DWORD PTR [eax+edx*4]
pushecx
movedx, DWORD PTR _i$[ebp]
pushedx
pushOFFSET FLAT:$SG41
call_printf
addesp, 12; 0000000cH
; Line 5
jmpSHORT $L38
$L39:
; Line 6
pushOFFSET FLAT:$SG42
call_printf
addesp, 4
; Line 7
movesp, ebp
popebp
ret0
_mainENDP
_TEXTENDS
END
其中还可以产生其它文件,可以参考编译器的选项说明,命令行输入cl /?查看帮助,其中关于产生的输出文件类型可以有以下选择
-OUTPUT FILES-
/Fa[file] name assembly listing file /Fo name object file
/FA[sc] configure assembly listing /Fp name precompiled header file
/Fd[file] name .PDB file /Fr[file] name source browser file
/Fe name executable file /FR[file] name extended .SBR file
----------------------------------------------
补充,
其它平台的编译器也有类似的汇编输出选项,如类Unix平台的GNU编译器cc -S CtoASM_test.c和gcc -S CtoASM_test.c 都可以通过指定-S选项产生c或c++代码对应的汇编语言文件。
10分享举报