> 文档中心 > ARM汇编两数求和

ARM汇编两数求和

通过两数求和搞懂ARM汇编语言基本框架

我们用C语言写的两数之和很简单

#include​int main(){    int a,b,sum;    a=5;    b=9;    sum=a+b;    printf("%d\n",sum);    return 0; } 

在主函数中定义三个变量,然后相加,打印出来,最后返回

   我们也可以通过C转换到汇编的方法来参考学习,详见上一篇C语言转汇编


ARM汇编语言写两数之和的基本框架也是这样

1.先定义全局变量

.data     //在这里面声明全局变量   str: .asciz "%5d\n"  // 定义一个以空结尾的输出格式   a: .word 5    //定义两个int类型的数值   b: .word 9

2.主函数部分给出框架

.globl main  //将main定义成一个可以访问的接口 main:       //main的内容写在里面   stmfd sp!,{lr}   // 把返回地址推到堆栈上    ……     mov r0, #0       // return 0;   ldmfd sp!,{lr}   // 从堆栈弹出返回地址 mov pc, lr         // return to Linux .end // 结束汇编程序

这就实现了基本框架

3.把我们想实现的两数之和给填到main中

在全局变量中定义了两个数,他们定义到了内存中,也就是说a和b的地址都在内存中,我们首先要把他们的地址从内存中取出,为什么用r0 因为 (r0~r3)这四个寄存器常用做传参,r0常用做传递返回值

//用这两条语句    ldr r0,=a    ldr r1,=b

然后需要把他值的地址,传递给寄存器用于计算

ARM的所有运算只能在寄存器中,但是这里要注意,不能用(r0~r3)也不能用(r11这是C语言中的堆栈针指针)、(r13~r15)

    ldr r4,[r0]    ldr r5,[r1]

然后就可以直接用add 指令,把两个值加起来,然后通过bl调用C中的printf ,这里要知道的是,printf是从寄存器r1的内容开始输出,在格式中定义输出几个就输出几个数

   add r1,r4,r5   ldr r0, =str        // 加载指向格式化字符串的指针   bl printf 

这就完成了我们的需求,成功输出两数之和

4.我们看一下完整程序和运行结果


本期结束,听懂掌声✿✿ヽ(°▽°)ノ✿如有疑问或错误,希望大家评论区留言指出,谢谢支持!!

下期预告:ARM汇编实现循环

造句网