C51 禁止使用絕對暫存器定址方式訪問函式選定

2021-07-11 09:28:01 字數 837 閱讀 7608

在 isr 中呼叫其它函式,必須和中斷使用相同的暫存器組。當沒用 noaregs 命令做明確的宣告,編譯器將使用絕對暫存器定址方式訪問函式選定(即用 using 或 registerbank 指定)的暫存器組,當函式假定的和實際所選的暫存器組不同時,將產生不可預知的結果,從而可能出現引數傳遞錯誤,返回值可能會在錯誤的暫存器組中。 

舉一例子:當需要在中斷內和中斷外呼叫同乙個函式,假定按照程式的流程控制,不會出現函式的遞迴呼叫現象,這樣的呼叫會不會出現問題?若確定不會發生重入情況,則有以下兩種情況: 

1、如果 isr 和主程式使用同一暫存器組(主程式預設使用bank 0,若 isr 沒有使用 using 為其指定暫存器區,則預設也使用 bank 0),則不需其他設定。 

2、如果 isr 和主程式使用不同的暫存器組(主程式預設使用bank 0,isr 使用 using 指定了其他 bank),則被呼叫函式必須放在: 

#pragma noaregs 

#pragma aregs 

控制引數對中,指定編譯器不要對該函式使用絕對暫存器定址方式;或者也可在 options->c51,選中「don't use absolute register accesses」,使所有**均不使用絕對暫存器定址方式(這樣,執行效率將稍有降低)。不論以上的哪一種情況,編譯器均會給出重入警告,需手工更改 overlay 引數,做重入說明。

今天遇到的故障就是:中斷使用using 3,但中斷中呼叫子函式,子函式有比較,比較時,怎麼也比較不出結果,看彙編**,子函式竟然和0x05,0x04直接比較,如果不勾選 「don't use absolute register accesses「所以就出現錯誤了;

而所有程式公用乙個暫存器組則不會出現該問題;

C51 特殊功能暫存器

建立人 ruo xiao 1 英文 special function register,縮寫 str。2 定義 80c51 微控制器中各功能部件對應的暫存器。3 作用 用於存放相應功能部件的控制 命令,狀態或資料。4 數量 21。5 清單 符號位址 功能介紹 bf0h b暫存器 acc e0h累加器...

c語言效能優化 使用暫存器變數

c語言效能優化 使用暫存器變數 當對乙個變數頻繁被讀寫時,需要反覆訪問記憶體,從而花費大量的訪問時間。為此,c語言提供了一種變數,即暫存器變數。這種變數存放在cpu的暫存器中,使用時,不需要訪問記憶體,而直接從暫存器中讀寫,從而提高效率。暫存器變數的說明符是register。對於迴圈次數較多的迴圈控...

C 使用FS暫存器判斷程序是否被除錯

昨天研究了一下isdebuggerpresent這個函式的實現 發現真的很簡單,只有區區4行 mov eax,dword ptr fs 018h mov eax,dword ptr eax 030h movzx eax,dword ptr eax 02h ret參考了一些大牛的文章,原來第一行是獲取...