经典汇编语言教程:12.2 C语言源程序的汇编输出

12.2 C语言源程序的汇编输出

在Turbo C++或Borland C++编程环境下,我们可TCC或BCC行命令把一个C语言的源程序转换成汇编语言的源程序。通过阅读汇编语言程序可以很准确地知道C语言语句的功能是如何实现的,这样,可为将来学习《编译原理》课程中的"寄存器调度"和"代码生成"等相关知识打下良好的基??/p>

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 经典汇编语言教程:12.2 C语言源程序的汇编输出58
经典汇编语言教程:12.2 C语言源程序的汇编输出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节
public @sum$qiii
extrn _printf : near
_s@ equ s@
end

上页:上一课 下页:下一课

经典汇编语言教程·相关目录

第1章 汇编语言的由来,数据类型第2章 CPU资源和存储器
第3章 操作数的寻址方式第4章 标识符和表达式
第5章 微机CPU的指令系统第6章 程序的基本结构
第7章 子程序和库第8章 输入输出和中断
第9章 宏第10章 应用程序设计
第11章 数值运算协处理器第12章 汇编语言和C语言
汇编语言重要附录Windows API函数大全
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号