熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

新聞中心

ARM指令學(xué)習(xí)筆記

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
要學(xué)arm指令集,首先要了解什么是arm。眾所周知arm是advancedRISCmachines。而risc又是什么東西呢?即:reducedinstructionsetcomputer,精簡(jiǎn)指令集計(jì)算機(jī)。是一種是一種執(zhí)行較少類(lèi)型計(jì)算機(jī)指令的微處理器,起源于80年代的MIPS主機(jī)。由于指令少越簡(jiǎn)單,就需要更少的晶體管和電路元件,故它能夠以更快的速度執(zhí)行操作(每秒執(zhí)行更多百萬(wàn)條指令,即MIPS)。我想這也是nds游戲機(jī)要用arm處理器的原因,因?yàn)樗∏铱?,再者廉價(jià)。Arm呢,它是英國(guó)的一家公司,設(shè)計(jì)了大量高性能、廉價(jià)、耗能低的RISC處理器、相關(guān)技術(shù)及軟件。技術(shù)具有性能高、成本低和能耗省的特點(diǎn)。適用于多種領(lǐng)域,比如嵌入控制、消費(fèi)/教育類(lèi)多媒體、DSP和移動(dòng)式應(yīng)用等。這個(gè)公司ARM公司既不生產(chǎn)芯片也不銷(xiāo)售芯片,它只出售芯片技術(shù)授權(quán)。縱觀我們周?chē)氖謾C(jī),諾基亞n86,n97,n95,n96......摩托諾拉,索愛(ài),蘋(píng)果,三星,無(wú)一不大量使用arm處理器。而我們所要接觸的nds中的處理器ARM946E-S和ARM7TDMI是ARM公司研制的內(nèi)嵌式32BITRISCCPU。它具有低功耗、高性能、體積小、低價(jià)格等優(yōu)點(diǎn)。非常適合掌機(jī)使用。ARM946E-S是一種有5級(jí)流水線,集成有Thumb擴(kuò)展功能、調(diào)試功能和哈佛總線的內(nèi)核。在同樣工藝下,它是ARM7TDMI性能的兩倍以上。有了個(gè)簡(jiǎn)單了解之后,開(kāi)始投入到了arm指令的學(xué)習(xí)。

參考----------<百度>"arm百度百科","NDS百度百科"

本文引用地址:http://www.bjwjmy.cn/article/201611/316807.htm

接下來(lái)就是對(duì)arm指令的學(xué)習(xí)。

因?yàn)橛羞^(guò)前面8086指令的學(xué)習(xí),并且也寫(xiě)過(guò)像高精度計(jì)算這樣的匯編程序,看arm指

心里面老在比較這兩套指令。

arm7TDMI(-S)指令系統(tǒng)有兩套指令集,分別是32位的Arm指令集和16位的thumb指令集。簡(jiǎn)單點(diǎn)說(shuō):arm支持arm內(nèi)核的所有特點(diǎn),具有高效、快速的特點(diǎn);而thumb指令集靈活、小巧。二者可以互相調(diào)用,Thumb指令集可以看做是Arm的壓縮形式的子集,是針對(duì)代碼的密度問(wèn)題而提出的,Thumb指令都有對(duì)應(yīng)的Arm指令,但卻不是一個(gè)完整的系統(tǒng),例如:Thumb指令集沒(méi)有協(xié)處理器指令,信號(hào)量指令以及訪問(wèn)CPSR或SPSR的指令,沒(méi)有乘加指令及64位乘法指令等,且指令的第二操作數(shù)受到限制;除了跳轉(zhuǎn)指令B有條件執(zhí)行功能外,其它指令基本為無(wú)條件執(zhí)行.,等等。不一一敘述。而Arm指令集出了具有很多Thumb沒(méi)有的功能外,它最大的特點(diǎn)就是:高效。

Arm的寄存器是37個(gè),包括

31generalregisters(Rxx)

6status registers(xPSR)

對(duì)這37個(gè)寄存器的詳細(xì)描述我們可以從nocash.emubase.de這個(gè)網(wǎng)站上得到。

學(xué)習(xí)arm指令,最先接觸的是尋址指令。

Arm尋址指令可分為九類(lèi):

Arm指令 80x86中有嗎?

1.寄存器尋址;

2.立即尋址;
3.寄存器移位尋址; 無(wú)

4.寄存器間接尋址;
5..基址尋址;

6.多寄存器尋址; 無(wú)

7.堆棧尋址; 無(wú)

