通过两数求和搞懂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汇编实现循环