3.5.4 大小端——小問題,大折騰
在不同的處理器中,相同的數(shù)據(jù)在存儲器中的存儲格式可能不一樣。如下圖所示,數(shù)值0x12345678在大端字節(jié)序和小端字節(jié)序處理器的存儲器中存儲形式分別為:
大端、小端這兩個(gè)術(shù)語來源于小說《格利弗游記》(Gulliver’s Travels)。小人國里的小人們分成了兩大陣營:一派敲破雞蛋“大”的一頭吃雞蛋,一派敲破雞蛋“小”的一頭吃雞蛋。其實(shí)怎么吃都沒有關(guān)系,只是習(xí)慣不同。
Intel的x86處理器使用小端字節(jié)序,很多處理器既可以配置為大端,又可以配置為小端,在不同字節(jié)序計(jì)算機(jī)之間通信時(shí),就需要注意數(shù)據(jù)格式的轉(zhuǎn)換。
3.5.5 指令類型——我們需要哪些指令
處理器要完成計(jì)算的任務(wù),需要具備哪些指令呢?我們用如下這個(gè)計(jì)算為例:
xi為輸入信號,coeffi為濾波器系數(shù)。要讓處理器完成這些工作,首先需要兩個(gè)運(yùn)算:乘法和加法。與此類似的還有移位、減法等指令,這些指令被稱為算術(shù)邏輯指令。
除了做計(jì)算外,處理器還要能實(shí)現(xiàn)循環(huán),上面這個(gè)計(jì)算循環(huán)了count次。循環(huán)是由跳轉(zhuǎn)指令來實(shí)現(xiàn)的,跳回去執(zhí)行就能實(shí)現(xiàn)循環(huán)。如右圖 所示。
循環(huán)需要在一定條件下跳出,否則就成死循環(huán)了,條件跳轉(zhuǎn)指令能完成這個(gè)功能。條件跳轉(zhuǎn)指令在一定條件下實(shí)現(xiàn)跳轉(zhuǎn),它能實(shí)現(xiàn)分支功能,例如:“如果明天下雨,我就在家,否則,我就出去玩?!边@個(gè)功能就可以用條件跳轉(zhuǎn)指令完成。跳轉(zhuǎn)指令也稱為控制指令。
解決了這些基本的運(yùn)算問題后,還剩下一個(gè)問題,那就是:操作的數(shù)據(jù)在哪?操作的數(shù)據(jù)都放在存儲器中。在x86指令集中,算術(shù)邏輯指令的操作數(shù)可以是寄存器,也可以是存儲器,而在其他的RISC指令集中,算術(shù)邏輯指令的操作數(shù)只能是寄存器,因此需要先使用導(dǎo)入(load)指令將存儲器中的數(shù)據(jù)導(dǎo)入到寄存器中,運(yùn)算完成后,再用導(dǎo)出(store)指令將寄存器中的數(shù)據(jù)導(dǎo)出到存儲器中。這類指令稱為數(shù)據(jù)傳送指令。不同的指令集,指令命名、寄存器命名不一樣,不過基本規(guī)則類似。
導(dǎo)入、導(dǎo)出指令的基本格式如下:
load *A1, A2;將存儲器某地址處的值導(dǎo)入到寄存器A2中,該存儲器地址記錄在寄存器A1中
store A3, *A4;將寄存器A3的值導(dǎo)出到存儲器某地址處,該存儲器地址記錄在寄存器A4中
有了這3類指令(算術(shù)邏輯指令,控制指令,數(shù)據(jù)傳送指令),處理器就能完成各種復(fù)雜的運(yùn)算。
3.5.6 尋址方式——千萬里,我追尋著你
指令的操作數(shù)可以是一個(gè)具體的值,如100(稱為立即數(shù)),也可以是寄存器,也可以是存儲器。真實(shí)參與運(yùn)算的值,到底是立即數(shù),還是在寄存器中,還是在存儲器中,在存儲器中的哪個(gè)位置,這些就要靠尋址方式來指定。以RISC指令集的代表MIPS為例:
add $s1,$s2,100;源操作數(shù)是寄存器$s2和立即數(shù)100,稱為立即數(shù)尋址
add $s1,$s2,$s2;源操作數(shù)是兩個(gè)寄存器,稱為寄存器尋址
lw $s1,100($s2);存儲器地址為100+$s2,將這個(gè)地址處的值導(dǎo)入到寄存器$s1中,稱為存 儲器尋址
存儲器尋址又會分成更多的類型,RISC指令集的尋址方式較為簡單,x86的尋址方式則非常復(fù)雜,不過x86復(fù)雜的尋址方式也會在內(nèi)部轉(zhuǎn)化為類似RISC的多條簡單微操作。
3.5.7 總結(jié)
指令集是處理器的臉面,就如同容貌對于人的重要性一樣,程序員在為處理器編寫程序時(shí),指令集就是他(她)們所看到的處理器的容貌。好的指令集,應(yīng)該具備如下特征:
兼容性:新一代處理器的指令集要兼容上一代的指令集。
易實(shí)現(xiàn):指令所完成的功能,在處理器硬件上要容易實(shí)現(xiàn)。
易編程:編程人員容易使用該指令集進(jìn)行編程。
高性能:指令集設(shè)計(jì)合理,以使得程序的執(zhí)行效率最高。