1. 程式人生 > >ARM異常中斷返回的幾種情況

ARM異常中斷返回的幾種情況

重要基礎知識:R15(PC)總是指向“正在取指”的指令,而不是指向“正在執行”的指令或正在“譯碼”的指令。一般來說,人們習慣性約定將“正在執行的指令作為參考點”,稱之為當前第一條指令,因此 PC總是指向第三條指令。當 ARM 狀態時,每條指令為 4 位元組長,所以 PC 始終指向該指令地址加 8 位元組的地址,即:PC 值=當前程式執行位置+8;     而 ADS 中的 pc,是為了除錯看著方便而修改過的,它指向的是正在執行的指令,即“真正 pc-8”! 1.SWI 和和未定義指令異常中斷的返回: 指令地址 A         PC-8  當前指令為 SWI 或未定義指令 此時發生中斷.PC 的值還沒有更新. A+4       PC-4  中斷時處理器將 PC-4 儲存到 LR。       ;lr! A+8       PC 返回時,從發生中斷的指令 A(PC-8)的下一條指令 A+4(PC-4)處開始執行,所以直接把 LR 的值賦給 PC 就行了,具體指令為 MOVPC,LR  (PC=A+4=LR) 白話解釋:對於 SWI 和未定義指令異常: 發生異常時 pc 沒有更新,根據 ARM 的三級流水線原理,pc 沒有更新,仍然等於(A+8); lr= pc – 4(這時處理器決定的,無法更改!)即 A+4。
由於這類異常返回後應執行下一條指令(A+4),所以返回時,pc= lr 即可。 2.IRQ 和 FIQ 異常中斷處理的返回: 指令地址  對應於 PC A         PC-8      執行此指令完成後(!)查詢 IRQ 及 FIQ,如果有中斷請求則產生中斷. A+4       PC-4 A+8       PC         ;lr! (此時 PC 的值已經更新,指向 A+12.將當前 PC-4,即 A+8 )。 儲存到 LR.返回時,要接著執行 A+4(LR-4)處的指令,所以返回指令為 SUBSPC, LR,#4(PC=A+4=LR-4) 白話解釋:對於普中斷和快中斷異常,中斷必須在一條指令執行完以後被檢測到,如正在執行指令甲時發生了中斷,不等指令甲執行完是不會處理該中斷的,發生異常時 pc 已經更新(A+12); lr= pc – 4(這時處理器決定的,無法更改!)即 A+8 返回後,應執行被中斷而沒有執行的指令(上面的 A+4),所以返回時,pc = lr-4
3,指令預取中止異常中斷處理的返回: 指令地址 A     PC-8     執行本指令時發生中斷,   A+4   PC-4     處理器將 A+4(PC-4)儲存到 LR.    ;lr! A+8   PC 返回時,發生指令預取中止的指令 A(PC-8)處重新執行,所以返回指令為 SUBSPC, LR,#4(PC=A=LR-4) 白話解釋:對於預取指令中止異常,發生預取指令異常時,是在執行時發生的異常,pc 未更新,即 pc= A+8;lr = pc – 4(這時處理器決定的,無法更改!)即 A+4。 由於這類異常返回後應重新執行異常的那個指令(A),所以返回時,pc= lr-4 4,資料訪問中止異常中斷處理的返回:
指令地址 A          PC-8    本指令訪問有問題的資料,產生中斷時,PC 的值已經更新    A+4        PC-4    中斷髮生時 PC=A+12,處理器將 A+8(PC-4)儲存到 LR. A+8        PC        ;lr! 返回時,要返回到 A 處繼續執行,所以指令為 SUBSPC,  LR,#8.(PC=A=LR-8) 白話解釋:對於資料訪問中止異常,發生資料訪問中止異常時,是在執行時訪問資料錯誤導致的異常,pc 已經更新,即 pc= A+12 lr= pc – 4(這時處理器決定的,無法更改!)即 A+8。 由於這類異常返回後應重新執行異常的那個指令(A),所以返回時,pc= lr-8 小節: Ø 引起 PC 更新的原因一種是資料中止,還有就是中斷了. Ø 中斷必須是在一條指令執行完畢後才能被檢測到,所以它中斷的只是還未執行的那條指令(pc - 8),所以 pc= lr – 4; Ø 與中斷相同,SWI 和未定義指令異常也是返回到下一條指令(pc - 4),只是他們在執行時,PC 的值並沒有更新,所以 pc= lr; Ø 預取指令中止異常,也沒有發生 pc  更新,但它還得重新執行發生異常的那條指令,所以 pc= lr – 4; Ø 資料訪問中止異常,發生了 pc  更新,並且它也需要重新執行發生異常的那條指令,所以 pc= lr – 8。

如何解釋ARM狀態與Thumb狀態下的FIQ,IRQ,PABT(指令預取終止),DABT(資料預取錯誤)的返回指令一樣:
猜測:thumb的取指是 一次取兩條! 這樣就可以解釋為什麼是一樣的。但是還不確定。

相關推薦

ARM異常中斷返回情況

重要基礎知識:R15(PC)總是指向“正在取指”的指令,而不是指向“正在執行”的指令或正在“譯碼”的指令。一般來說,人們習慣性約定將“正在執行的指令作為參考點”,稱之為當前第一條指令,因此 PC總是指向第三條指令。當 ARM 狀態時,每條指令為 4 位元組長,所以 PC 始

ARM流水線與異常中斷返回情況