8.塊拷貝尋址; 無(wú)
9.相對(duì)尋址。

可以看到arm尋址指令里面有個(gè)很大的特色是它的寄存器移位尋址,即第二個(gè)操作數(shù)在與第一個(gè)操作數(shù)結(jié)合之前可以選擇進(jìn)行移位操作,例如:MOVR0,R2,LSL#3。而在80x86指令中這得要三步走:一次賦值(否則影響尋址變量的值)、一次移位、一次尋址。不僅帶來(lái)了視覺(jué)上的不便,而且給書(shū)寫(xiě)帶來(lái)了麻煩(更容易出錯(cuò))。另外,Arm指令還可以進(jìn)行多寄存器尋址,無(wú)疑簡(jiǎn)化了操作(具體點(diǎn)講,就是少寫(xiě)很多"LD""ST")。還可以看到我們?cè)赼rm指令中只需加個(gè)"!"就可以決定中間值是否保留。更加方便的是我們可以自由選擇變址前后指針的變化,例如塊拷貝尋址中就有四種:STMIA,STMIB,STMDA,STMDB.連遞減還是遞增,先變址還是先復(fù)制,Arm都給你預(yù)先設(shè)計(jì)好了,不能不說(shuō)它周全,這些都是80x86里沒(méi)有的,極大地方便了程序員的程序設(shè)計(jì)。

順帶說(shuō)一下其另一個(gè)便捷之處,加載/裝填數(shù)據(jù)時(shí),可以在命令后加H/B來(lái)表示對(duì)半字/字節(jié)的數(shù)據(jù)操作,默認(rèn)情況下是字。并且ARM可以實(shí)現(xiàn)一組寄存器和一塊連續(xù)內(nèi)存之間傳送數(shù)據(jù),如LDMIA和STMIA指令。

看完尋址,接下來(lái)才是Arm指令的重點(diǎn),

Arm指令的基本格式為:

{}{s},{,}

————————arm的32偽指令二進(jìn)制格式

其中<>內(nèi)的項(xiàng)是必須的,而{}內(nèi)的項(xiàng)是可選的。

Opcode:指令助記符

Cond:執(zhí)行條件

S:是否影響cpsr寄存器的值

Rd:目標(biāo)寄存器

Rn:第一個(gè)操作數(shù)的寄存器

Oprand2:第二個(gè)操作數(shù)

ARM指令可以分為6大類(lèi)

(1) 跳轉(zhuǎn)指令 B、BL、BLX、BX

(2)數(shù)據(jù)處理指令 數(shù)據(jù)傳送算術(shù)邏輯運(yùn)算比較

(3)程序狀態(tài)寄存器傳輸指令

(4)load/store指令

(5)協(xié)處理指令

(6)異常中斷指令

可以看到項(xiàng),這又是arm指令的一特色,可以將各種運(yùn)算指令與條件指令結(jié)合起來(lái)用,例如80x86中寫(xiě)個(gè)找ra,rb中教大數(shù)存入rc寄存器中需要這樣寫(xiě)

MOVE rcra

CMP rarb

JG NEXT

MOVE rcrb

NEXT

..............

而在arm中可以很方便地寫(xiě)成

MOVE rcra

CMP rarb

MOVECC rcrb

靈活運(yùn)用第二個(gè)操作數(shù)還能大大提高代碼的效率,例如我們要將r1寄存器中的數(shù)乘以9,可以在arm中很方便地寫(xiě)成

ADD R1,R1,R1,LSL#3

換成80x86,那就是一堆步驟了

MOVE R2,R1

SHL R2,3

ADD R1,R2

就是說(shuō)arm的指令更人性化,加上后來(lái)對(duì)arm偽指令的學(xué)習(xí),我個(gè)人覺(jué)得arm指令集是匯編中的高級(jí)語(yǔ)言了。

在ARM中乘法操作可以用于任意兩個(gè)寄存器結(jié)果可以保存到任意寄存器,而80x86則需要先將被乘數(shù)保存于AL/AX中再做乘法。并且高位和地位還要分開(kāi)保存至AX/AL和DX/AH中,麻煩!

ARM的中斷指令有:

(1)復(fù)位異常

(2)未定義指令異常

(3)軟件中斷異常

(4)預(yù)取指中斷異常

(5)數(shù)據(jù)中止異常

(6)中斷請(qǐng)求異常

(7)快速中斷(FIQ)請(qǐng)求異常

種類(lèi)繁多學(xué)起來(lái)很頭疼,不像80x86從頭到尾就是INT中斷那樣清爽。中斷這塊本人不甚明白,還需繼續(xù)努力學(xué)習(xí),

接下來(lái)的學(xué)習(xí)就到了偽指令。首先偽指令不是ARM指令集中的指令,只是為了編程方便編譯器定義了偽指令,使用時(shí)可以像其他ARM指令一樣使用,但在編譯時(shí)這些指令會(huì)被等效的ARM指令代替。雖說(shuō)有些偽指令只是一些極其簡(jiǎn)單的替換,但卻極大地方便我們編程??梢哉f(shuō)它是以它是一種特殊的助記符。

對(duì)于偽指令的學(xué)習(xí)也只是概念性的,沒(méi)法深刻,很多指令雖然知道意思但完全不知道哪兒用的著。有待今后的時(shí)間吧。

總的來(lái)說(shuō),ARM指令有一下幾種

1.符號(hào)定義偽指令

全局變量聲明:GBLA、GBLL和GBLS。
局部變量聲明:LCLA、LCLL和LCLS。
變量賦值:SETA、SETL和SETS。
為一個(gè)通用寄存器列表定義名稱(chēng):RLIST。
為一個(gè)協(xié)處理器的寄存器定義名稱(chēng):CN。
為一個(gè)協(xié)處理定義名稱(chēng):CP。
為一個(gè)VFP寄存器定義名稱(chēng):DN和SN。
為一個(gè)FPA浮點(diǎn)寄存器定義名稱(chēng):FN。

2.數(shù)據(jù)定義偽指令
聲明一個(gè)文字池:LTORG。
定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址:MAP。
定義結(jié)構(gòu)化內(nèi)存表中的一個(gè)數(shù)據(jù)域:FIELD。
分配一塊內(nèi)存空間,并用0初始化:SPACE。
分配一段字節(jié)的內(nèi)存單元,并用指定的數(shù)據(jù)初始化:DCB。
分配一段字的內(nèi)存單元,并用指令的數(shù)據(jù)初始化:DCD和DCDU。
分配一段字的內(nèi)存單元,將每個(gè)單元的內(nèi)容初始化為該單元相對(duì)于靜態(tài)基址寄存器的偏移量:DCDO。
分配一段雙字的內(nèi)存單元,并用雙精度的浮點(diǎn)數(shù)據(jù)初始化:DCFD和DCFDU。
分配一段字的內(nèi)存單元,并用單精度的浮點(diǎn)數(shù)據(jù)初始化:DCFS和DCFSU。
分配一段字的內(nèi)存單元,并用單精度的浮點(diǎn)數(shù)據(jù)初始化,指定內(nèi)存單元存放的是代碼,而不是數(shù)據(jù):DCI。
分配一段雙字的內(nèi)存單元,并用64位整數(shù)數(shù)據(jù)初始化:DCQ和DCQU。
分配一段半字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化:DCW和DCWU。

斷言錯(cuò)誤:ASSERT。這個(gè)指令比較神奇,可以在程序首寫(xiě)一些諸如ASSERTtop<>temp的斷言錯(cuò)誤指令,在匯編編譯器對(duì)匯編程序的第二遍掃描中,如果其中
ASSERT條件不成立,ASSERT偽指令將報(bào)告該錯(cuò)誤信息,從而減少錯(cuò)誤。有點(diǎn)像C++中try和catch。

3.匯編控制偽指令/宏偽指令

匯編控制偽指令用于條件匯編、宏定義、重復(fù)匯編控制等。該類(lèi)偽指令如下:
條件匯編控制:IF、ELSE和ENDIF
宏定義:MACRO和MEND
重復(fù)匯編:WHILE及WEND

這些就是它有點(diǎn)像高級(jí)語(yǔ)言的地方,可以用偽指令實(shí)現(xiàn)某些高級(jí)語(yǔ)句。其實(shí)高級(jí)語(yǔ)言不就是一個(gè)個(gè)匯編指令的打包嗎?大同小異。

值得提及的是MACRO和MEND,這個(gè)東西感覺(jué)就是C中的#define,很強(qiáng)大。

其偽指令格式:
MACRO
{$label}macroname{$parameter}{$parameter}…

