日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言程序设计--基于ARM

發(fā)布時(shí)間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言程序设计--基于ARM 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

環(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。