C语言调用汇编函数 实现超过32位数的加法

计算两个大数的和(超过32位)
C语言调用汇编函数,汇编函数实现加法功能,计算结果在控制台显示

一、问题分析

本程序通过在C语言中调用求和函数,实现超过32位数的相加。求和函数要求使用汇编语言编写,C语言中调用该外部函数。需要注意的是,在C语言中定义超过32位的数据,需要将变量设置为long long int等足够大的数据类型。

  • 在参数传递的过程中需要注意的是:
  1. 在参数传递时,如果少于4个,使用寄存器r0-r3来传递;超过4个的参数,用栈来传递;
  2. 返回值的传递规则是,如果不大于32个2进制位,用R0来传递,否则,用R1与R0来传递。
    所以参数传递应该是由R0和R1传递第一个数据,由R2和R3传递第二个数据。返回值也是通过R0和R1一起返回的。

二、编写代码

2.1 C语言代码

C语言调用汇编函数 实现超过32位数的加法
C语言代码中需要注意的是,求和函数sum需要事先声明,使用extern long long int sum(long long int, long long int);语句进行函数声明。

  • 代码流程:
  1. 首先声明了sum为外部的函数
  2. 进入主函数main
  3. 分别定义了三个long long int类型的变量,其中num1的值为2^32-1,也就是32位数据的最大值;
    num2的值为1000000000,是为了方便观察实验结果;result变量用来表示计算的结果。
  4. 调用sum函数,计算num1+num2的值,结果放到result变量中。
  5. 使用输出语句输出计算结果
  6. 使用判断语句,验证计算的结果
  7. 结束程序

2.2 汇编语言代码

C语言调用汇编函数 实现超过32位数的加法
汇编语言中需要注意的是,使用export标识sum代码段可以被外部函数调用。

  • 代码流程:
  1. 定义代码段sum,用来实现数据相加
  2. 使用export声明sum可以被外部函数调用
  3. 进入程序后,首先使用adds指令,将两个数的低位数据相加,进位值C产生进位
  4. 使用adc指令将两数的高位相加,同时加上进位标志C
  5. 使用mov指令回到被调用的位置
  6. 结束编译

三、ADS调试过程

  1. 运行ADS软件,进入调试界面
    C语言调用汇编函数 实现超过32位数的加法
    首先出来的是一大堆汇编的代码,现在直接运行(Go),程序会在main函数入口处停下。
    C语言调用汇编函数 实现超过32位数的加法
  2. 初始化变量数据
    程序前半部分,关于数据初始化的内容,我就直接单步运行过去,不再记录了。
  3. 调用汇编函数
    现在程序停到了调用汇编函数的这条语句上。
    C语言调用汇编函数 实现超过32位数的加法
    使用step in进入该汇编函数。
    C语言调用汇编函数 实现超过32位数的加法
    可以看到,num1被传到了R0R1中(0xFFFFFFFE),num2被传到了R2R3中(0x3B9ACA00)。
    C语言调用汇编函数 实现超过32位数的加法
    C语言调用汇编函数 实现超过32位数的加法
    下面执行adds指令,将低位的R0和R2相加,结果放置R0中,产生进位C
    C语言调用汇编函数 实现超过32位数的加法
    可以看到,C标志位产生了进位。计算结果也是正确的。
    C语言调用汇编函数 实现超过32位数的加法
    上面结果中最高位的1就表示进位了。
    下面执行adc指令,将两个数的高位分别相加,同时加上C标志位。
    C语言调用汇编函数 实现超过32位数的加法
    可以看到,相加的结果只有1,也就是只有标志位被加上了,说明原本两数的高位均为0。
    接下来执行mov指令,返回到被函数调用的位置。
    C语言调用汇编函数 实现超过32位数的加法
    接下来数据就已经被传过来了,最终的结果放在R0和R1中。
    C语言调用汇编函数 实现超过32位数的加法
    R0是低位,R1是高位。
    现在,全速直接运行程序,就可以在控制台看到数据结果了。
    C语言调用汇编函数 实现超过32位数的加法
    在C语言中,加上了判断语句,当程序调用成功时,会显示提示性语句” Result is right!”。
    程序调试结束。

四、附录

程序源代码: