zoukankan      html  css  js  c++  java
  • 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!”。
      程序调试结束。

    四、附录

    程序源代码:

  • 相关阅读:
    [刷题] IDA*
    [BZOJ1330] Editing a Book
    [BZOJ5449] 序列
    [刷题] 搜索剪枝技巧
    [XJOI3529] 左右
    [CF920E] Connected Components?
    [第18届 科大讯飞杯 J] 能到达吗
    洛谷 P4779 【模板】单源最短路径(标准版)
    洛谷 P1175 表达式的转换
    pipioj 1291 中缀表达式转后缀表达式I
  • 原文地址:https://www.cnblogs.com/ZHJ0125/p/12904481.html
Copyright © 2011-2022 走看看