#include;C语言库函数文件

extern void Input(void);

;用extern声明,这是C语言对汇编语言的Input函数的调用,对整数的输入

extern void Display(char *sting,int length);

;用extern声明,这是C语言对汇编语言Display函数的调用,显示最终的平均数

void Bverage (void);

;汇编语言对C语言的调用,Bverage函数的功能是求所有输入的数字的平均数

int Total=0; ;全局变量,用于计算存储所有数字的和

int in=0; ;全局变量,用于存储输入的总数字的个数

double average; ;全局变量,用于参数传递,存储计算的平均数

int main(void) ;C中的主函数

{

char *string=0; ;字符串用于存储平均数转化的字符串

int length; ;字符串的长度

printf("How many numbers:\n");

scanf("%d",&in);

Input(); ;调用Input()函数进行每一个数字的输入

string=gcvt(average,10,string); ;库函数将平均数转化成字符串存在以string开始的内存空间中

length=strlen(string); ;求字符串的长度

Display(string,length); ;对字符串的显示函数

return 1;

}

void Bverage(void) ;汇编语言调用的求平均数的函数

{

double average;

Total=(double)Total;

average=Total/in;

}

ZUIHOU1.ASM

extrn _Bverage:far ;求平均数的函数的属性far,采用汇编语言对C的调用

extrn _in:word,_Total:word ;全局变量in存放输入的总数字的个数,Total存放所有的数字的和

.model small

.code

public _Input ;Input函数调用

_Input proc

push bp

mov bp,sp ;对bp寄存器压入堆栈

xor ax,ax

xor cx,cx

mov cx,_in ;将数字的总的个数存放在CX寄存器中,用在循环

lop:

xor ax,ax

mov ah,01h ;调用02h系统中断,输入字符串

int 21h

sub al,30h ;将字符串转换成响应的ASCII码

add ax,_Total

mov _Total,ax ;将结果累加到Total变量中

loop lop

call _Bverage ;调用Bverage函数求平均数

mov ah,4ch

int 21h

ret

_Input endp ;子函数结束

End

ZUIHOU2.ASM代码:

.model small

.code

public _Display ;Display函数用于显示平均数结果

_Display proc

push bp ;将bp寄存器压入堆栈

mov bp,sp

xor cx,cx

xor si,si

mov si,[bp+4] ;将字符串的基地址赋给si

mov cx,[bp+6] ;将字符串的长度赋值给CX寄存器

lop1:

mov dl,[si] ;调用02h系统中断屏幕显示字符

mov ah,02h

int 21h

inc si

loop lop1 ;用循环对每一个字符处理

mov ah,4ch

int 21h

ret

_Display endp ;函数结束

End

3.汇编函数的流程图

ZUIHOU1.ASM的流程图:(Input函数)

STAERT

Push bp

CX=in

CX=0?

YES

Call Bverage求平均数

Mov ah,0ah,

int 21h

NO

END

输入字符串

DEC CX

Total=Total+ax

循环将字符串转化成ASCII码

ZUIHOU2.ASM的流程图:(Display函数)

START

Si=[bp+4]

Cx=[bp+6]

CX=0?

YES

NO

END

Mov ah,02h

Int 21h

DL=[si]

DEC CX

四:程序运行结果截图。

五:结论和启示

结论:

本次实验的目的是采用汇编语言对C语言函数的调用求输入的数字的平均数,通过本次试验,学习到了汇编程序对C语言程序的调用的方式,以及公共变量的声明,在汇编函数中应该对所调用的C语言的函数用extrn声明,同时对全局变量用extrn声明。在C语言中对汇编函数的调用也应该用extern进行声明,并且采用的是值传递的方式,对于数组采用地址传递的方式,同时也可以使用C语言和汇编语言的混合调用实现相应的功能。

启示:

本次试验是最后一个实验,通过本次实验的学习,在很大程度上学会了C语言和汇编语言的相互调用,体会到在汇编语言的学习中,应该更加的认真,仔细,对于每一条指令应该熟悉的掌握。汇编语言和C语言之间的相互调用也是学习的重点。

更多推荐