关于 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,然后进行数组元素的操作。