2024年C C++最全【ARM汇编】如何用汇编求最大公约数?,大厂C C++开发面试解答


丰富的网络学习资源存在多样性与广度之感,在知识体系尚未得到系统构建的情况下,在面对技术问题时往往停留在表面认识层面并缺乏深入探究的意愿,在这种情况下难以实现真正意义上的技术进步
希望获得详细的技术文档的朋友们,请您通过点击此处找到并点击链接处进行获取
个人的能力是有限的;但如果组成一个团队或集体,则能够产生更大的价值与潜力!无论你是IT行业的资深从业者还是新兴爱好者;都能加入我们的平台;让我们一起通过技术交流、分享学习资源、讨论职场趣事、获取大厂内推机会以及提供面试辅导等服务;共同进步吧!
- 如何利用汇编语言计算最大公约数?
-
C语言实现方案
-
更相减损术 - 这是一种用于计算两个整数的最大公约数的传统算法
- 图形化展示 - 使用流程图直观呈现算法步骤
- 具体示例说明 - 结合实际案例深入解析算法原理
- C语言代码实现 - 提供完整代码供直接运行使用
-
汇编语言如何实现
-
- 第一步
-
第二步
-
-
- 1.构造循环
- 2.两数比较|作差
-
-
第三步
-
汇编源码
-
调试
-
- 第一步
-
总结
-
每篇前言
ARM嵌入式基础
ARM嵌入式基础
如何用汇编求最大公约数?
| 学习任何语言都逃不掉练习求解最大公因数的算法,C语言中我们有多种求解办法——穷举法——辗转相除法——更相减损术。在汇编中我们都可以实现,今天这篇文章给大家介绍用更相减损术求解最大公约数。 |
C语言实现方法
更相减损术
更相减损术源自《九章算术》,是一项用于计算最大公因数的方法。它最初是为了简化分数运算而开发的,在任何涉及计算最大公因数的情境下也具有广泛的应用价值。
- 比较两者的大小关系:
若两者数值相同,则该数值即为其最大公约数值;
若不相同,则以较大数值减去较小数值;
然后将此较小值与其差值进行对比:
若二者结果一致,则该差值即为其最大公约数值;
若结果不一致,则需重复上述步骤直至两者的数值一致时即为其最大公约数值。
图解

举例
采用更相减损术计算98与63的最大公约数。其中63为奇数,请先将较大的数字从较小的数字中减去并反复进行此过程:首先将较大的数字从较小的数字中减去即得到如下结果:98 - 63 = 35;接着将上一步的结果从当前较大的数字中再次相减得到新的数值:即有 63 - 35 = 28;继续这一操作可得 40 - 24 = 16;随后继续应用此方法依次进行如下计算:40 - 24 = 16;接着再用新的结果继续运算……经过上述计算得出最终结果为7。因此可知这两个数值的最大公约数即为7。
C语言代码部分
//更相减损术
int gcd(int a, int b)
{
if (a == b)
{
return a;
}
else if (a > b)
{
return gcd(a - b, b);
}
else
{
return gcd(b - a, a);
}
}

汇编语言如何实现
| 在汇编中实现这个算法首先要知道汇编中的减法指令——SUB。SUB的使用方法跟ADD类似并且也可以加判断后缀。 |
汇编语言完成由三个阶段构成:1.获取两个数据;2.进行更相减损法运算;3.输出计算信息
第一步
能够调用C语言的 scanf 函数 采集自键盘输入的数据。本节我们将着重介绍 sub 指令,并为了简便起见,将两个待求数据存放在两个寄存器中。
mov r4,#98
mov r5,#63
第二步
从C程序的代码逻辑中可以看出整个算法由比较、相减和循环三个部分组成。
在编写汇编程序时可以从构建整体框架入手,在框架中先构建一个完整的循环结构。
1.构造循环
进入循环之后,只要不满足相等就继续循环。
gcd:
...
bne gcd
2.两数比较|作差
cmp的本质是通过前面的数值减去后面的数值来进行对比。随后执行的sub操作增加了后缀,并对比较结果作出响应。其中gt表用于判断大于关系(例如,在条件中若r_4的值大于r_5 ,则计算两者的差值并将其结果存储在变量r_4中)。而lt表用于判断小于关系(例如,在条件判断中若变量的值较小,则计算较大值与较小值的差并将其存储在相应变量中)。


丰富的网上学习资源存在不少。若所学知识缺乏系统性,在遇到问题时往往停留在表面层次,并不深入探究相关技术细节,则难以实现持续的技术进步。
想要获取系统化资料的朋友,请您点击此处加入我们的讨论区。
单凭个人的力量难以达到最佳状态;而一个团队则能够走得更远。无论你是IT行业的资深从业者或是充满热情的新手,我们诚邀您加入我们的圈子(提供技术支持与交流平台):技术分享与实践并行不悖(助力求职者快速成长)。我们不仅提供丰富的学习资源和职场经验分享,还设有大厂内推机会以及专业的面试辅导服务。
大量习资料堆积如山,在学成体系之前,在遇到问题时往往停留在表面,在不深入研究的情况下就难以实现真正的技术突破
一个人走得很快,但是一个团队合作能够走得更远!无论是已经在这个领域深耕的老鸟还是对这个领域充满热情的新人们,请您放心加入我们的圈子(涵盖技术交流、学习资源分享、职场吐槽与调侃、大厂内推机会以及面试辅导服务),让我们共同进步与成长!
