【ARM汇编子程序】求三个数的最大公约数

在这里插入图片描述

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 。结果正确。

在这里插入图片描述


总结

  • 在写子程序时需要注意的是
    1.定义子程序的名称作为入口
    2.明确入口的参数
    3.确定返回值

本期内容就结束了,如果内容有误,麻烦大家评论区指出!
如有疑问可以在评论区留言!
下期预告: ARM汇编打印金字塔

CSDN话题挑战赛第1期
活动详情地址话题PK赛

  • 39
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 57
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IM汤姆凯特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值