????????指令集是CPU體系架構(gòu)的重要組成部分。C語(yǔ)言的語(yǔ)法是對(duì)解決現(xiàn)實(shí)問(wèn)題的運(yùn)算和流程的方法的高度概況和抽象,其主要為算術(shù)、邏輯運(yùn)算和分支控制,而指令集就是對(duì)這些抽象的詳細(xì)支持,匯編僅僅只是是為了讓開(kāi)發(fā)者更好地記住指令,但它跟CPU所認(rèn)的機(jī)器碼事實(shí)上是一一相應(yīng)的,因此匯編也是低級(jí)語(yǔ)言。
????????CPU的指令運(yùn)行一般包含取指、譯碼和運(yùn)行,這是經(jīng)典的三級(jí)指令運(yùn)行流水線(xiàn),教科書(shū)上往往以這三種過(guò)程來(lái)描寫(xiě)敘述,arm7也是。可是現(xiàn)代的CPU設(shè)計(jì)往往使用更廣泛使用的5級(jí)流水線(xiàn),也就是分為取指、譯碼、運(yùn)行、訪(fǎng)存和回寫(xiě)。為什么要分為5級(jí)?這是由流水線(xiàn)的各個(gè)階段的時(shí)間來(lái)決定的。我們能夠考慮現(xiàn)實(shí)生活的工廠(chǎng)的流水線(xiàn)。
??????? 如果某流水線(xiàn)僅僅有 三個(gè)工序,有三個(gè)工人A、B、C,則這條生產(chǎn)線(xiàn)的效率就取決于效率最低的那個(gè)工人的效率?,F(xiàn)如果B做完其負(fù)責(zé)的工序須要10秒,而A和C完畢僅僅須要5秒,總共要完畢4個(gè)產(chǎn)品。那總時(shí)間應(yīng)該是:5+10*4+5 = 50秒,(第一個(gè)5是A先做第一道工序的時(shí)間,這時(shí)B和C都得等,而最后一個(gè)5是C必須要等B所有完畢后才干開(kāi)始)即會(huì)出現(xiàn)C在等待,而B(niǎo)一直在忙死忙活的場(chǎng)景。 ?
??????? 當(dāng)然,不管如何,流水線(xiàn)的運(yùn)行總比完畢沒(méi)有流水好,就好比A、B、C負(fù)責(zé)的工作都由一個(gè)人去做,那做完一個(gè)得20秒。所有做完得20*4 = 80秒。
??????? 最理性的場(chǎng)景就是三個(gè)人做事的效率是一樣的,那就不會(huì)出現(xiàn)等待的情況。那如今確實(shí)遇到B工作效率最低的問(wèn)題,怎么解決呢?就是將B的工作又一次分解,平均分成兩個(gè)工序,也就是B1和B2,分別都是5秒完畢,那完畢的總時(shí)間是40秒。
???????? CPU指令的三級(jí)流水運(yùn)行正是遇到各步驟流水時(shí)間不均的問(wèn)題,也就是取指和譯碼往往比較快,而運(yùn)行包含運(yùn)算和訪(fǎng)問(wèn)寄存器、內(nèi)存或者回寫(xiě)等功能,因此運(yùn)行的時(shí)間一般比取指和譯碼要長(zhǎng),取指和譯碼能夠在單時(shí)鐘周期內(nèi)完畢,但運(yùn)行須要2到3個(gè)時(shí)鐘周期才干完畢。要想得到更高的流水效率,就須要將運(yùn)行部分分解為運(yùn)行(運(yùn)算等)、訪(fǎng)存(內(nèi)存)和回寫(xiě)(寄存器)。
?????????CPU指令的流水線(xiàn)運(yùn)行對(duì)于軟件開(kāi)發(fā)者來(lái)說(shuō),最重要的就是要知道當(dāng)前PC(程序計(jì)數(shù)寄存器)的值與當(dāng)前運(yùn)行指令的關(guān)系。取指指的是CPU依據(jù)當(dāng)前PC的值內(nèi)存的相應(yīng)地址去取指令,因此PC值永遠(yuǎn)都指的都是當(dāng)前取指令步驟的地址,而譯碼則是CPU的一部分電路依據(jù)取出來(lái)的指令機(jī)器碼進(jìn)行譯碼,選擇相應(yīng)的電路來(lái)運(yùn)行這條運(yùn)行,如選擇加法電路還是減法電路,還是邏輯與電路等等;運(yùn)行就是這個(gè)電路的運(yùn)行過(guò)程了。
???????? arm7的流水線(xiàn)示意圖是:
?
????????????? 從圖能夠看到在T1時(shí)刻,CPU的運(yùn)行電路運(yùn)行的是MOV指令,而取指電路取的是SUB指令,因此當(dāng)前運(yùn)行電路的MOV相應(yīng)的運(yùn)行地址應(yīng)該是當(dāng)前PC值減8. 假設(shè)當(dāng)前運(yùn)行的指令是一個(gè)函數(shù)調(diào)用(即BL指令),但返回地址就應(yīng)該是ADD指令所在的地址,即(PC減4)。
?
????????有人問(wèn)到流水線(xiàn)斷流的問(wèn)題,補(bǔ)充說(shuō)明一下,斷流主要有下面情況:
??????? 1)數(shù)據(jù)相關(guān)。如第二條指令須要的數(shù)據(jù)正好是第一條指令運(yùn)行的結(jié)果。這時(shí)第二條必須等待。
????????2)分支跳轉(zhuǎn)。指令分支推斷之后,可能會(huì)順序運(yùn)行,也可能跳轉(zhuǎn)到其它地方,這時(shí)也會(huì)引起流水線(xiàn)的斷流。
?
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
