嵌入式系統/組合語言
本書將演示使用匯編語言程式設計嵌入式系統的技術。
x86 微處理器至少有:
- 4 個通用暫存器
- AX、BX、CX 和 DX。AX 是快速累加器。
- 4 個段暫存器
- CS(程式碼段)、DS(資料段)、ES(額外段)、SS(堆疊段)。
- 5 個指標暫存器
- SI(源索引)、DI(目標索引)、IP(指令指標)、SP(堆疊指標)、BP(基址指標)。
- 1 個標誌暫存器
- 標誌('7' 個標誌,例如零標誌、進位標誌)
與“記憶體對映”處理器不同,x86 具有特殊的“I/O”指令(inp、outp),用於與 I/O 硬體通訊。
在任何時候,都可以訪問 17 個暫存器:R0 到 R14(具有相同的硬體)、R15 和狀態暫存器 CPSR。
(為了減少 延遲 在中斷處理中,這些暫存器和 SPSR“儲存的程式狀態暫存器”在中斷期間被“映象”。包括這些映象,典型的 ARM 處理器總共有 37 個暫存器)。
ARM 的標準 C 呼叫約定是:[1]
- R15:PC:程式計數器
- R14:LR:連結暫存器(儲存最近子程式呼叫的返回地址)
- R13:SP:堆疊指標(用於巢狀子程式呼叫)
- R12-R4:長期變數:僅在子程式在返回之前恢復原始值時才由子程式使用
- R3-R0:臨時變數和子程式呼叫引數以及子程式返回值。
I/O 硬體通常是“記憶體對映”。
- 16 位累加器暫存器
- D,可以作為兩個 8 位暫存器訪問:A(高位)和 B(低位)
- 2 個 16 位索引暫存器
- X、Y
- 16 位堆疊指標暫存器
- SP
- 16 位程式計數器
- PC
- 8 位條件程式碼暫存器
- CC
HCS12 基於舊的 68HC11,指令集非常相似。HCS12 是一個“大端”處理器:多位元組值從最高有效位元組到最低有效位元組以遞增的記憶體地址儲存。
現代桌上型電腦幾乎都是 32 位機器,下一代處理器將完全是 64 位。這對普通程式設計師來說很好,但當你處於一個嵌入式環境中,使用一個只有指甲蓋大小的微控制器,它只能執行 4 位算術運算時,你會怎麼做?32 位可能是桌上型電腦市場的標準,但嵌入式晶片沒有金標準:更多位佔用更多空間,成本更高。本質上,優秀嵌入式系統工程師的工作是找到最小、最便宜的微控制器來完成需要完成的任務。考慮以下表格
位 最大無符號數 最大有符號數 最小有符號數* 4 15 7 -8 8 255 127 -128 16 65,535 32,767 -37,768
- * 2 的補碼格式
即使是 16 位處理器也遠不如標準 32 位處理器的 40 億整數範圍。假設我們有一個 4 位微控制器,它有 4 個可用的內部暫存器(每個 4 位),以及 256 位元組的板載可程式設計記憶體。這個處理器除了最簡單的任務之外什麼也處理不了!如果我們需要在這個微處理器上操作一個 8 位數怎麼辦?例如,如果我們想用它製作一個數字時鐘?這個 4 位微處理器將需要處理高達 59 的數字(在下一個小時之前顯示的分鐘數)。這將需要超過分配的 4 位,實際上將需要至少 6 位的空間。我們需要做的就是找到一種方法將 2 個單獨的小暫存器視為一個大的暫存器。本章將稍微討論一下這個主題。