ARM汇编两数求和
通过两数求和搞懂ARM汇编语言基本框架
我们用C语言写的两数之和很简单
#includeint 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汇编实现循环