【ARM汇编】解决求最大公约数输入0的问题

在这里插入图片描述

CSDN话题挑战赛第1期
活动详情地址话题PK赛
参赛话题:汇编知识分享
话题描述:我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络、数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是想走的更远就必须要了解这个金字塔的底层。因此,学习汇编并不是为了用汇编在应用层设计程序,而是为了深刻理解机器运行程序的机理。就像对于人来说不能没有常识一样,尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。汇编就是计算机语言里面的常识和基础。

大家好,我是汤姆凯特。

在这里插入图片描述

每篇前言

☀️作者简介:大家好我是汤姆凯特,大家可以叫我汤姆
🐋个人主页:IM汤姆凯特的CSDN博客
🎁系列专栏:【ARM嵌入式基础】
🌱每日一句:

逐梦虽难,还请坚持!


解决求最大公约数输入0的问题?

《求最大公约数》之前的文章中用汇编求解了最大公约数,但是不是特别严谨,没有处理输入0的问题,这里给出解决在求最大公约数时,输入0的解决办法。

在之前的程序中如果输入0,会导致整个整个程序死循环,但是在实际操作中又不敢保证操作者不输入0,那么这里用软件测试的思维把,操作者可能有的操作给出解决办法。

改进过程

1.加上键入两个数据

将两个数据输入到定义的a、b中,将a、b的值分别取到r4、r5寄存器中作为求最大公约数的输入。

.data
    fmt1:.asciz " %d %d"
    fmt:.asciz "\n gcd=%d\n"
    a:.word 0  //定义两个空地址,用于存放键入的数据
    b:.word 0   
.text
.globl main
main:
    push {lr}
    ldr r0,=fmt1
    ldr r1,=a 
    ldr r2,=b 
    bl scanf    
    ldr r4,=a    //将a、b的值分别取到r4和r5中
    ldr r4,[r4]
    ldr r5,=b 
    ldr r5,[r5]

2.判断输入一个数据为0时

先判断输入一个数据为0时,当r4的值为0那么输出r5的值为gcd;当r5的值为0那么输出r4的值为gcd。

    //当r4为0时,gcd=r5
    cmp r4,#0
    bne L1     
    mov r1,r5
    ldr r0,=fmt    
    b exit

L1: //当r5为0时,gcd=r4
    cmp r5,#0
    bne L2
    mov r1,r4
    ldr r0,=fmt
    b exit

3.当输入两个数据都为0时

先加上一个输出格式串,都为0时调用输出这个语句

.data
    fmt0:.asciz "  Invalid inputs\n"  

这个判断可以放到判断r4位0的前提下,在r4为0后先不用把r5传给r1,先对r5做一下判断,如果r5不为0那就继续向下执行,如果r5为0那就是两个数都为零跳转到输出“无效输入“的分支。

    //当r4为0时,gcd=r5
    cmp r4,#0
    bne L1   
    cmp r5,#0  
    beq L0  
    mov r1,r5
    ldr r0,=fmt    
    b exit
L0:
    //当两数都为零时,输出Invalid inputs
    ldr r0,=fmt0
    mov r1,#0
    b exit  

4.当数据是正常输入时

和之前的程序一致,用辗转相减法求解

L2: //当没有数据为0时,正常使用辗转相减法求最大公约数
    cmp r4,r5
    subgt r4,r5
    sublt r5,r4
    bne L2
    ldr r0,=fmt
    mov r1,r4

汇编源码

//辗转相减法求最大公约数——解决一个数为零时输出另一个为最大公约数——两个数为零时输出输入无效

.data
    fmt0:.asciz "  Invalid inputs\n"  
    fmt:.asciz "\n gcd=%d\n"
    fmt1:.asciz " %d %d"
    a:.word 0  //定义两个空地址,用于存放键入的数据
    b:.word 0   
.text
.globl main
main:
    push {lr}
    ldr r0,=fmt1
    ldr r1,=a 
    ldr r2,=b 
    bl scanf    
    ldr r4,=a    //将a、b的值分别取到r4和r5中
    ldr r4,[r4]
    ldr r5,=b 
    ldr r5,[r5]
    bl gcd


gcd:   
    //当r4为0时,gcd=r5
    cmp r4,#0
    bne L1   
    cmp r5,#0  
    beq L0  
    mov r1,r5
    ldr r0,=fmt    
    b exit
L0:
    //当两数都为零时,输出Invalid inputs
    ldr r0,=fmt0
    mov r1,#0
    b exit  

L1: //当r5为0时,gcd=r4
    cmp r5,#0
    bne L2
    mov r1,r4
    ldr r0,=fmt
    b exit
L2: //当没有数据为0时,正常使用辗转相减法求最大公约数
    cmp r4,r5
    subgt r4,r5
    sublt r5,r4
    bne L2
    ldr r0,=fmt
    mov r1,r4
exit:
    //公共出口
    bl printf
    mov r0,#0
    pop {lr}
    mov pc,lr
.end

运行调试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZmUt7m3-1652701752626)(C:\Users\郭瑞腾\AppData\Roaming\Typora\typora-user-images\image-20220516194153735.png)]


总结

  • 在编写程序时可以用软件测试的思想将可能出现的BUG提前处理掉。
  • 编写汇编时需要处理多种情况时,可以巧妙使用分支跳转来解决问题。

本期内容就结束了,如果内容有误,麻烦大家评论区指出!
如有疑问可以在评论区留言!
下期预告: 【ARM汇编子程序】三个数求最大公约数

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

评论 90
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IM汤姆凯特

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

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

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

打赏作者

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

抵扣说明:

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

余额充值