其中:$label宏指令被展開(kāi)時(shí),label可被替換成相應(yīng)的符號(hào),通常為一個(gè)標(biāo)號(hào)在一個(gè) 符號(hào)前使用$表示被匯編時(shí)將使用相應(yīng)的值替代$后的符號(hào)。
macroname所定義的宏的名稱(chēng)。
$parameter宏指令的參數(shù)。當(dāng)宏指令被展開(kāi)時(shí)將被替換成相應(yīng)的值,類(lèi)似于函數(shù) 中的形式參數(shù)。

可以實(shí)現(xiàn)參數(shù)的傳遞!!這種偽指令讓人看上去就有想去嘗試使用的沖動(dòng),以后一定會(huì)有機(jī)會(huì)的!

這里簡(jiǎn)單假想下使用:

C語(yǔ)言中:#definebigger(a,b)(a>b)

可以寫(xiě)成(可能會(huì)有錯(cuò),僅僅嘗試一下而已):

MACRO

$labelbigger$a,$b

$label

;GL1為一個(gè)定義的全局變量

CMP $a,$b

MOVEGT GL1,1

MOVELE GL1,1

MEND

調(diào)用testbiggera,b

然后在GL1中得到大小結(jié)果

當(dāng)然我們可以直接比較,這里只是為了演示一下。

4.雜項(xiàng)偽指令

雜項(xiàng)偽指令在匯編編程設(shè)計(jì)較為常用,如段定義偽指令,入口點(diǎn)設(shè)置偽指令,包含 文件偽指令,標(biāo)號(hào)導(dǎo)出或引入聲明等,該類(lèi)偽指令如下:
邊界對(duì)齊:ALIGN。
段定義:AREA。
指令集定義:CODE16和CODE32。
匯編結(jié)束:END。
程序入口:ENTRY。
常量定義:EQU。
聲明一個(gè)符號(hào)可以被其它文件引用:EXPORT和GLORBAL。
聲明一個(gè)外部符號(hào):IMPORT和EXTERN。
包含文件:GET和INCLUDE。
包含不被匯編的文件:INCBIN。
保留符號(hào)表中的局部符號(hào):KEEP。
禁止浮點(diǎn)指令:NOFP。
指示兩段之間的依賴(lài)關(guān)系:REQUIRE。
堆棧8字節(jié)對(duì)準(zhǔn):PEQUIRE8和PRESERVE8。
給特定的寄存器命名:RN。
標(biāo)記局部標(biāo)號(hào)使用范圍的界限:ROUT。

最后一塊是C與匯編混合編程。

(1)c中內(nèi)嵌匯編。曾今看過(guò)個(gè)故事:一個(gè)物理學(xué)家寫(xiě)一個(gè)模擬天體運(yùn)行的程序,分別從算法和指令兩方面經(jīng)行優(yōu)化,用了一個(gè)月的時(shí)間將一個(gè)原本要幾年才能出結(jié)果的程序縮短到十幾分鐘。這其中有個(gè)很重要的一步,就是將某些重用性很大的高級(jí)語(yǔ)言程序塊用匯編語(yǔ)言直接書(shū)寫(xiě)。大大縮短了程序運(yùn)行的極限時(shí)間。曾今也好奇過(guò),高級(jí)語(yǔ)言里面怎么去內(nèi)嵌匯編?

_asm

{

指令[;指令]

...

[指令]
}

內(nèi)嵌匯編程序?qū)拇嫫?、常量、?biāo)號(hào)等有很多限制,就不多說(shuō)了。

(2)匯編中內(nèi)嵌c語(yǔ)言程序

(3)C與匯編互相調(diào)用

在學(xué)習(xí)ARM指令的過(guò)程中,遇到過(guò)很多問(wèn)題,第一次碰到往往非常不解,還有些個(gè)該注意的地方,當(dāng)然了,問(wèn)題和需呀注意的地方遠(yuǎn)不止這些。這些只是個(gè)人覺(jué)得一些比較典型的,寫(xiě)在這里與諸位分享:

1.#immed_8r常數(shù)表達(dá)式時(shí)“該常數(shù)必須對(duì)應(yīng)8位位圖,即常數(shù)是由一個(gè)8位的常數(shù)循環(huán)移位偶數(shù)位得到的。”

其意思是這樣:#immed_8r在芯片處理時(shí)表示一個(gè)32位數(shù),但是它是由一個(gè)8位數(shù)(比如:01011010,即0x5A)通過(guò)循環(huán)移位偶數(shù)位得到(10000000000000000000000000010110,就是0x5A通過(guò)循環(huán)右移2位(偶數(shù)位)的到的)。

