【ARM汇编练习】汇编基本框架|两数求和

举报
IM汤姆凯特 发表于 2022/04/19 17:10:14 2022/04/19
【摘要】 ARM汇编两数求和、ARM汇编语言基本框架

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


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

#include<stdio.h>
​
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汇编实现循环

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。