汇编语言程序设计--基于ARM
環境 :DOSbox
自動掛載:無需每次打開都要手動掛載
設置Dosbox自動掛載_柬紙的博客-CSDN博客_dosbox自動掛載
第一章 基礎知識
進制數:按位權展開
字符編碼:ASCII / Unicode
數字編碼:BCD(4位代表一個數字)
奇偶校驗碼:設置一個監督位,表明奇校驗或偶校驗,通過異或位來校驗結果
海明碼:能夠檢驗和糾錯
反碼,補碼:符號位不用變
補碼運算:符號位也參加運算,且有以下規則
可以通過OF或雙符號位來判斷是否溢出
定點:分為定點小數和定點整數 ---- 但只能處理純小數或純整數,所以引入了浮點數
浮點數:分為尾數,解碼,階符,數符-----------EEE二進制浮點數算術標準
第二章:ARM微處理器
嵌入式系統:
系統內核小,專用性強,系統精簡,高實時性的系統軟件,多任務操作系統,需要專用的開發工具和環境
基本結構:
設備驅動層:
1) 硬件抽象層: 位于操作系統內核與硬件電路之間的接口層,目的在于將硬件抽象化,可以通過程序來控制硬件操作,提高了移植性
2)板級支持包:位于主板硬件 和 操作系統驅動層程序 之間的一層,主要實現對操作系統的支持,一般認為屬于操作系統第一部分?
3)設備驅動程序: 驅動程序為上層軟件提供設備的操作接口,軟件不用理會設備的具體內部函數;
-------------
操作系統的應用程序接口:API
? 某些操作可以通過操作系統或硬件本身具有的標準指令來調用,而無需重新編寫程序;
ARM 概述:
ARM: advanced RSIC Machines -- 先進的精簡指令集機器
計算機體系結構的分類:
?馮諾依曼體系:數據和指令都儲存在一個儲存器中
?哈佛體系結構:數據和指令各自分開
ARM特點:
RISC
隨著ARM的架構不斷地變換升級,最主要的是指令集在不斷地變化
CISC:復雜指令集計算機 但只有20%的指令被頻繁使用,所以提出了RISC
主要改變:
?1 減少指令?
?2 將指令長度固定,指令格式和尋址方式種類減少;
?3 以控制邏輯為主
流水線技術:
簡單的三級流水線:
? 取指級,譯址級,執行級 ----每一級中的硬件都可以獨立操作
? 不用等一個進程全部執行完再執行下一個
超標量技術:
重復設置多套指令執行部件,實現并行操作
ARM硬件結構:?
數據流模型:
ALU:運算器-來運算地址
MAC:乘累加單元
每一條指令都屬于一個指令集。與所有的RISC處理器一樣,采用Load-store 體系結構:
?沒有直接操作存儲器的數據處理指令-只能通過寄存器來完成
ARM處理器的工作模式和 工作狀態
處理器工作模式:
7種
工作狀態:
?ARM狀態: 執行32位的ARM指令集
Thumb:執行16位的thumb指令集
? 可以隨意切換,不影響數據內容和 工作模式
ARM寄存器
一共有37個32位寄存器: 31個為通用寄存器,6個狀態寄存器
最多有18個寄存器同時活動:16+2(狀態)
分為:
? 1) 通用寄存器:用于保存數據和地址
? 2) 狀態寄存器:用來標識或設置工作模式,狀態等功能
注意: thumb寄存器是ARM狀態下寄存器的一個子集
通用寄存器
1)未分組寄存器: 在所有工作模式下,未分組寄存器都指向同一個物理寄存器
2)? 分組寄存器:訪問的寄存器跟當前的工作模式有關
3)程序計數器(PC):program counter ,指向CPU運行的下一條指令
狀態寄存器
? ? 1個當前程序狀態計數器(CPSR):current program system?Register-可在任何工作模式下被訪問,用來保存ALU中當前的操作信息,控制允許,禁止中斷,設置處理器,工作模式等
? ? ?5個備份的狀態寄存器(SPSRs):用來進行異常處理
條件標識碼:可以被運算結果改變,也可以決定指令是否被執行(條件碼)
控制位:當發生異常時可以被改變
? 1) 中斷禁止位:I (IRQ)? ? F(FIQ):當標志為1時,表示禁止此類中斷
? 2)T標識位:用來表示工作狀態 1位 thumb 狀態
? 3) 工作模式為:有不同組合
保留位:用于ARM的擴展
ARM儲存結構
儲存器可分為(內存):
?1)隨機存儲器RAM
? ? ? ? SRAM:靜態隨機存儲器
? ? ? ? DRAM:動態隨機存儲器 DDRAM-雙倍速率-
?2) 只讀存儲器ROM
? ? ? ? ? ?掩膜ROM,?prom,eprom,eeprom,flash memory (NOR / NAND)等
存儲器的層次結構(宏觀):
?數據類型與存儲器格式
地址空間:從0開始的線性組合?
數據類型:可以最大為32位指令或向下兼容(16位)
儲存格式:小端---低地址放在低字節 ---DOSbox默認顯示此類
當非對齊指令時:要么結果不可預知,要么相應位被舍棄
第三章: ARM的指令系統
ARM指令集總覽:
ARM指令集詳解_流嵐虹霓的博客-CSDN博客_arm指令集
Thumb指令集
為了兼容16位的指令集,允許16位編碼
通常在32位數據總線寬度時,ARM指令集效率更好,16位則Thumb
每一條Thumb指令都有一條32位ARM指令相關--譯碼成等效的ARM指令
周期
時鐘周期:一個時鐘脈沖的長度稱為一個時鐘周期,是計算機系統時間基準,也是重要的性能指標
時鐘頻率(主頻):時鐘周期的倒數,很大程度上決定了微處理器的處理能力
指令周期:微處理器執行一條指令所需的時間,不同指令的周期不同
? 1) 不連續周期N:和上一個地址沒關聯
? 2) 連續周期S:地址相連接
? 3)? ?內部周期I:不請求傳輸,執行一個內部功能
? 4) 協處理器傳輸周期C:與協處理器在總線上傳輸一個字的周期
各種周期至少與時鐘周期一樣長
執行過程
像流水線特點一樣分為取值指,譯碼,執行等階段:通過三種總線和PC來完成
指令和指令格式:
指令
格式?
<條件操作碼>{條件域}{S-決定是否影響標志位}<目的寄存器><第一個操作數-寄存器>{第二個操作數} <>為必須具有 {}為可選擇?后綴
?后綴S:
加在操作碼后面表示影響條件標志位,永遠在在最后面,例如和條件執行碼一起時
?后綴!:
表示改變基地址的值,若用在單個寄存器后,必須有隱形的偏移量
條件執行
當加上條件標識碼,符合該條件時,才執行
?注意:是執行前檢測,與S不沖突?
ARM尋址方式
立即數尋址:#前綴
寄存器尋址:用寄存器里的數據當做操作數
寄存器間接尋址:寄存器的數據當做操作數的地址,通常用[]表示
移位尋址:配合指令 如LSL+# * 等來對寄存器進行移位,然后當做操作數
基地址尋址:用寄存器的數值當做基地址,立即數當做偏移地址 如ds[4] ==[ds+4]
多寄存器尋址:寄存器用{}包括 逗號隔開,連續的用-表示?
?相對尋址:用符號跳轉(當做偏移量,其實也是偏移地址)
?stack尋址:用LIFO的方式來獲得地址 pop,push等
數據處理指令
傳送指令:
mov
movn:將數據取反傳送?
移位操作(搭配寄存器使用)
LSL:? ? ?logical shift right 邏輯左移
LSR: 邏輯右移
ASR:算術右移(左邊補符號)
ROR:循環右移
RRX:帶進位的循環右移
算術指令:
一般三個操作數,第一個是目的寄存器
數字常量表達式:
add:加法
adc:帶進位的加法--->RD=Rn+op2+c(進位)
sub:減法
sbc:帶借位的減法-->
rsb:逆向減法,RD=op2-RN
rsc:帶借位的逆向減法
位運算指令:
and:與運算
or:或運算
xor:異或
bic:位清除? ?Rd=Rn and (!operand2),清除某些特定位置位置
比較指令:
會自動改變spsr中的標志位
cmp:比較
cmn:反向比較
TST:位測試 --------------與另一個操作數進行與操作,常用與檢查特定位
TEQ:與另一個數進行 異或操作 , 常用與比較
乘法指令:
乘加:先乘之間兩個,再加最后一個,再移動
數據加載與存儲指令
分為LDR(Load R):寄存器<------存儲器? ?str(store):寄存器---->存儲器
??
總覽:
?注意 后面的一個操作數一定是個地址!
根據是否改變基地址 分為三種類型:
都是先操作[ ] 里的內容
1) 前索引(不改變基地址的值)
- 表示 基地址減去后面的立即數/寄存器內容
2)自動索引 :加上! 改變基地址
3)后索引 :最后改變基地址
后面兩種在遍歷時很有用,相當于兩條指令合一起,避免了額外的指令時間和代碼空間開銷
----------------
第四章:ARM匯編程序設計
偽指令一覽:
關于ARM偽指令_亂舞春秋丶的博客-CSDN博客_arm偽指令
C+匯編
C語言&匯編混合編程 - 知乎 (zhihu.com)
C語言與匯編語言混合編程_zhengqijun_的博客-CSDN博客_c語言和匯編語言混合編程實例
第五章:異常和中斷
ARM中的異常和中斷_bird67的博客-CSDN博客
ARM異常及中斷處理介紹(中斷是異常的一種)_凡人不會死的博客-CSDN博客_arm中斷和異常的區別
7種異常(內含兩中斷)
概述:當ARM處理器執行協處理器指令時,它必須等待一個外部協處理器應答后,才能真正執行這條指令。若協處理器沒有響應,則發生未定義指令異常。若試圖執行未定義指令,也會出現未定義指令異常。未定義指令異常可用于在沒有物理協處理器的系統上,對協處理器進行軟件仿真,或通過軟件仿真實現指令集擴展。
3.軟中斷異常
概述:軟件中斷異常指令SWI進入特權模式,執行一些特權模式下的操作系統功能。
4.預取異常
概述:預取異常是由系統存儲器報告的。當處理器試圖去取一條被標記為預取無效的指令時,發生預取異常。如果系統中不包含MMU,指令預取異常中斷處理程序只是簡單地報告錯誤并退出;若包含MMU,引起異常的指令的物理地址被存儲到內存中。
5.數據異常
概述:數據異常時由存儲器發出數據中止信號,它由存儲器訪問指令Load/Store產生。當數據訪問指令的目標地址不存在或者該地址不允許當前指令訪問時,處理器產生數據訪問中止異常。
6.外部中斷異常
概述:當處理器的外部中斷請求引腳有效,并且CPSR寄存器的I控制位被清除時,處理器產生外部中斷異常。系統中各外部設備通常通過該異常中斷請求處理器服務。
7.快速中斷異常
概述:當處理器的快速中斷請求引腳有效且CPSR寄存器的F控制位被清除時,處理器產生快速中斷異常。
優先級:
對于兩種中斷請求,主要還是看 I位和 F位
注意點:
1)ARM把中斷(IRQ,FIQ)定義為一類特殊的異常。默認中斷是不可重入的(不能同時再發生同樣中斷)
2)FIQ和IRQ一般由外部設備引起的
? ? ? FIQ優先級比IRQ高,FIQ處理比較緊急的事物
? ? ? FIQ異常處理程序放在向量表的后面,這樣避免了跳轉的損耗,可以直接順序執行
3)CPSR標志寄存器中 I位置1表示禁止IRQ中斷 F位置1表示禁止FIQ中斷
4)SWI中斷為軟件中斷,用戶請求的功能,如dos下的 int 21h +特定寄存器參數來進行主動調用
總結
以上是生活随笔為你收集整理的汇编语言程序设计--基于ARM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 熊猫烧香源码分析_熊猫体育分析入门
- 下一篇: Handmade Hero全程直播游戏引