而10100000000000000000000000010110,就不符合這樣的規(guī)定,編譯時(shí)一定出錯(cuò)。因?yàn)槟憧赡芡ㄟ^(guò)將10110101循環(huán)右移位得到它,但是不可能通過(guò)循環(huán)移位偶數(shù)位得到。

10110000000000000000000000010110,也不符合這樣的規(guī)定,很明顯:101101011有9位。

2.什么叫帶符號(hào)擴(kuò)展.

當(dāng)從16位向32位賦值時(shí),若選擇無(wú)符號(hào)擴(kuò)展,那高位補(bǔ)零。選擇有符號(hào)擴(kuò)展,那32中的16位按照16位最高位補(bǔ)齊。

例如1101010110101010------->11111111111111111101010110101010

0101010110101010------->000000000000000101010110101010

關(guān)于為什么這樣補(bǔ),可以參照補(bǔ)碼定義,這里介紹一種簡(jiǎn)單的補(bǔ)碼計(jì)算方法:

N位絕對(duì)值為k的數(shù)的補(bǔ)碼為:2^n-k.比那個(gè)取反加一得來(lái)得清爽一點(diǎn)。

3.我們說(shuō)有四種類(lèi)型的堆棧尋址方式,LDMFA,STMFA,LDMEA,STMEA。

注意F表示full,E表示empty,A表示after,B表示before。

我們假設(shè):在C語(yǔ)言中stack[]為堆棧數(shù)組,top為堆的頂指針。為方便理解。我用c語(yǔ)言描述了一下。

堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出(FirstInLastOut,F(xiàn)ILO)的方式工作,使用一個(gè)稱(chēng)作堆棧指針的專(zhuān)用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。

當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí),稱(chēng)為滿堆棧(FullStack),而當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置時(shí),稱(chēng)為空堆棧(EmptyStack)。

同時(shí),根據(jù)堆棧的生成方式,又可以分為遞增堆棧(AscendingStack)和遞減堆棧(DecendingStack),當(dāng)堆棧由低地址向高地址生成時(shí),稱(chēng)為遞增堆棧,當(dāng)堆棧由高地址向低地址生成時(shí),稱(chēng)為遞減堆棧。這樣就有四種類(lèi)型的堆棧工作方式,ARM微處理器支持這四種類(lèi)型的堆棧工作方式,即:

◎Fulldescending滿遞減堆棧

堆棧首部是高地址,堆棧向低地址增長(zhǎng)。棧指針總是指向堆棧最后一個(gè)元素(最后一個(gè)元素是最后壓入的數(shù)據(jù))。

ARM-Thumb過(guò)程調(diào)用標(biāo)準(zhǔn)和ARM、ThumbC/C++編譯器總是使用Fulldescending類(lèi)型堆棧。

C語(yǔ)言表示:stack[--top]=value

◎Fullascending滿遞增堆棧

堆棧首部是低地址,堆棧向高地址增長(zhǎng)。棧指針總是指向堆棧最后一個(gè)元素(最后一個(gè)元素是最后壓入的數(shù)據(jù))。

C語(yǔ)言表示:stack[top--]=value

◎Emptydescending空遞減堆棧

堆棧首部是低地址,堆棧向高地址增長(zhǎng)。棧指針總是指向下一個(gè)將要放入數(shù)據(jù)的空位置。

C語(yǔ)言表示:stack[++top]=value

◎Emptyascending空遞增堆棧

堆棧首部是高地址,堆棧向低地址增長(zhǎng)。棧指針總是指向下一個(gè)將要放入數(shù)據(jù)的空位置。

操作堆棧的匯編指令

C語(yǔ)言表示:stack[top++]=value

4.算術(shù)位移/邏輯位移/循環(huán)位移

算術(shù)位移,邏輯位移邏輯右移最高位補(bǔ)0,最低位進(jìn)入CF,相當(dāng)于每移一位除以2,一般對(duì)于無(wú)符號(hào)數(shù)使用 如:133/8=16余5 MOVAL,10000101B MOVCL,03H SHRAL,CL AL=10H=16 算術(shù)右移最高位(即符號(hào)位)保持不變,而不是補(bǔ)0最低位進(jìn)入CF.相當(dāng)于每移一位除2,一般對(duì)于有符號(hào)數(shù)使用8/8 MOVAL,10000000B MOVCL,03H SARAL,CL AL=0F0H=-16

----------分別對(duì)應(yīng)邏輯左移、邏輯右移、算術(shù)右移、循環(huán)右移

5.關(guān)于ARM的B,BL跳轉(zhuǎn)指令

