12.2 C语言源程序的汇编输出
优质
小牛编辑
143浏览
2023-12-01
12.2 C语言程序的汇编输出
在Turbo C++或Borland C++编程环境下,我们可TCC或BCC行命令把一个C语言的源程序转换成汇编语言的源程序。通过阅读汇编语言程序可以很准确地知道C语言语句的功能是如何实现的,这样,可为将来学习《编译原理》课程中的"寄存器调度"和"代码生成"等相关知识打下良好的基础。
C语言源程序转换的命令格式如下:
TCC -S t1.cpp 或 BCC -S t1.cpp ;假设其文件名为t1.cpp
若命令TCC/BCC不带参数的话,则将显示其使用方法。
下面是C语言程序及其相对应的汇编语言程序,希望读者能逐行对照理解它们语句之间的转换关系,这将能进一步理解高级语言的语句功能。
1、C语言程序清单
#include <stdio.h>
int sum(int a, int b, int c)
{
return (a+b+c);
}
void main()
{int a, b, c;
a = b = 12;
c = 32;
printf("%d", sum(a,b,c));
}
2、生成的汇编语言程序清单
…… ;一系列辅助说明信息 | |
_TEXT segment byte public 'CODE';代码段的开始 | |
;int sum(int a, int b, int c) ;C语言语句 | |
assume cs : _TEXT @sum$qiii proc near ;过程说明,对应于C语言sum过程 push bp ;为读取堆栈中的参数作准备,可参见第7.3.3节内容 mov bp, sp | |
;{ ;return(a+b+c); | |
mov ax, word ptr [bp+4] add ax, word ptr [bp+6] add ax, word ptr [bp+8] jmp short @1@58 @1@58: | |
;} | |
pop bp;sum子程序结束的代码 ret @sum$qiii endp | |
;void main()assume cs : _TEXT _main proc near ;过程说明,对应于C语言中的主函数main() push bp mov bp, sp sub sp, 6 | |
;{int a, b, c;;局部变量是用堆栈来存储的,请见第7.5.10节 | |
; a = b = 12;;给局部变量赋值 | |
mov ax, 12;用给堆栈单元赋值来实现对局部变量的赋值 mov word ptr [bp-4], ax mov word ptr [bp-2], ax | |
; c = 32; mov word ptr [bp-6], 32 | |
; printf("%d", sum(a,b,c));;调用系统标准函数 push word ptr [bp-6] push word ptr [bp-4] push word ptr [bp-2] call near ptr @sum$qiii;用汇编语言形式调用自定义函数sum add sp, 6 push ax mov ax, offset DGROUP : s@ push ax call near ptr _printf;用汇编语言调用标准函数printf pop cx pop cx | |
; }mov sp, bp ;main子程序结束的代码 pop bp ret _main endp | |
_TEXT ends;代码段的结束 | |
_DATA segment word public 'DATA' ;数据段的定义 s@ label byte db '%d' db 0 _DATA ends | |
public _main ;下面说明函数的属性,请见第7.6.3节 |