汇编指令的嵌入
为了提高C语言程序内某特殊功能段的处理效率,我们可以在其源程序中嵌入一段汇编语言程序段。这样做,虽然能达到提高了程序处理效率的目的,但它无疑以丧失源程序的可移植性为代价。所以,当想用C语言和汇编语言混合编程时,程序员需要权衡采用这种方法的利与弊。
在C语言中,嵌入汇编语言的语法如下(*):
asm <opcode> <operands> <; or newline>
注意:这里的分号';'不是汇编语言中起注释作用的分号,而是作为语句的分隔符。
若C语言源程序中嵌入一条汇编语句,则可按下列方式来做:
asm mov ax, data
若要嵌入一组汇编语句,则需要用括号'{'和'}'把它们括起来。
asm {
mov ax, data1
xchg ax, data2
mov data1, ax //实现整型变量data1和data2之值的交换
}
例12.1 在C语言源程序中嵌入汇编语言语句实现赋值语句A=A B C,其中:A、B、C都是整型变量。
解: ……
asm {push ax //实现整型变量A=A B C
mov ax, A
add ax, B
add ax, C
mov A, ax
pop ax
}
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语言语句 |
|
|
|
;{ ;return(a b c); |
|
|
|
;} |
|
|
|
;void main() |
|
;{int a, b, c; ;局部变量是用堆栈来存储的,请见第7.5.10节 |
|
; a = b = 12; ;给局部变量赋值 |
|
|
|
; c = 32; |
|
; printf("%d", sum(a,b,c)); ;调用系统标准函数 |
|
; } |
|
_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 |