X86架構(gòu)與ARM架構(gòu)比較
CPU是怎樣運(yùn)作的?
本文引用地址:http://butianyuan.cn/article/201611/317799.htmCPU的運(yùn)作與人腦的運(yùn)作差不多。先談一下人這個(gè)系統(tǒng)的工作方式。眼鏡、耳朵、舌頭、皮膚等等感覺(jué)器官接收到“觸覺(jué)”,把信息傳給大腦,大腦把信息處理后,把處理結(jié)果送給手、腳、嘴等執(zhí)行器官就可以運(yùn)動(dòng)了。
人腦的功能就是從某個(gè)感覺(jué)器官讀取信息,處理信息,然后再把結(jié)果送給執(zhí)行器官。
一個(gè)完整的系統(tǒng)與人這個(gè)系統(tǒng)差不多,傳感器接收數(shù)據(jù),再把數(shù)據(jù)傳給CPU(CPU按照一定的時(shí)序、協(xié)議從內(nèi)存讀數(shù)據(jù)),CPU讀取到數(shù)據(jù)并處理,把處理結(jié)果送給執(zhí)行機(jī)構(gòu)就行了(實(shí)際上CPU就是按照一定時(shí)序、協(xié)議向內(nèi)存單元寫(xiě)數(shù)據(jù))。
CPU從內(nèi)存中獲取數(shù)據(jù),處理數(shù)據(jù),再把結(jié)果送到內(nèi)存中去。
一、指令集架構(gòu)比較
1、X86指令集架構(gòu)(Register-Memory architecture)
CPU的運(yùn)算操作數(shù)可以全部都是寄存器,也允許其中的一個(gè)操作數(shù)在memory中。所以,CPU可以通過(guò)其他指令來(lái)與memeory交互,這種架構(gòu)的指令集相對(duì)復(fù)雜。舉一個(gè)例子如下:
add mem,reg
2、ARM指令集架構(gòu)(Load-Store architecture)
CPU只允許用load/store指令來(lái)與memory(Flash、RAM)交互,而CPU的運(yùn)算全部都是在寄存器中完成。也就是說(shuō),CPU運(yùn)算的操作數(shù)只能全部來(lái)自寄存器,而且結(jié)構(gòu)也只能保存在寄存器中。所以,倘若要把RAM兩個(gè)數(shù)據(jù)相加,結(jié)果還保存到內(nèi)存中,就需要先將內(nèi)存中的數(shù)據(jù)通過(guò)load指令將內(nèi)存數(shù)據(jù)加載到寄存器中,計(jì)算結(jié)束后,再將保存結(jié)果寄存器的內(nèi)容通過(guò)store指令存儲(chǔ)在RAM中。舉一個(gè)例子如下:
ADD R0,R1,R2
3、對(duì)比分析
兩種架構(gòu)的區(qū)別在于CPU在處理數(shù)據(jù)時(shí),對(duì)內(nèi)存的訪問(wèn)實(shí)機(jī)。
X86可以在處理數(shù)據(jù)時(shí)直接讀寫(xiě)內(nèi)存,但是ARM只能先將內(nèi)存加載到寄存器才能讀,也只有借助寄存器尋址將運(yùn)算結(jié)果寫(xiě)到內(nèi)存。
ARM架構(gòu)這種LOAD/STORE架構(gòu)要比X86的Register-Memory架構(gòu)設(shè)計(jì)時(shí)容易的多,結(jié)果更簡(jiǎn)單。
二、指令集比較
說(shuō)明:本文的ARM指令集只指ARM指令集,不討論THUMB指令集
1、數(shù)據(jù)傳送指令
指令類(lèi)功能:負(fù)責(zé)把數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲(chǔ)單元中
X86數(shù)據(jù)傳送指令
指令類(lèi)型 指 令 說(shuō) 明
通用數(shù)據(jù)傳送指令 MOV(傳送)、PUSH(進(jìn)棧)、POP(出棧)、XCHG(交換)
累加器專(zhuān)用傳送指令 IN(輸入指令) 、OUT(輸入指令)
地址傳送指令 LEA(有效地址送寄存器)、LDS(指針?biāo)图拇嫫骱虳S)、LES(指針?biāo)图拇嫫骱虴S)
標(biāo)志寄存器傳送指令 LAHF(標(biāo)志送AH)、SAHF(AH送標(biāo)志寄存器)、PUSHF(標(biāo)志進(jìn)棧)、POPF(標(biāo)志出棧)
ARM數(shù)據(jù)傳送指令
指令類(lèi)型 指 令 說(shuō) 明
通用數(shù)據(jù)傳送指令 LDM(多數(shù)據(jù)裝載)、STM (多數(shù)據(jù)存儲(chǔ))、LDR(單數(shù)據(jù)裝載)、STR(單數(shù)據(jù)存儲(chǔ))、 SWP(單一數(shù)據(jù)交換)
標(biāo)志寄存器傳送指令 MRS(加載標(biāo)志寄存器到寄存器) MSR(存儲(chǔ)寄存器到標(biāo)志寄存器)
補(bǔ)充說(shuō)明:
<1> LDR/STR指令的地址,一定是(基址寄存器+/-偏移量)構(gòu)成的
<2> 出棧入棧指令:無(wú)專(zhuān)用指令,用LDM、STM指令替代
2、算術(shù)指令
指令類(lèi)功能: 算術(shù)運(yùn)算
X86算術(shù)指令
指令類(lèi)型 指 令 說(shuō) 明
加法指令 ADD(加法)、ADC(帶進(jìn)位加法)、INC(加1)
減法指令 SUB(減法)、SBB(帶借位減法)、DEC(減1)、NEG(求補(bǔ))、CMP(比較)
乘法指令 MUL(無(wú)符號(hào)數(shù)乘法)、IMUL(帶符號(hào)數(shù)乘法)
除法指令 DIV(無(wú)符號(hào)數(shù)除法)、IDIV(帶符號(hào)數(shù)除法)、CBW(字節(jié)轉(zhuǎn)換為字)、CWD(字轉(zhuǎn)換為雙字)
ARM算術(shù)指令
指令類(lèi)型指 令 說(shuō) 明
加法指令 ADC(帶進(jìn)位加法)、ADD(加法)
減法指令 SBC(帶借位減法)、SUB(減法)、CMP(比較指令)、RSB(反向減法)、RSC(帶借位的反向減法)
乘法指令 MLA(帶累加的乘法)、 MUL(乘法)
除法指令沒(méi)有專(zhuān)用除法指令,需要用函數(shù)來(lái)實(shí)現(xiàn),通常是把除法轉(zhuǎn)化為乘法來(lái)運(yùn)算
傳送類(lèi)算術(shù)指令:MOV(傳送到目的寄存器)、MVN(傳送到目的寄存器)
補(bǔ)充說(shuō)明:傳送類(lèi)算術(shù)指令兼有傳送功能和數(shù)據(jù)運(yùn)算功能
3、邏輯指令
指令類(lèi)功能: 對(duì)字或字節(jié)執(zhí)行邏輯運(yùn)算
X86邏輯指令
指令類(lèi)型 指 令 說(shuō) 明
邏輯運(yùn)算指令 AND(邏輯與)、OR(邏輯或)、NOT(邏輯非)、XOR(異或)、TEST(測(cè)試)
移位指令 SHL(邏輯左移)、SAL(算術(shù)左移)、SHR(邏輯右移)、SAR(算術(shù)右移)、ROL(循環(huán)左移)、ROR(循環(huán)右移)、RCL(帶進(jìn)位循環(huán)左移)、RCR(帶進(jìn)位右移)
ARM邏輯指令
指令類(lèi)型 指 令 說(shuō) 明
邏輯運(yùn)算指令 AND(邏輯與)、 BIC(清楚位)、EOR(邏輯異或)、ORR(邏輯或)
移位指令 LSL(邏輯或算術(shù)左移)、ASL(邏輯或算術(shù)左移)、LSR(邏輯右移)、ASR(算術(shù)右移)、 ROR(循環(huán)右移)、RRX(帶擴(kuò)展的循環(huán)右移)
4、串處理指令
指令類(lèi)功能:處理存放存儲(chǔ)器里的數(shù)據(jù)串
X86串處理指令
指令類(lèi)型 指 令 說(shuō) 明
指 令 MOVS(串傳送)、CMPS(串比較)、SCAS(串掃描)、LODS(從串?。?、STOS(存入串)
ARM串處理指令: 無(wú)
5、控制轉(zhuǎn)移指令
指令類(lèi)功能:用來(lái)控制程序的執(zhí)行流程
X86控制轉(zhuǎn)移
指令類(lèi)型 指 令 說(shuō) 明
無(wú)條件轉(zhuǎn)移指令 JMP(段間和段內(nèi)轉(zhuǎn)移)
條件轉(zhuǎn)移指令 J Z(結(jié)果為0(或相等)則轉(zhuǎn)移)、JS(結(jié)果為負(fù)則轉(zhuǎn)移)、JNS(結(jié)果為正則轉(zhuǎn)移)、JO(溢出則轉(zhuǎn)移)、JNO(不溢出則轉(zhuǎn)移)、JP(奇偶位為1則轉(zhuǎn)移)、JNP(奇偶位為0則轉(zhuǎn)移)
循環(huán)指令 LOOP(循環(huán)指令)、LOOPPZ/LOOPE(當(dāng)為0或相等時(shí)循環(huán)指令)、LOOPNZ/LOOPNE(當(dāng)不為0或不相等時(shí)循環(huán)指令)
子程序指令 CALL(調(diào)用指令)、RET(返回指令)
中斷指令 INT(中斷)、INTO(如溢出則中斷)、RIET(從中斷返回)
ARM控制轉(zhuǎn)移
指令類(lèi)型 指 令 說(shuō) 明
無(wú)條件轉(zhuǎn)移指令 B(跳轉(zhuǎn))
條件轉(zhuǎn)移指令 BEQ(相等跳轉(zhuǎn))、BNE(不等跳轉(zhuǎn))等等
子程序指令 BL(跳轉(zhuǎn),并保存下一條指令的地址到LR)、MOV PC,LR(從函數(shù)返回)
軟中斷指令 SWI(軟中斷)
補(bǔ)充說(shuō)明: ARM指令集沒(méi)有X86那樣專(zhuān)用的循環(huán)指令,這些指令都是通過(guò)B、BL指令結(jié)合其他的指令來(lái)實(shí)現(xiàn)的
6、相對(duì)跳轉(zhuǎn)指令對(duì)比
X86相對(duì)跳轉(zhuǎn)指令:
jmp short 標(biāo)號(hào)(IP=IP+8位偏移量:-128~127)、
jmp near ptr 標(biāo)號(hào)(IP=IP+16位偏移量:-32768~32767)、
loop(cx=cx-1;if(cx!=0) IP=IP+8位偏移量)
ARM相對(duì)跳轉(zhuǎn)指令:
B、
BL
說(shuō)明:B、BL指令的偏移量都是24 位有符號(hào)數(shù),左移兩位后為26位。有符號(hào)擴(kuò)展為 32 位,表示的有效偏移為 26 位(+/-32MB的地址空間)。
7、絕對(duì)跳轉(zhuǎn)指令對(duì)比
X86絕對(duì)跳轉(zhuǎn)指令:
jmp far ptr 標(biāo)號(hào)(CS=標(biāo)號(hào)所在段的段地址;IP=標(biāo)號(hào)所在段的偏移地址)、
jmp word ptr 內(nèi)存單元(段內(nèi)轉(zhuǎn)移)、
jmp dword ptr 內(nèi)存單元(段間轉(zhuǎn)移)
ARM絕對(duì)跳轉(zhuǎn)指令: 無(wú)專(zhuān)用的指令,需要用指令來(lái)模擬
<1> “ldr pc, =標(biāo)號(hào)”(相應(yīng)于B)
<2> ldr lr, =halt_loop(相應(yīng)于BL)
ldr pc, =標(biāo)號(hào)
halt_loop:
b halt_loop
三、指令集對(duì)比總結(jié)
1、ARM指令集更簡(jiǎn)潔,比較少
比如說(shuō)除法指令、循環(huán)指令、堆棧專(zhuān)用指令等等都是是沒(méi)有的,靠其他的指令綜合來(lái)完成
2、ARM指令集功能更強(qiáng)大
比如說(shuō)b指令可以跳轉(zhuǎn)的范圍是前后32M
3、ARM每條指令都可條件執(zhí)行
這使得C語(yǔ)言跳轉(zhuǎn)語(yǔ)句可以用很簡(jiǎn)便的方式實(shí)現(xiàn)
4、ARM指令集操作更有序
因?yàn)槭荓OAD/STORE結(jié)構(gòu),所以都是先從內(nèi)存中加載數(shù)據(jù)到寄存器(load),然后通過(guò)寄存器處理,再把處理結(jié)果寫(xiě)到內(nèi)存中(store)?! ?/p>
5、ARM指令集都是4字節(jié)的
這樣便于流水線的實(shí)現(xiàn),而且內(nèi)存的分配更有序。在指令尋址上,也節(jié)省了兩位地址。
評(píng)論