假設(shè)跳轉(zhuǎn)指令處的地址是A,跳轉(zhuǎn)目標(biāo)處的地址是B.
B,BL指令保存的是偏移地址,這個(gè)地址的計(jì)算方法是:
1.B-(A+8).A+8是因?yàn)锳RM的流水線使得指令執(zhí)行到A處時(shí),PC實(shí)際的值是A+8.2.第一步得到的值是4的倍數(shù),因?yàn)锳RM的指令是4對(duì)齊的,即最低兩位為00.于是將這個(gè)值右移兩位.
3.得到最終偏移

執(zhí)行時(shí):
1.取出偏移
2.左移兩位
3.加入PC,這時(shí)PC的值剛好為目標(biāo)處的地址值,即目標(biāo)地址指令進(jìn)入取指,流水線前兩級(jí)被清空

但是為什么是減去8呢?這因?yàn)锳RM7是三級(jí)流水線。

那什么三級(jí)流水線是什么?

PC代表程序計(jì)數(shù)器,流水線使用三個(gè)階段,因此指令分為三個(gè)階段執(zhí)行:1.取指(從存儲(chǔ)器裝載一條指令);2.譯碼(識(shí)別將要被執(zhí)行的指令);3.執(zhí)行(處理指令并將結(jié)果寫(xiě)回寄存器)。即執(zhí)行時(shí)取指已經(jīng)提前兩個(gè)字了,即8個(gè)字節(jié)。

6.什么是軟中斷?

  軟中斷是利用硬件中斷的概念,用軟件方式進(jìn)行模擬,實(shí)現(xiàn)宏觀上的異步執(zhí)行效果。很多情況下,軟中斷和"信號(hào)"有些類(lèi)似,同時(shí),軟中斷又是和硬中斷相對(duì)應(yīng)的,"硬中斷是外部設(shè)備對(duì)CPU的中斷","軟中斷通常是硬中斷服務(wù)程序?qū)?nèi)核的中斷","信號(hào)則是由內(nèi)核(或其他進(jìn)程)對(duì)某個(gè)進(jìn)程的中斷"(《Linux內(nèi)核源代碼情景分析》第三章)?! ≤浿袛嗟囊环N典型應(yīng)用就是所謂的"下半部"(bottomhalf),它的得名來(lái)自于將硬件中斷處理分離成"上半部"和"下半部"兩個(gè)階段的機(jī)制:上半部在屏蔽中斷的上下文中運(yùn)行,用于完成關(guān)鍵性的處理動(dòng)作;而下半部則相對(duì)來(lái)說(shuō)并不是非常緊急的,通常還是比較耗時(shí)的,因此由系統(tǒng)自行安排運(yùn)行時(shí)機(jī),不在中斷服務(wù)上下文中執(zhí)行。bottomhalf的應(yīng)用也是激勵(lì)內(nèi)核發(fā)展出目前的軟中斷機(jī)制的原因?! ≤浿袛嗍莑inux系統(tǒng)原“底半處理”的升級(jí),在原有的基礎(chǔ)上發(fā)展的新的處理方式,以適應(yīng)多cpu、多線程的軟中斷處理?! ∫话銇?lái)說(shuō),軟中斷是由內(nèi)核機(jī)制的觸發(fā)事件引起的(例如進(jìn)程運(yùn)行超時(shí)),但是不可忽視有大量的軟中斷也是由于和硬件有關(guān)的中斷引起的,例如當(dāng)打印機(jī)端口產(chǎn)生一個(gè)硬件中斷時(shí),會(huì)通知和硬件相關(guān)的硬中斷,硬中斷就會(huì)產(chǎn)生一個(gè)軟中斷并送到操作系統(tǒng)內(nèi)核里,這樣內(nèi)核就會(huì)根據(jù)這個(gè)軟中斷喚醒睡眠在打印機(jī)任務(wù)隊(duì)列中的處理進(jìn)程。  在網(wǎng)絡(luò)編程中,軟中斷用來(lái)引發(fā)協(xié)議層代碼的執(zhí)行

7.關(guān)于程序狀態(tài)的切換

程序不能通過(guò)修改直接修改CPSR中的T控制位直接將程序狀態(tài)切換到Thumb狀態(tài),必須通過(guò)BX等指令完成程序狀態(tài)的切換

8.對(duì)于LDMIA指令,Rn的最終值是加載的值,而不是增加后的地址



關(guān)鍵詞: ARM指令學(xué)習(xí)筆

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