STM8 CPU寄存器描述
STM8S是基于8位框架結(jié)構(gòu)的微控制器,其CPU內(nèi)核有6個內(nèi)部寄存器,通過這些寄存器可高效 地進行數(shù)據(jù)處理。STM8S的指令集支持80條基本 20種尋址模式,而且CPU的6個內(nèi)部寄 存器都擁有可尋址的地址。如果想了解全部STM8S指令集,請參考STM8 微控制器家族編程手冊 (PM0044)。 CPU寄存器
在圖1所示的編程模型中可以看到6個CPU寄存器。在一個中斷發(fā)生后,寄存器以圖2所示順序入棧,它們以相反的順序出棧。如果需要的話,中斷服務(wù)程序可使用POP和PUSH指令來對之進行操作。
本文引用地址:http://m.butianyuan.cn/article/201611/316698.htmCPU寄存器描述
累加器(A)
累加器是一個8位通用目的寄存器,用于保存算術(shù)運算、邏輯運算以及數(shù)據(jù)操作的操作數(shù)及結(jié)果。
索引寄存器(X和Y)
X和Y都是16位的寄存器,可實現(xiàn)高效率的尋址模式。它們也可用作數(shù)據(jù)操作的暫存器以及用于像乘除法這樣的操作。在大多數(shù)情況下,交叉匯編器會在使用了Y寄存器的指令代碼中生成PRECODE指令,用以和使用了X寄存器的指令相區(qū)別。
程序計數(shù)器(PC)
程序計數(shù)器是一個24位的寄存器,用于存儲CPU下一條要執(zhí)行指令的地址。其內(nèi)容在每一次指令操作后被自動刷新。由于程序指針有24位,因此STM8的最大尋址范圍可達16M字節(jié)。
圖(1)
堆棧指針(SP)
堆棧指針是一個16位的寄存器,其內(nèi)容為堆棧中下一個可自由分配的單元地址。根據(jù)不同的型號,堆棧指針的高位會有一個指定的預設(shè)值。
堆棧一般用于在中斷調(diào)用或子程序調(diào)用時存儲 CPU的上下文(程序計數(shù)器,關(guān)鍵寄存器,相關(guān)函數(shù)的參數(shù)及局部變量,等等)。用戶也可以通過POP和PUSH指令直接對堆棧操作。
SP可以被C編譯器的啟動代碼初始化,C語言應(yīng)用程序會根據(jù)用戶所使用的包含絕對地址信息的鏈接文件來進行初始化。如果用戶使用了自己編寫的鏈接文件和啟動代碼,請確認SP被恰當?shù)爻跏蓟?具體地址信息請參考相應(yīng)的數(shù)據(jù)手冊)。在MCU復位后,或在執(zhí)行了堆棧復位指令后(RSP),堆棧指針被設(shè)為其被允許的最大值。對于使用了匯編語言的應(yīng)用程序,用戶可使用ST提供的啟動代碼或編寫自己的啟動代碼來對SP進行正確的初始化。
入棧操作使堆棧指針值減小,出棧操作使堆棧指針值增加。當堆棧指針值為其被允許的最小值時,繼續(xù)入棧會使堆棧指針值回卷至其最大值,從而會導致先前存儲的數(shù)據(jù)被覆蓋,但此時沒有中斷或硬件標志位來指示該事件發(fā)生。應(yīng)用程序需確保堆棧被正確的操作,沒有溢出。
子程序調(diào)用會占用2或3字節(jié)空間。中斷調(diào)用會占用9字節(jié)空間來存儲內(nèi)部寄存器(除SP之外)。請參考圖2。
圖(2)
*注:WFI/HLAT指令會預先保存CPU上下文。如果CPU處于WFI或HALT狀態(tài)下有中斷發(fā)生,則進入中斷所需的延時會相應(yīng)減少。
- 條件代碼寄存器(CC)
條件代碼寄存器是一個8位寄存器,用于指示剛剛被執(zhí)行的指令結(jié)果及處理器的狀態(tài)。寄存器的第7位(MSB)是保留位,這些位可以被用戶的程序或代碼單獨地測試,測試的結(jié)果可用于指示程序或代碼執(zhí)行后的狀態(tài) 。下面的段落將描述每一位的含義。- V:溢出
在上一次有符號數(shù)的算術(shù)操作中,如果結(jié)果的最高位有溢出發(fā)生,則當該位被置1。請參考INC,INCW,DEC,DECW,NEG,NEGW,ADD,ADDW,ADC,SUB,SUBW,SBC,CP,CPW等指令。
表(1)
I1:中斷屏蔽級別1
I1和I0共同用于指示當前狀態(tài)下CPU的可中斷性,請參考表1。通過執(zhí)行RIM,SIM,HALT,WFI,IRET,TRAP和POP指令可對I1和I0置位或清零。I1和I0也會在CPU進入中斷服務(wù)程序時被硬件自動設(shè)置為該中斷對應(yīng)的中斷級別。 - V:溢出
- H:半進位
在執(zhí)行ADD或ADC操作的過程中,當ALU的第3位和第4位間發(fā)生進位時,H位會被置1,這對于
BCD碼算術(shù)運算很有意義。 - I0:中斷屏蔽級別0
請參考表1。 - N:負數(shù)
當上一次的算術(shù)、邏輯或數(shù)據(jù)操作的結(jié)果是負的情況下,N位被置1(例如結(jié)果的最高位是邏輯1)。 - Z:零
當上一次的算術(shù)、邏輯或數(shù)據(jù)操作的結(jié)果是零時,Z位被置1。 - C:進位
在上一次的算術(shù)操作中,如果結(jié)果的最高位發(fā)生進位或借位,則當該位被置1。當執(zhí)行位測試,分支,移位,旋轉(zhuǎn)和加載指令時,該位也會收到影響。請參考ADD,ADC,SUB, SBC等指令。
在除法操作中,C位用來指示在指令執(zhí)行中是否有錯誤發(fā)生(商溢出或0作除數(shù))。請參考DIV指令。
在位測試操作中,被測試的位被復制到C位;請參考BTJF,BTJT指令。在移位和旋轉(zhuǎn)操作中,C位根據(jù)結(jié)果進行相應(yīng)地更新;請參考RRC,RLC,SRL,SLL,SRA指令。
用戶還可以通過SCF,RCF,CCF指令對C位進行置位,清除和取反。
例子:加法操作
評論