logo资料库

c语言调用汇编子程序.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
关于 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 #include #include * add(int a,int b,int c,int d,int e);//汇编子程序 extern int 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));//输出结果,运算的结果分别 //进行运算 printf( "a+c+d+e=%d\n\n", *(result-1)); printf( "a-b=%d\n\n", *(result)); //保存在以 result 地址及 result-1,result-2 } aaa.asm 文件 .section L1_code; .global _add; _add: R4=[FP-4]; R5=[FP-8]; R3 = R0 + R1; R3=R3+R2; [P0++]=R3; R3=R0+R2; R3=R3+R4; //r4 存储 e //r5 存储 d //a+b //运算 a+b+c //存储 a+b+c 到[P0],并将 p0 加 1 //运算 a+c+d+e
//存储 a+c+d+e 到[P0],并将 p0 加 1 //运算 a-b //存储 a-b 后算术寄存器的状态到[P0] //把 p0 作为结果传回 R3=R3+R5; [P0++]=R3; R3=R0-R1; [P0]=R3; R0=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,然后进行数组元素的操作。
分享到:
收藏