CSDN話題挑戰(zhàn)賽第1期
活動(dòng)詳情地址:話題PK賽
參賽話題:匯編知識(shí)分享
話題描述:我們的計(jì)算機(jī)知識(shí)就像一座金字塔,底層是數(shù)學(xué),上面是數(shù)字電路,然后是匯編,再往上是操作系統(tǒng)、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)、高級(jí)編程語(yǔ)言、框架等等…我們不可能精通這個(gè)金子塔的每一層, 但是想走的更遠(yuǎn)就必須要了解這個(gè)金字塔的底層。因此,學(xué)習(xí)匯編并不是為了用匯編在應(yīng)用層設(shè)計(jì)程序,而是為了深刻理解機(jī)器運(yùn)行程序的機(jī)理。就像對(duì)于人來(lái)說(shuō)不能沒(méi)有常識(shí)一樣,盡管常識(shí)不能直接掙錢吃飯,但它影響談吐,影響你的判斷力和決斷力,決定著你接受新事物和新知識(shí)的程度。匯編就是計(jì)算機(jī)語(yǔ)言里面的常識(shí)和基礎(chǔ)。
大家好,我是湯姆凱特。
??作者簡(jiǎn)介:大家好我是湯姆凱特,大家可以叫我湯姆
??個(gè)人主頁(yè):IM湯姆凱特的CSDN博客
??系列專欄:【ARM嵌入式基礎(chǔ)】
??每日一句:只有經(jīng)過(guò)長(zhǎng)時(shí)間完成其發(fā)展的艱苦工作,并長(zhǎng)期埋頭沉沒(méi)于其中的任務(wù),方可有所成就。——黑格爾
如何用匯編求最大公約數(shù)?
學(xué)習(xí)任何語(yǔ)言都逃不掉練習(xí)求解最大公因數(shù)的算法,C語(yǔ)言中我們有多種求解辦法——窮舉法——輾轉(zhuǎn)相除法——更相減損術(shù)。在匯編中我們都可以實(shí)現(xiàn),今天這篇文章給大家介紹用更相減損術(shù)求解最大公約數(shù)。 |
C語(yǔ)言實(shí)現(xiàn)方法
更相減損術(shù)
更相減損術(shù)是出自《九章算術(shù)》的一種求最大公約數(shù)的算法,它原本是為約分而設(shè)計(jì)的,但它適用于任何需要求最大公約數(shù)的場(chǎng)合。
? 1.先判斷兩個(gè)數(shù)的大小,如果兩數(shù)相等,則這個(gè)數(shù)本身就是就是它的最大公約數(shù)。
??2.如果不相等,則用大數(shù)減去小數(shù),然后用這個(gè)較小數(shù)與它們相減的結(jié)果相比較,如果相等,則這個(gè)差就是它們的最大公約數(shù),如果不相等,則繼續(xù)執(zhí)行2操作,直到兩個(gè)數(shù)相等時(shí)為兩個(gè)數(shù)的最大公約數(shù)。
圖解
舉例
例:用更相減損術(shù)求98與63的最大公約數(shù)。
解:由于63不是偶數(shù),把98和63以大數(shù)減小數(shù),并輾轉(zhuǎn)相減:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以,98和63的最大公約數(shù)等于7。
C語(yǔ)言代碼部分
//更相減損術(shù)
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);
}
}
匯編語(yǔ)言如何實(shí)現(xiàn)
在匯編中實(shí)現(xiàn)這個(gè)算法首先要知道匯編中的減法指令——SUB。SUB的使用方法跟ADD類似并且也可以加判斷后綴。 |
匯編語(yǔ)言實(shí)現(xiàn)整體分為三個(gè)步驟:1.讀取兩個(gè)數(shù)值。2.更相減損法運(yùn)算。3.顯示計(jì)算結(jié)果。
第一步
可以調(diào)用C的scanf函數(shù),讀取鍵盤上鍵入的數(shù)據(jù)。我們這里重點(diǎn)講解sub指令,所以簡(jiǎn)化鍵入步驟,直接用兩個(gè)寄存器存放兩個(gè)待求數(shù)據(jù)。
mov r4,#98
mov r5,#63
第二步
通過(guò)C的代碼我們也可以看出,整個(gè)算法包括——比較、相減、循環(huán)三個(gè)部分。
在寫匯編時(shí)可以先從框架入手,首先把循環(huán)構(gòu)造出來(lái),然后在循環(huán)中比較,然后根據(jù)比較的不同結(jié)果相減。
1.構(gòu)造循環(huán)
進(jìn)入循環(huán)之后,只要不滿足相等就繼續(xù)循環(huán)。
gcd:
...
bne gcd
2.兩數(shù)比較|作差
cmp本質(zhì)是用前面數(shù)減后面數(shù),下面sub減語(yǔ)言加了后綴,為比較的結(jié)果做出反應(yīng),gt表大于(即:當(dāng)r4大于r5,用r4-r5結(jié)果存到r4),lt表小于(即:當(dāng)r4小于r5,用r5-r4結(jié)果存到r5)。
cmp r4,r5
subgt r4,r5
sublt r5,r4
第三步
當(dāng)滿足兩數(shù)相等,循環(huán)相減完成,那么此時(shí)r4=r5的值且為兩數(shù)的最大公因數(shù),任意將r4或r5的值傳給r1,調(diào)用printf輸出即可。
調(diào)用printf,必須現(xiàn)在全局變量中定義輸出的格式串。
.data
fmt:.asciz "\n gcd=%d\n"
main:
......
ldr r0,=fmt
mov r1,r4
bl printf
匯編源碼
//輾轉(zhuǎn)相減法求最大公約數(shù)
//輾轉(zhuǎn)相減法求最大公約數(shù)
.data
fmt:.asciz "\n gcd=%d\n"
.text
.globl main
main:
push {lr}
mov r4,#98
mov r5,#63
gcd:
cmp r4,r5
subgt r4,r5
sublt r5,r4
bne gcd
ldr r0,=fmt
mov r1,r4
bl printf
mov r0,#0
pop {lr}
mov pc,lr
.end
運(yùn)行調(diào)試
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-822134.html
總結(jié)
- SUB是不帶借位的減法指令,功能是(OP1)←(OP1)-(OP2)。
- 再寫匯編程序時(shí),可以先把整體框架寫出,再把循環(huán)框架寫出,然后再往框架中添加想要實(shí)現(xiàn)的功能
- 在匯編中輾轉(zhuǎn)相減使用循環(huán)、CMP、SUB指令即可完成算法功能。
CSDN話題挑戰(zhàn)賽第1期
活動(dòng)詳情地址:話題PK賽文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-822134.html
到了這里,關(guān)于【ARM匯編】如何用匯編求最大公約數(shù)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!