一、问题分析
本程序通过在C语言中调用求和函数,实现超过32位数的相加。求和函数要求使用汇编语言编写,C语言中调用该外部函数。需要注意的是,在C语言中定义超过32位的数据,需要将变量设置为long long int
等足够大的数据类型。
- 在参数传递的过程中需要注意的是:
- 在参数传递时,如果少于4个,使用寄存器r0-r3来传递;超过4个的参数,用栈来传递;
- 返回值的传递规则是,如果不大于32个2进制位,用R0来传递,否则,用R1与R0来传递。
所以参数传递应该是由R0和R1传递第一个数据,由R2和R3传递第二个数据。返回值也是通过R0和R1一起返回的。
二、编写代码
2.1 C语言代码
C语言代码中需要注意的是,求和函数sum需要事先声明,使用extern long long int sum(long long int, long long int);
语句进行函数声明。
- 代码流程:
- 首先声明了sum为外部的函数
- 进入主函数main
- 分别定义了三个
long long int
类型的变量,其中num1的值为2^32-1,也就是32位数据的最大值;
num2的值为1000000000,是为了方便观察实验结果;result变量用来表示计算的结果。 - 调用sum函数,计算num1+num2的值,结果放到result变量中。
- 使用输出语句输出计算结果
- 使用判断语句,验证计算的结果
- 结束程序
2.2 汇编语言代码
汇编语言中需要注意的是,使用export
标识sum代码段可以被外部函数调用。
- 代码流程:
- 定义代码段sum,用来实现数据相加
- 使用export声明sum可以被外部函数调用
- 进入程序后,首先使用adds指令,将两个数的低位数据相加,进位值C产生进位
- 使用adc指令将两数的高位相加,同时加上进位标志C
- 使用mov指令回到被调用的位置
- 结束编译
三、ADS调试过程
- 运行ADS软件,进入调试界面
首先出来的是一大堆汇编的代码,现在直接运行(Go),程序会在main函数入口处停下。
- 初始化变量数据
程序前半部分,关于数据初始化的内容,我就直接单步运行过去,不再记录了。 - 调用汇编函数
现在程序停到了调用汇编函数的这条语句上。
使用step in进入该汇编函数。
可以看到,num1被传到了R0R1中(0xFFFFFFFE),num2被传到了R2R3中(0x3B9ACA00)。
下面执行adds指令,将低位的R0和R2相加,结果放置R0中,产生进位C
可以看到,C标志位产生了进位。计算结果也是正确的。
上面结果中最高位的1就表示进位了。
下面执行adc指令,将两个数的高位分别相加,同时加上C标志位。
可以看到,相加的结果只有1,也就是只有标志位被加上了,说明原本两数的高位均为0。
接下来执行mov指令,返回到被函数调用的位置。
接下来数据就已经被传过来了,最终的结果放在R0和R1中。
R0是低位,R1是高位。
现在,全速直接运行程序,就可以在控制台看到数据结果了。
在C语言中,加上了判断语句,当程序调用成功时,会显示提示性语句” Result is right!”。
程序调试结束。
四、附录
程序源代码: