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
运行调试
总结
- 在编写程序时可以用软件测试的思想将可能出现的BUG提前处理掉。
- 编写汇编时需要处理多种情况时,可以巧妙使用分支跳转来解决问题。
CSDN话题挑战赛第1期
活动详情地址:话题PK赛