我們常常聽說的pc,lr到底是什麼關係,我這次終於弄明白了。我們都知道,lr是指向pc下一次要執行的位址,但是arm不同的工作模式,他們有不同的關係。arm有如下幾種工作模式:使用者模式,fiq模式,irq模式,系統模式,終止模式,資料訪問終止模式,未定義模式。arm是**流水線的:取指,解碼,執行。arm的r15(pc)總是指向取指的地方,而我們總是以執行作為分析參考點,注意,取指的地方在高位址。當arm處在arm指令的時候,每條指令得長度為4,pc = 當前執行+8,當然如果處在thumb指令中,每條指令長度為2,pc = 當前執行+4.
arm中pc和lr的關係
(1) swi和未定義中斷
此時pc指標的位址還沒有更新,所以lr的內容為pc-4。
a pc-8
a+4 pc-4 ;lr
a+8 pc ;pc
當發生中斷的時候,直接返回a(pc-8)的下一條指令(pc-4)就可以了,所以在執行的時候,直接把lr給pc就行了。說白了,就是在發生這兩種異常的時候,pc指標沒有更新,仍然等於a+8,還是原來的數值,在返回的時候,直接在lr處執行就可以了。
返回指令:mov pc,lr
(2)fiq和irq中斷
在這兩種中斷中,中斷總是在執行完一條指令後開始執行,但這時候pc發生了更新,也就是說pc數值一定不是a+8 了,變成了a+12了,那麼相應的lr也變成了a+8(pc-4)。
,如果返回,那麼在lr(a+8)處開始執行,這樣就跳過了a+4這個位址,少執行了乙個指令。所以發生這兩種中斷的時候,應該返回lr -4。
中斷前:
a pc -8
a+4 pc -4 ;lr
a+8 pc ;pc
中斷後:
a pc-12 此處中斷
a+4 pc-8 ;跳過未執行
a+8 pc-4 ;lr
a+12 pc ;已更新
說明白點,比如cpu在執行執行d的時候發生中斷,在沒有執行完 d指令前是不會處理中斷的 ,執行完之後,pc已經更新,然後將pc-4的數值給lr,這個有系統決定,軟體無法修改。即a+8。在中斷 返回時, 應該執行沒有執行的下一條指令,即a+4,所以在返回的時候,將lr-4,所以返回的時候pc= lr-4.返回指令為:sub pc,lr,#4
(3) 指令中止模式中斷
此種模式的中斷發生時,pc不會更新,但是會在發生中斷的地方重新執行,因為 cpu執行指令的時候被打斷,這個指令可能就沒執行完或者還沒執行,一定要重新執行該指令才行 。
指令模式:
a pc-8 ;此處發生指令中止中斷
a+4 pc-4 ;lr
a+8 pc ;
所以,發生中斷時,pc未更新,即pc = a+8,此時lr = pc-4,即a+4,因為要從被中斷指令處重新執行,即從a處重新執行,所以返回lr-4,返回指令:sub pc, lr, #4
(4)資料訪問中止模式中斷
此種中斷模式,是在資料訪問的時候發生中止,所以要像指令中止一樣,從此處重新執行,但是不同的是,此時的pc已經更新,不是a+8了,而是變成a+12了,與上面情況類似,lr的數值為 pc-4,即a+8,所以要返回被中斷的指令處執行,必須返回lr-8,返回指令為:
sub pc, lr, #8.
ARM3級流水線的PC值關係
在解釋pc值關係之前先了解一些概念。程式計數器是用於存放下一條指令所在單元的地方。當執行一條指令時,首先需要根據pc中存放的指令位址,將指令由記憶體取到指令暫存器中,此過程稱為 取指令 與此同時,pc中的位址自動加1,或者由轉移指標給出下一條指令的位址。對於32位處理器,一條指令佔據4位元組。流水線...
mac鍵盤與pc鍵盤的對應關係
剛開始使用mac時,由於mac與常用鍵盤不太一樣,導致使用的困難,現在將對應關係列出來,以方便大家使用。alt 視窗 ctrl esc shift 此鍵用於組合鍵時,只能與alt ctrl 視窗鍵一起進行組合,單獨時只能與上下左右鍵進行組合。enter command與option相當於ctrl和a...
使用ROS進行ARM端與PC端通訊
終於在zynq上跑起了ros,接下來最令人關心的就是能否使用ros使arm端和pc端進行通訊了,我按照wiki上的教程進行了實驗,基本上是沒有問題的,只是需要修改一下arm端和pc端的hosts檔案。1 實驗環境 zynq ubuntu 12.04 groovy pc ubuntu 12.04 fu...