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语言代码
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 汇编语言代码

汇编函数代码
汇编语言中需要注意的是,使用export标识sum代码段可以被外部函数调用。

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

三、ADS调试过程

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

四、附录

程序源代码:

原文地址:https://www.cnblogs.com/ZHJ0125/p/12904481.html