- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c调用汇编子程序
关于c语言与汇编的编程
实验要求:
1、利用C语言调用汇编子程序
2、其中5个输入参数和3个返回结果的汇编子程序调用;
具体为:
输入整数a,b,c,d,e,;
请计算a+b+c,a+c+d+e,a-b的值;
讨论a-b后算术状态标志寄存器的状态 (ASTAT);
请讨论输入整数数组e[3],f[3],参数如何传递的;
实验源代码(含注释)
add.c文件:
#include stdio.h
#include stdlib.h
#include math.h
extern int * add(int a,int b,int c,int d,int e);//汇编子程序
void main()
{
int a,b,c,d,e;
int *result;
scanf(%d %d %d %d %d,a,b,c,d,e); //输入各个值
result=add(a,b,c,d,e); //进行运算
printf(a=%d,b=%d,c=%d,d=%d,e=%d\n\n,a,b,c,d,e);//打印出各个待运算的值
printf( a+b+c = %d\n\n, *(result-2));//输出结果,运算的结果分别
//保存在以result地址及result-1,result-2
printf( a+c+d+e=%d\n\n, *(result-1));
printf( a-b=%d\n\n, *(result));
}
aaa.asm文件
.section L1_code;
.global _add;
_add:
R4=[FP-4]; //r4存储e
R5=[FP-8]; //r5存储d
R3 = R0 + R1; //a+b
R3=R3+R2; //运算a+b+c
[P0++]=R3; //存储a+b+c到[P0],并将p0加1
R3=R0+R2; //运算a+c+d+e
R3=R3+R4;
R3=R3+R5;
[P0++]=R3; //存储a+c+d+e到[P0],并将p0加1
R3=R0-R1; //运算a-b
[P0]=R3; //存储a-b后算术寄存器的状态到[P0]
R0=P0; //把p0作为结果传回
RTS;
_add.end:
实验结果分析:
参数传递问题:
程序输入参数如下:
调用汇编子程序,R0,R1,R2值改变为输入的前三个参数,分别为a,b,c
查看FP指向的内存地址,可以看到FP-4存放第5个参数e,FP-8存放第4个参数d如下图:
状态寄存器的问题:
执行a+b+c时,状态寄存器显示如下:
执行a-b时,状态寄存器显示如下:(a=1,b=2;a-b=-1)
通过多次改变a与b的值,看a-b运算后状态寄存器的各位的值,可以发现改变值的主要有AZ,AN,AC,不难得到各位所代表的意义:
AZ:零标志位,1表示结果为零,故此处表示得数不为0;
AN:符号位,1表示结果为负值,0表示结果为正值;
AC:进位标志,此软件中1表示没有进位借位,0表示有进位借位。
输入整数数组e[3],f[3],参数传递的问题:
在程序中,将add函数中的参数改为int e[],int f[],输入各元素的值,同时监视各寄存器值的变化,可以发现,在调用add函数后,寄存器R0和R1的值改变,但寄存器的值不是数组元素的值,而是两数组的首地址,可以设想,调用子函数时,参数传递把两数组的首地址分别传给R0和R1。
在实现子函数时,不能用R0和R1直接进行操作,因为它们是数据寄存器,应该将其赋值给指针寄存器P0和P1,然后进行数组元素的操作。
文档评论(0)