网站大量收购独家精品文档,联系QQ:2885784924

c调用汇编子程序.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

zhuliyan1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档