重要基礎知識:R15(PC)總是指向“正在取指”的指令,而不是指向“正在執行”的指令或正在“譯碼”的指令。一般來說,人們習慣性約定將“正在執行的指令作為參考點”,稱之為當前第一條指令,因此 PC總是指向第三條指令。當 ARM 狀態時,每條指令為 4 位元組長,所以 PC 始

關於Java空指標異常情況的總結

1:NullPointerException由RuntimeException派生出來,是一個執行級別的異常。意思是說可能會在執行的時候才會被丟擲,而且需要看這樣的執行級別異常是否會導致你的業務邏輯中斷。  2:空指標異常發生在物件為空,但是引用這個物件的方法。例如: String s =

函式返回情況

轉載地址:https://www.cnblogs.com/edwardcmh/archive/2012/03/20/2408359.html 1. 返回區域性變數的值 可以有兩種情況:返回區域性自動變數和區域性靜態變數,比如, int func() { int t

geoprocessor(GP)工具提示“對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL”的情況

以gp工具中的merge工具進行示例分析:1、當引數input所表示的要素型別不一致的時候會出現“對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL”提示。2、當引數output所表示的要素已存在,且gp工具的overwrite屬性設定為false的時候也會出現

返回型別是引用型別的情況

/* 返回值型別 基本型別:(基本型別太簡單,我不準備講解) 引用型別: 類:返回的是該類的物件 抽象類:返回的是該抽象類的子類物件 介面: */ abstract class Person { public abstract void study(); }

函式返回區域性變數的情況

本文主要詳細討論了返回返回區域性變數的幾種情況,值得大家注意。 一般的來說,函式是可以返回區域性變數的。 區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及地址,程式不會出錯。但是如果返回的是區域性

異常、堆記憶體溢位、OOM的情況

1、堆記憶體溢位 【情況一】:   java.lang.OutOfMemoryError: Java heap space:這種是java堆記憶體不夠,一個原因是真不夠,另一個原因是程式中有死迴圈;   如果是java堆記憶體不夠的話,可以通過調整J

關於Java空指標異常情況的總結(java.lang.NullPointerException)

在外文網站上看到的: 1. Calling the instance method of a null object.  2. Accessing or modifying the field of 

C++引用做函式引數和函式的返回值是引用的情況

引用做函式引數引用的內部實現,是常指標,所以引用其實是對指標做了一些限制,這種限制的意義是在某些應用場景中,使用引用具有更好的 實用性和可讀性。具體講,引用最常見的用處是在做函式引數的時候,對比指標做函式引數,比如:指標做函式引數:void myswap(int *a,int

當表名可控的註入遇到了Describe時的情況

影響 bold 求學 ide 構造 完全 card 別名 pre 轉自:http://www.yulegeyu.com/2017/04/16/%E5%BD%93%E8%A1%A8%E5%90%8D%E5%8F%AF%E6%8E%A7%E7%9A%84%E6%B3%A8%E5

[轉]DB2中需要REORG操作的情況

sting line lte font -type compress win rmi col 問題: 在DB2數據庫中,修改完表的結構時,是否需要對表做一個reorg操作才能使表的狀態恢復正常? 答:有以下4種操作,需要對表做reorg操作 1. SET DATA TYPE

Mysql索引會失效的情況分析

status 過程 ges 此外 ont 其中 like hand ext 轉自:http://www.jb51.net/article/50649.htm 在做項目的過程中,難免會遇到明明給mysql建立了索引,可是查詢還是很緩慢的情況出現,下面我們來具體分析下這種

POI導出Excel的情況

scrip equals eth for get write else des tco 第一種:常見導出【已知表頭(長度一定),已知表數據(具體一個對象的集合,並已知對象各個屬性的類型)】第二種:不常見導出【已知表頭(長度不定),已知表數據(沒有具體對象,裝在Strin

MySQL索引失效的情況

模糊 運算 全表掃描 mysq 子節點 葉子節點 數據 都是 記錄 1.索引不存儲null值 更準確的說,單列索引不存儲null值,復合索引不存儲全為null的值。索引不能存儲Null,所以對這列采用is null條件時,因為索引上根本 沒Null值,不能利用到索引,只能全

java.lang.NullPointerException報錯的情況

style == poi 就會 string arr 不存在 判斷 對象 java.lang.NullPointerException報錯的幾種情況: 1.字符串變量未初始化; 2.接口類型的對象沒有用具體的類初始化,比如:   List stuList ;這種情況就會報空

java中出現內存溢出的情況

xss 除了 占用 memory 兩個 存在 text spa 調用 情況一:java.lang.OutOfMemoryError: Java heap space 原因:java堆內存不足,可能是真的不足,也可能是程序中有死循環 方案:1、調整JVM參數-Xms2048m

spring@value取不到值的情況

spring@value取不到值的幾種情一,spring組件重寫構造方法,在構造方法中引用@value為null由於spring實例化順序為先執行構造方法,再註入成員變量,所以序為先執行構造方法,再註入成員變量,所以ing實例化順取值為null解決辦法為:再寫一個常量類,在常量類中引用@value,再在構造方

總結遇到的elasticsearch啟動失敗的情況及解決

elasticsearch1、使用root用戶啟動失敗 在有一次搭建elasticsearch的時候,使用systemctl啟動elasticsearch失敗,然後在bin目錄下面去使用啟動腳本啟動,發現報錯不能用root用戶啟動,報“Caused by: java.lang.RuntimeException

PHP-判斷條件為false的情況

it is als 註意 浮點 條件 tro 其中 條件判斷 lse 1.整型的0 整型的0 在判斷條件時為false <?php $str = 0; if ($str) { echo ‘It is true!‘; } else { echo ‘It