久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

關(guān)于ARM的PC指針(什么時(shí)候PC+8,,PC+4,,PC

 最初九月雪 2017-04-14


要理解PC指針,首先就要好好了解LR指針


連接寄存器LR(r14):用來保存和恢復(fù)PC寄存器的內(nèi)容,,它有兩個(gè)特殊功能,。

    (1)保存子程序返回地址。使用BL或BLX時(shí),,跳轉(zhuǎn)指令自動(dòng)把返回地址放入r14中,;子程序通過把r14復(fù)制到PC來實(shí)現(xiàn)返回,通常用下列指令之一:
                        MOV PC, LR 
                        BX LR

             通常子程序這樣寫,,保證了子程序中還可以調(diào)用子程序,。
                         stmfd sp!, {lr}
                         ……
                         ldmfd sp!, {pc}

    (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)前指令的下一條指令

未定義指令異常時(shí),,因?yàn)檫@個(gè)異常發(fā)生在指令譯碼階段,,所以,此時(shí)PC的值就是未定義指令加4,,然后保存到LR(參考流水線圖),;因?yàn)樵撝噶钗炊x,所以返回時(shí)就不應(yīng)該返回到這條未定義指令,,而是返回到它的下一條指令,,R14中保存的剛好就是下一條指令的地址,所以就不用計(jì)算了,,直接將R14賦值給PC就行了

預(yù)取指令異常是在流水線的執(zhí)行階段時(shí)才進(jìn)入異常,,所以PC的值是當(dāng)前執(zhí)行指令地址加8,,所以返回時(shí)應(yīng)該返回到下一條指令,,所以PC恢復(fù)的時(shí)候就需要R14減4

數(shù)據(jù)中止異常,這個(gè)異常是在本指令執(zhí)行完成后才發(fā)生的,,表示當(dāng)前存儲(chǔ)器的訪問不能完成,,從流水線圖可以看出,當(dāng)?shù)谝粭l指令執(zhí)行完成時(shí),,當(dāng)前PC值已經(jīng)指向了第一條指令地址加12的地址,,LR中保存的其實(shí)是第四條指令的地址了,所以從異常返回時(shí),,需要從第一條指令的下一條指令(第二條指令)開始執(zhí)行,,所以PC恢復(fù)的時(shí)候就需要R14減8



下面簡(jiǎn)單總結(jié)一下:


1.SWI和和未定義指令異常中斷的返回:
指令地址
     PC-8    當(dāng)前指令為SWI或未定義指令 此時(shí)發(fā)生中斷.PC的值還沒有更新.(不需要執(zhí)行完此指 令,就跳到中斷了)
A+4    PC-4  中斷時(shí)處理器將PC-4保存到LR
A+8    PC

返回時(shí),從發(fā)生中斷的指令A(yù)(PC-8)的下一條指令A(yù)+4(PC-4)處開始執(zhí)行,所以直接
把LR的值賦給PC就行了,具體指令為MOV PC,LR  @(PC=A+4=LR)

2,IRQ和FIQ異常中斷處理的返回:
指令地址  對(duì)應(yīng)于PC
       PC-8     執(zhí)行此指令完成后(!)查詢IRQ及FIQ,如果有中斷請(qǐng)求
                          則產(chǎn)生中斷. .(需要執(zhí)行完此指 令,,再跳到中斷)

A+4      PC-4
A+8      PC

(此時(shí)PC的值已經(jīng)更新,指向A+12.將當(dāng)前PC-4(即A+8)
保存到LR.返回時(shí),要接著執(zhí)行A+4(LR-4)處的指令,所以返回指令為
SUBS PC, LR,#4 @(PC=A+4=LR-4)

3,指令預(yù)取中止異常中斷處理的返回:
指令地址
   PC-8          執(zhí)行本指令時(shí)發(fā)生中斷,  
A+4  PC-4      處理器將A+4(PC-4)保存到LR. 
A+8   PC

返回時(shí),發(fā)生指令預(yù)取中止的指令A(yù)(PC-8)處重新執(zhí)行(A處的指令要重新執(zhí)行),所以返回指令為
SUBS PC, LR,#4  @(PC=A=LR-4)

4,數(shù)據(jù)訪問中止異常中斷處理的返回:

指令地址
        PC-8  本指令訪問有問題的數(shù)據(jù),產(chǎn)生中斷時(shí),PC的值已經(jīng)更新   
A+4       PC-4  中斷發(fā)生時(shí)PC=A+12,處理器將A+8(PC-4)保存到LR.
A+8       PC

返回時(shí),要返回到A處繼續(xù)執(zhí)行,所以指令為SUBS PC,  LR,#8   @(PC=A=LR-8)

(A處的指令要重新執(zhí)行),

5.正常程序跳轉(zhuǎn)處理返回

使用BL跳轉(zhuǎn)時(shí),,它會(huì)自動(dòng)將返回地址裝入LR中,即將當(dāng)前PC-4存入LR中,,返回時(shí)不用對(duì)LR進(jìn)行加減操作

指令地址 

對(duì)應(yīng)于PC
         PC-8    (A處的指令不要重新執(zhí)行)
A+4      PC-4
A+8      PC


mov PC, LR @(PC=A+4=LR)  現(xiàn)在LR的值就是A+4的地址



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多