要理解PC指針,首先就要好好了解LR指針
連接寄存器LR(r14):用來保存和恢復(fù)PC寄存器的內(nèi)容,,它有兩個(gè)特殊功能,。 (1)保存子程序返回地址。使用BL或BLX時(shí),,跳轉(zhuǎn)指令自動(dòng)把返回地址放入r14中,;子程序通過把r14復(fù)制到PC來實(shí)現(xiàn)返回,通常用下列指令之一: 通常子程序這樣寫,,保證了子程序中還可以調(diào)用子程序,。 (2)當(dāng)異常發(fā)生時(shí),,異常模式的r14用來保存異常返回地址,將r14如??梢蕴幚砬短字袛?。
程序計(jì)數(shù)器r15(PC):PC是有讀寫限制的。當(dāng)沒有超過讀取限制的時(shí)候,,讀取的值是指令的地址加上8個(gè)字節(jié),,由于ARM指令總是以字對(duì)齊的,故bit[1:0]總是00,。當(dāng)用str或stm存儲(chǔ)PC的時(shí)候,,偏移量有可能是8或12等其它值。在V3及以下版本中,,寫入bit[1:0]的值將被忽略,,而在V4及以上版本寫入r15的bit[1:0]必須為00,否則后果不可預(yù)測(cè),。
知道PC寄存器和LR寄存器功能以后,,再了解一下ARM處理器的三級(jí)流水線和多級(jí)流水線
首先,對(duì)于ARM7對(duì)應(yīng)的流水線的執(zhí)行情況,,如下面這個(gè)圖所示:
從圖中可以看出,,一條匯編指令的運(yùn)行有三個(gè)步驟,取指,、譯碼,、執(zhí)行,當(dāng)?shù)谝粭l匯編指令取指完成后,,緊接著就是第二條指令的取指,,然后第三條...如此嵌套
其實(shí)很容易看出,第一條指令: add r0, r1,$5 取指完成后,,PC就指向了第二條指令,,此時(shí)PC=PC+4 當(dāng)?shù)谝粭l指令譯碼完成以后,此時(shí)PC=PC+8 所以第一條指令開始執(zhí)行時(shí),,PC值已經(jīng)加了8 所以必須記住這個(gè)前提,,在arm中,每次該指令執(zhí)行時(shí),,其實(shí)這時(shí)的PC值是PC=PC+8 而且這個(gè)前提也同樣適合多級(jí)流水線,,原因就不解釋了
接下來談?wù)勎覀冊(cè)赼rm匯編時(shí),什么時(shí)候需要PC-4, PC-8, PC什么都不減
這個(gè)取決于是在正常程序的跳轉(zhuǎn)還是發(fā)生異常: 如果是使用BL執(zhí)行了正常程序的跳轉(zhuǎn),,那么執(zhí)行這條BL指令時(shí),,由于是正常的跳轉(zhuǎn)指令,所以cpu會(huì)將返回地址存放在LR中,,即當(dāng)前指令地址加4,,當(dāng)從子程序跳轉(zhuǎn)回來的時(shí)候,,那么就需要將保存在LR寄存器中的值恢復(fù)給PC寄存器,
mov PC, LR 這樣的指令返回
IRQ異常發(fā)生時(shí),,因?yàn)檫@個(gè)異常是在指令執(zhí)行時(shí)候發(fā)生的,,PC的值等于當(dāng)前執(zhí)行指令加8,然后將這個(gè)值保存在LR中,。但是LR寄存器中保存的是PC+8,,指向的是后面的第二條指令,如果不進(jìn)行減4處理,,將會(huì)漏執(zhí)行一條指令,,所以PC恢復(fù)的時(shí)候就需要LR減4,所以正常從子程序返回的時(shí)候會(huì)使用如:
SUBS PC, LR,#4 返回到當(dāng)前指令的下一條指令
下面簡(jiǎn)單總結(jié)一下:
1.SWI和和未定義指令異常中斷的返回: 返回時(shí),從發(fā)生中斷的指令A(yù)(PC-8)的下一條指令A(yù)+4(PC-4)處開始執(zhí)行,所以直接 2,IRQ和FIQ異常中斷處理的返回: (此時(shí)PC的值已經(jīng)更新,指向A+12.將當(dāng)前PC-4(即A+8) 3,指令預(yù)取中止異常中斷處理的返回: 返回時(shí),發(fā)生指令預(yù)取中止的指令A(yù)(PC-8)處重新執(zhí)行(A處的指令要重新執(zhí)行),所以返回指令為 4,數(shù)據(jù)訪問中止異常中斷處理的返回: 指令地址 返回時(shí),要返回到A處繼續(xù)執(zhí)行,所以指令為SUBS PC, (A處的指令要重新執(zhí)行), 5.正常程序跳轉(zhuǎn)處理返回
使用BL跳轉(zhuǎn)時(shí),,它會(huì)自動(dòng)將返回地址裝入LR中,即將當(dāng)前PC-4存入LR中,,返回時(shí)不用對(duì)LR進(jìn)行加減操作 指令地址
mov PC, LR @(PC=A+4=LR) 現(xiàn)在LR的值就是A+4的地址
|
|