CSDN话题挑战赛第1期
活动详情地址:话题PK赛
参赛话题:汇编知识分享
话题描述:我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络、数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是想走的更远就必须要了解这个金字塔的底层。因此,学习汇编并不是为了用汇编在应用层设计程序,而是为了深刻理解机器运行程序的机理。就像对于人来说不能没有常识一样,尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。汇编就是计算机语言里面的常识和基础。
大家好,我是汤姆凯特。
☀️作者简介:大家好我是汤姆凯特,大家可以叫我汤姆
个人主页:IM汤姆凯特的CSDN博客
系列专栏:【ARM嵌入式基础】
每日一句:越沉淀,越笃定,此刻一切正好!
在实际解决问题时,有没有一些问题是需要重复解决的。如果需要重复解决我们就可以用子程序把这部分内容封装起来,然后调用子程序接口即可简化实现。那下面我们用求三个数的最大公约数来看一下这种方式有什么需要注意的地方。
在之前的程序中我们用辗转相减法可以把两个数的最大公约数求出,那怎么求三个数呢?其实可以先把其中的两个求出来,然后再把得出的最大公约数与第三个数一块求解。这个过程中求的部分就可以用子程序来写。 |
1)程序就分为主程序和子程序两个部分
2)主程序中注意进入子程序的入口参数
3)子程序中注意最后的返回值
1)这里介绍两种定义方法,一种是定义常量,另一种是定义变量
2)在主程序中把r4和r5当做子程序的入口参数
3)使用BL + 子程序入口名调用子程序
4)主程序的结尾不需要加 .end
//辗转相减法求最大公约数
.data
fmt:.asciz "\n gcd=%d\n"
.equ a,98 //这种方式定义常量
.equ b,42
c:.word 21 //这种方式定义变量
.text
.globl main
main:
push {lr}
ldr r4,=a
ldr r5,=b
bl gcd
mov r4,r1
ldr r5,=c
ldr r5,[r5]
bl gcd
ldr r0,=fmt
bl printf
mov r0,#0
pop {lr}
mov pc,lr //这里的末尾不加 end
1)在子程序中必须要有和主程序一样的压栈出栈
2)子程序必须要明确返回值,这里将返回值存放在r4
gcd:
push {lr}
loop:
cmp r4,r5
subgt r4,r5
sublt r5,r4
bne loop
mov r1,r4
pop {lr}
mov pc,lr
.end
当把只计算a和b的最大公约数时,结果是14;当计算三个数时,结果是7 。结果正确。
CSDN话题挑战赛第1期
活动详情地址:话题PK赛