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