嵌入式系統(tǒng)講義.ppt_第1頁(yè)
嵌入式系統(tǒng)講義.ppt_第2頁(yè)
嵌入式系統(tǒng)講義.ppt_第3頁(yè)
嵌入式系統(tǒng)講義.ppt_第4頁(yè)
嵌入式系統(tǒng)講義.ppt_第5頁(yè)
已閱讀5頁(yè),還剩202頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嵌入式系統(tǒng)講義第3章 ARM指令系統(tǒng),周?chē)?guó)運(yùn) 2007.3,第3章 ARM指令系統(tǒng),主要內(nèi)容 3.1 ARM指令結(jié)構(gòu) 3.2 ARM尋址方式 3.3 ARM指令集 3.4 Thumb指令集 3.5 ARM偽指令 3.6 ARM匯編語(yǔ)言程序設(shè)計(jì),3.1 ARM指令系統(tǒng)概述,主要內(nèi)容 一、指令系統(tǒng)概念 二、ARM指令的特點(diǎn) 三、ARM指令的格式 四、指令的條件碼,3.1 ARM指令系統(tǒng)概述,一、指令系統(tǒng)概念 指令:是規(guī)定計(jì)算機(jī)進(jìn)行某種操作的命令。 指令系統(tǒng):計(jì)算機(jī)能夠執(zhí)行的各種指令的集合。 二、ARM指令的特點(diǎn) 所有指令都是32位的。 大多數(shù)指令都在單周期內(nèi)完成。 所有指令都可以條件執(zhí)行。 ARM

2、指令為load/store類(lèi)型。 基本指令僅36條,分成五類(lèi)。 有7種尋址方式。 指令集可以通過(guò)協(xié)處理器擴(kuò)展。,ARM指令是加載/存儲(chǔ)(Load/Store)型: 也即指令集僅能處理寄存器中的數(shù)據(jù),而且處理結(jié)果都要放回寄存器中,而對(duì)系統(tǒng)存儲(chǔ)器的訪(fǎng)問(wèn)則需要通過(guò)專(zhuān)門(mén)的加載/存儲(chǔ)指令來(lái)完成。 ARM指令可以分為五大類(lèi): 數(shù)據(jù)處理指令、存儲(chǔ)器訪(fǎng)問(wèn)指令、分支指令、協(xié)處理器指令、雜項(xiàng)指令。 ARM指令有7種尋址方式: 立即尋址、寄存器尋址、寄存器間接尋址、基址尋址、堆棧尋址 、塊拷貝尋址、相對(duì)尋址。,三、ARM指令的格式 ARM指令基本的語(yǔ)法格式為: s , , Opcode:指令操作碼。 cond:指令

3、的條件碼。 S:決定指令的操作是否影響cpsr的值。 Rd:目標(biāo)寄存器編碼。 Rn:包含第一個(gè)操作數(shù)的寄存器編碼。 Operand2:第2操作數(shù)。 ARM指令典型的編碼格式為: (數(shù)據(jù)處理指令類(lèi)),例: ADDS R2,R1,#1 SUBNES R2,R1,#0 x20 LDR R0,R1,四、指令的條件碼 條件碼的位數(shù)和位置:每條ARM指令包含4位條件碼域,它占用指令編碼的最高四位31:28。 條件碼的表示:條件編碼共 24 16 種,其中,15種用于指令的條件碼。每種條件碼用2個(gè)英文縮寫(xiě)字符表示。(見(jiàn)P47 表2-6) 帶條件指令的執(zhí)行:ARM處理器根據(jù)指令的執(zhí)行條件是否滿(mǎn)足,決定當(dāng)前指令

4、是否執(zhí)行。 只有在cpsr中的條件標(biāo)志位滿(mǎn)足指定的條件時(shí),指令才會(huì)被執(zhí)行。不符合條件的代碼依然占用一個(gè)時(shí)鐘周期(相當(dāng)于一個(gè)NOP指令)。 條件碼的書(shū)寫(xiě)方法:條件碼的位置在指令助記符的后面(因此也稱(chēng)為條件后綴)。 例如: MOVEQ R0, R1,指令條件碼表,3.2 ARM尋址方式,主要內(nèi)容 一、立即尋址 二、寄存器尋址 三、寄存器間接尋址 四、基址尋址 五、堆棧尋址 六、塊拷貝尋址 七、相對(duì)尋址,3.2 ARM尋址方式,尋址方式:處理器根據(jù)指令中給出的(地址)信息,尋找操作數(shù)(物理地址)的方式。 我們將ARM指令系統(tǒng)的尋址方式分為7種(有分為9種的等)。,3.2.1 立即尋址,立即尋址也叫立

5、即數(shù)尋址。 立即尋址概念:操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù)。這個(gè)操作數(shù)被稱(chēng)為立即數(shù),對(duì)應(yīng)的尋址方式也就叫做立即尋址。 ADD R0,R0,1 ;R0R01 MOV R0,0 x3f; R00 x3f 書(shū)寫(xiě)立即數(shù)時(shí),要求以“”為前綴。 十六進(jìn)制數(shù),后加 0 x或 uses 0 x40 ror 26 ADD R1,R2,#0 xFF0000; uses 0 xFF ror 16 帶有立即數(shù)的MOV 指令的二進(jìn)制編碼為: MOV R0,#0 xF200 ;E3A00CF2. MOV R1,#0 x110000 ;E3A01811. MOV R4,#0 x12800 ;E3A04

6、B4A.,0 xF200 =0 xF2循環(huán)右移(2*C) 0 x110000 =0 x11循環(huán)右移(2*8) 0 x12800 =0 x4A循環(huán)右移(2*B),只有能夠通過(guò)此構(gòu)造方法得到的才是合法的立即數(shù)。 合法立即數(shù): 0 xFF;0 x104(其8位圖為0 x41);0 xFF0;0 xFF00 非法立即數(shù): 0 x101;0 x102;0 xFF1 深入理解:一個(gè)合法的立即數(shù)可能有多種編碼方法,將使某些指令的執(zhí)行產(chǎn)生不同的結(jié)果。 如 0 x3F0 ARM匯編編譯器生成立即數(shù)的規(guī)則為: 當(dāng)立即數(shù)數(shù)值在0到0 xFF范圍時(shí),令immed_8=,rot=0。 其它情況下,匯編編譯器選擇使rot

7、數(shù)值最小的編碼方式。,3.2.2 寄存器尋址,寄存器尋址: 利用寄存器中的數(shù)值作為操作數(shù)。 這種尋址方式是各類(lèi)微處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。 兩種具體形式:寄存器尋址、寄存器移位尋址。 一、寄存器尋址 如指令: ADDR0,R1,R2;R0R1R2,二、寄存器移位尋址 1、寄存器移位尋址 當(dāng)?shù)诙僮鲾?shù)為寄存器型時(shí),在執(zhí)行寄存器尋址操作時(shí),也可以對(duì)第二操作數(shù)寄存器進(jìn)行移位,此時(shí)第二操作數(shù)形式為: MOV Rd, Rn, Rm, 其中: Rm 稱(chēng)為第二操作數(shù)寄存器 用來(lái)指定移位類(lèi)型和移位位數(shù),有兩種形式: 5位立即數(shù)(其值小于32) 寄存器(用Rs表示)(其值小于32

8、) 在指令執(zhí)行時(shí)將寄存器移位后的內(nèi)容作為第二操作數(shù)參與運(yùn)算。例如指令: ADD R3,R2,R1,LSR #2 ;R3R2+(R1右移2位) ADD R3,R2,R1,LSR R0 ;R3R2+(R1右移R0位),2、第二操作數(shù)移位方式 共有6種移位方式: LSL 邏輯左移 LSR 邏輯右移 ASL 算術(shù)左移 ASR 算術(shù)右移 ROR 循環(huán)右移 RRX 帶擴(kuò)展的循環(huán)右移 (1)LSL:邏輯左移,空出的最低有效位用0填充。,0,(2) LSR:邏輯右移,空出的最高有效位用0填充。,31 0,SUB R3,R2,R1,LSL #2 ;R3R2-(R1左移2位) SUB R3,R2,R1,LSR R

9、0 ;R3R2-(R1右移R0位),(3)ASL:算術(shù)左移,由于左移空出的有效位用0填充,因此它與LSL同義。 (4)ASR:算術(shù)右移 (Arithmetic Shift Right) 。算術(shù)移位的對(duì)象是帶符號(hào)數(shù),移位過(guò)程中必須保持操作數(shù)的符號(hào)不變。如果源操作數(shù)是正數(shù),空出的最高有效位用0填充,如果是負(fù)數(shù)用1填充。 30 0,ADD R3,R2,R1,ASL #2 ;R3R2+(R1左移2位) SUB R3,R2,R1,ASR R3 ;R3R2-(R1算術(shù)右移R3位),(5)ROR:循環(huán)右移(Rotate Right),移出的字的最低有效位依次填入空出的最高有效位。 31 0 (6)RRX:帶

10、進(jìn)位位的循環(huán)右移(Rotate Right Extended) 。將寄存器的內(nèi)容循環(huán)右移1位,空位用原來(lái)C標(biāo)志位填充。 31 0,SUB R3,R2,R1,ROR #2 ;R3R2+(R1循環(huán)右移2位) SUB R3,R2,R1,RRX R0 ;R3R2-(R1帶進(jìn)位位循環(huán)右移R0位),3、第二操作數(shù)的移位位數(shù) 移位位數(shù)可以用立即數(shù)方式或者寄存器方式給出,其值均小于32,應(yīng)為0-31。 如下所示: ADD R3,R2,R1,LSR #2 ;R3R2+(R1右移2位) ADD R3,R2,R1,LSR R4 ;R3R2+(R1右移R4位) 寄存器R1的內(nèi)容分別邏輯右移2位、R4位,再與寄存器R2

11、的內(nèi)容相加,結(jié)果放入R3中。,3.2.3 寄存器間接尋址,寄存器間接尋址 就是以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)單元中。例如以下指令: LDRR0,R1;R0R1 STRR0,R1;R1R0 第一條指令將以R1的值為地址的存儲(chǔ)單元中的內(nèi)容加載到寄存器R0中。 第二條指令將R0的內(nèi)容存儲(chǔ)到以R1的值為地址的存儲(chǔ)單元中。 R1基址寄存器 R1的內(nèi)容基地址,3.2.4 變址尋址,一、變址尋址 也叫基址加偏(變)址尋址 將基址寄存器的內(nèi)容與指令中給出的地址偏移量相加,得到操作數(shù)所在的存儲(chǔ)器的有效地址。 變址尋址方式常用于訪(fǎng)問(wèn)某基地址附近的地址單元。(4K),例如: LDR R0,R

12、1,4 ;R0mem32R14,二、偏移地址方式 有三種加偏址的方式 1、前變址模式(不修改基址寄存器): 先基址+偏址,生成操作數(shù)地址,做指令指定的操作。 也叫前索引偏移。,2、自動(dòng)變址模式(修改基址寄存器): 先基址+偏移,生成操作數(shù)地址,做指令指定的操作。然后自動(dòng)修改基址寄存器。 例如: LDR R0,R1,4! ;R0mem32 R14 ;R1R14 ! 表示更新基址寄存器。,3、后變址模式(修改基址寄存器): 基址寄存器不加偏移作為操作數(shù)地址。 完成指令操作后,用(基址+偏移)的值修改基址寄存器。 即先用基地址傳數(shù),然后修改基地址(基址+偏移),也叫后索引偏移。,三、偏移地址形式 可

13、以是一個(gè)立即數(shù),也可以是另一個(gè)寄存器,并且還可以是寄存器移位操作。如下所示: LDR r0,r1,r2 ;r0mem32r1+r2 LDR r0,r1,r2,LSL #2;r0mem32r1+r2*4 常用的是立即數(shù)偏移的形式。,3.2.5 堆棧尋址 堆棧尋址 堆棧尋址是隱含的,它使用一個(gè)專(zhuān)門(mén)的寄存器(堆棧指針SP)指向一塊存儲(chǔ)區(qū)域(堆棧)。 堆??煞譃閮煞N增長(zhǎng)方式: 向上生長(zhǎng):向高地址方向生長(zhǎng),稱(chēng)為遞增堆棧。 向下生長(zhǎng):向低地址方向生長(zhǎng),稱(chēng)為遞減堆棧。,根據(jù)堆棧指針指向的數(shù)據(jù)位置的不同,可分為: 滿(mǎn)堆棧 堆棧指針指向最后壓入堆棧的有效數(shù)據(jù)項(xiàng),稱(chēng)為滿(mǎn)堆棧; 空堆棧 堆棧指針指向下一個(gè)待壓入數(shù)據(jù)

14、的空位置,稱(chēng)為空堆棧。 這樣就有4種類(lèi)型的堆棧表示遞增和遞減的滿(mǎn)和空堆棧的各種組合。,四種類(lèi)型的堆棧工作方式 滿(mǎn)遞增堆棧FA( Full Ascending ): 堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生長(zhǎng)。 滿(mǎn)遞減堆棧FD: 堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生長(zhǎng)。 空遞增堆棧EA: 堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由低地址向高地址生長(zhǎng)。 空遞減堆棧ED( Empty Descending ): 堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由高地址向低地址生長(zhǎng)。,第5次到此,3.2.6 塊拷貝尋址 一、塊拷貝尋址 把存儲(chǔ)器中的一個(gè)數(shù)據(jù)塊加載到多個(gè)寄存器中,或者是把

15、多個(gè)寄存器中的內(nèi)容保存到存儲(chǔ)器中。 應(yīng)用指令:塊拷貝尋址是多寄存器傳送指令LDM/STM的尋址方式,因此也叫多寄存器尋址。 塊拷貝尋址操作中的寄存器,可以是R0-R15這16個(gè)寄存器的子集(一部分),或是所有寄存器。,二、4種尋址操作 LDMIA / STMIAIncrement After(先傳送,后地址加4) LDMIB / STMIBIncrement Before(先地址加4 ,后傳送) LDMDA / STMDADecrement After(先傳送,后地址減4) LDMDB / STMDBDecrement Before (先地址減4,后傳送),地址遞減,指針最后位置,地址遞增,指

16、針最后位置,多寄存器load和stroe指令的堆棧和塊拷貝對(duì)照,STMFA(Full、Add):棧滿(mǎn)遞增。F-棧頂滿(mǎn)空;A-棧增減 LDMIB*(Inc、Befo):塊先增地址、再傳數(shù)。,3.2.7 相對(duì)尋址 相對(duì)尋址 與基址變址尋址方式相類(lèi)似,相對(duì)尋址以程序計(jì)數(shù)器PC的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。 相對(duì)尋址指令舉例如下: BL SUBRl ;調(diào)用到SUBRl子程序 . . .; SUBRl應(yīng)為24位有符號(hào)數(shù) SUBR1 MOV PC, LR ;返回,3.3 ARM指令集,主要內(nèi)容 1、存儲(chǔ)器訪(fǎng)問(wèn)指令 2、數(shù)據(jù)處理指令 3、分支指令 4、協(xié)處

17、理器指令 5、雜項(xiàng)指令 6、ARM偽指令,3.3.1 存儲(chǔ)器訪(fǎng)問(wèn)指令,ARM微處理器用加載/存儲(chǔ)指令訪(fǎng)問(wèn)存儲(chǔ)器,實(shí)現(xiàn)在寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。加載指令用于將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器,存儲(chǔ)指令則完成相反的操作。 由于ARM處理器對(duì)外設(shè)寄存器、I/O映射空間與存儲(chǔ)器統(tǒng)一編址,因此,對(duì)外圍設(shè)備的I/O操作也用此類(lèi)指令。 基本的加載/存儲(chǔ)指令僅有5條,分為3種: LDR和STR,單寄存器加載/存儲(chǔ)指令 LDM和STM,多寄存器加載/存儲(chǔ)指令 SWP,寄存器和存儲(chǔ)器數(shù)據(jù)交換指令,一、單寄存器的存取指令,單寄存器加載/存儲(chǔ)指令是ARM在寄存器和存儲(chǔ)器間傳送單個(gè)字節(jié)和字的最靈活方式。 根據(jù)傳送數(shù)據(jù)的類(lèi)

18、型不同,單個(gè)寄存器存取指令又可以分為以下兩類(lèi): 單字和無(wú)符號(hào)字節(jié)的加載/存儲(chǔ)指令 半字和有符號(hào)字節(jié)的加載/存儲(chǔ)指令,1、單字和無(wú)符號(hào)字節(jié)的加載存儲(chǔ)指令 LDR: 指令從內(nèi)存中取32位字或8位無(wú)符號(hào)字節(jié)數(shù)據(jù)放入寄存器; STR: 指令將寄存器中的32位字或8位無(wú)符號(hào)字節(jié)數(shù)據(jù)保存到存儲(chǔ)器中。 注意: 無(wú)符號(hào)字節(jié)加載時(shí),用0將8位的操作數(shù)擴(kuò)展到32位。,(1)指令格式 LDRcondT Rd, ;加載指定地址上的字?jǐn)?shù)據(jù),放入Rd中。 STRcondT Rd, ;存儲(chǔ)Rd中字?jǐn)?shù)據(jù),到指定地址的存儲(chǔ)單元。 LDRcondBT Rd, ;加載字節(jié)數(shù)據(jù)到Rd中, Rd最低字節(jié)有效, 高24位為0。 STRc

19、ondBT Rd, ;存儲(chǔ)Rd中字節(jié)數(shù)據(jù), Rd中最低字節(jié)為傳送數(shù)據(jù)。,T后綴 T為可選后綴,若指令有T,那么即使處理器是在特權(quán)模式下,存儲(chǔ)系統(tǒng)也將訪(fǎng)問(wèn)看成是處理器是在用戶(hù)模式下。 用于存儲(chǔ)器保護(hù)。 不能與前變址模式、自動(dòng)變址模式一起使用(即不能改變基址寄存器值)。 T在用戶(hù)模式下無(wú)效。,(2)操作數(shù)尋址方式 LDR/STR指令為變址尋址,由兩部分組成: 基地址部分:為一個(gè)基址寄存器,可以為任一個(gè)通用寄存器; 偏移地址部分:這一部分非常靈活,實(shí)際就是第二個(gè)操作數(shù),可以有以下3種格式: 立即數(shù) 寄存器 寄存器及移位常數(shù)。, 立即數(shù) 12位立即數(shù)可以是一個(gè)無(wú)符號(hào)的數(shù)值。這個(gè)數(shù)據(jù)可以加到基址寄存器,

20、也可以從基址寄存器中減去這個(gè)數(shù)值。 指令舉例如下: LDR R1,R0,#0 x12 ;將R0+0 x12地址處的數(shù)據(jù)讀出,保存到R1中(R0的值不變) LDR R1,R0,# -0 x12 ;將R0-0 x12地址處的數(shù)據(jù)讀出,保存到R1中(R0的值不變), 寄存器 寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。 指令舉例如下: LDR R1,R0,R2 ;將R0+R2地址處的數(shù)據(jù)讀出,保存到R1中 LDR R1,R0,-R2 ;將R0-R2地址處的數(shù)據(jù)讀出,保存到R1中, 寄存器及移位常數(shù) 寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。 指令舉

21、例如下: LDR R1,R0,R2,LSL #2 ;將R0+R24地址處的數(shù)據(jù)讀出,保存到R1中(R0、R2的值不變) LDR R1,R0,-R2,LSL #2 ;將R0-R24地址處的數(shù)據(jù)讀出,保存到R1中(R0、R2的值不變) 注意:移位位數(shù)只能是5位的立即數(shù),不能使用寄存器指定移位位數(shù)。, PC(即R15)使用的幾個(gè)問(wèn)題 使用PC作為基址時(shí),使用的數(shù)值是指令的地址加8個(gè)字節(jié)(取指與執(zhí)行相差8個(gè)字節(jié))。 PC不能用做偏移寄存器,也不能用于任何變址尋址模式。 把一個(gè)字加載到PC,將使程序轉(zhuǎn)移到所加載的地址,這是一個(gè)公認(rèn)的實(shí)現(xiàn)跳轉(zhuǎn)的方法。但是應(yīng)當(dāng)避免將一個(gè)字節(jié)加載到PC。 把PC存到存儲(chǔ)器的操

22、作在不同體系結(jié)構(gòu)的處理器中產(chǎn)生不同的結(jié)果,應(yīng)盡可能避免。,2、半字和有符號(hào)字節(jié)的加載存儲(chǔ)指令 這類(lèi)LDR/STR指令可實(shí)現(xiàn)半字(有符號(hào)和無(wú)符號(hào))、有符號(hào)字節(jié)數(shù)據(jù)的傳送。 特點(diǎn): 偏移量格式、尋址方式與加載存儲(chǔ)字和無(wú)符號(hào)字節(jié)指令基本相同。 立即數(shù)偏移量限定在8位,寄存器偏移量不可經(jīng)過(guò)移位得到。,(1)指令格式如下 LDR condH Rd, ;加載無(wú)符號(hào)半字?jǐn)?shù)據(jù)到Rd的低16位,高16位清零。 LDR condSB Rd, ;加載指定地址上有符號(hào)字節(jié)到Rd中,高24位用符號(hào)位擴(kuò)展 LDR condSH Rd, ;加載指定地址上的有符號(hào)半字到Rd中,高16位用符號(hào)位擴(kuò)展。 STRcondH Rd,

23、 ;存儲(chǔ)Rd中的低16位半字?jǐn)?shù)據(jù)。 存儲(chǔ)有符號(hào)數(shù)據(jù)和無(wú)符號(hào)數(shù)據(jù)之間沒(méi)有差別。,(2)兩點(diǎn)說(shuō)明: 符 號(hào) 位有符號(hào)字節(jié)或有符號(hào)半字的加載,用“符號(hào)位”擴(kuò)展到32位;無(wú)符號(hào)半字傳送是用0擴(kuò)展到32位。 地址對(duì)齊對(duì)半字傳送的地址必須為偶數(shù)。非半字對(duì)齊的半字加載將使Rd內(nèi)容不可靠;非半字對(duì)齊的半字存儲(chǔ)將使指定地址的2字節(jié)存儲(chǔ)內(nèi)容不可靠。,(3)指令舉例 LDRSB R1,R0,R3 ;將R0+R3地址上的字節(jié)數(shù)據(jù)讀到R1,高24位用符號(hào)位擴(kuò)展。 LDRSH R1,R9 ;將R9地址上的半字?jǐn)?shù)據(jù)讀出到R1,高16位用符號(hào)位擴(kuò)展。 LDRH R6,R2,#2 ;將R2地址上的半字?jǐn)?shù)據(jù)讀出到R6,高16位用

24、零擴(kuò)展,然后修改R2=R2+2。 STRH R1,R0,#2! ;將R1的數(shù)據(jù)保存到R0+2地址中,只存儲(chǔ)低2字節(jié)數(shù)據(jù),并且修改R0=R0+2。,二、多寄存器的存取指令,LDM和STM指令可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間存/取數(shù)據(jù)。 LDM為加載多個(gè)寄存器;STM為存儲(chǔ)多個(gè)寄存器。 這兩條指令,允許傳送16個(gè)寄存器R0-R15的任何子集或所有寄存器。 1、指令格式 LDMcond Rn!, STMcond Rn!,,2、指令格式說(shuō)明 (1)Rn:表示基址寄存器,裝有傳送數(shù)據(jù)的初始地址,Rn不允許為R15(即PC)。 (2)Rn后綴“!”:表示最后的地址寫(xiě)回到Rn中。 (3)Regl

25、ist:表示寄存器列表,可包含多個(gè)序號(hào)連續(xù)的或者分離的寄存器,用“,”分開(kāi)。 格式例子:R1,R2,R6R9 列表寄存器和存儲(chǔ)器地址的關(guān)系規(guī)則: 編號(hào)低的寄存器對(duì)應(yīng)于存儲(chǔ)器中低地址單元,編號(hào)高的寄存器對(duì)應(yīng)于存儲(chǔ)器中高地址單元。,(4)后綴“”說(shuō)明 寄存器列表不包含PC:使用后綴“”進(jìn)行數(shù)據(jù)傳送且時(shí),加載存儲(chǔ)的是用戶(hù)模式的寄存器,而不是當(dāng)前模式的寄存器。 寄存器列表包含有PC:除了正常的多寄存器傳送外,還要將SPSR拷貝到CPSR中。 該用法可用于異常處理返回。 禁用情況:后綴“”不允許在用戶(hù)模式或系統(tǒng)模式下使用。 ,因?yàn)樗鼈儧](méi)有SPSR,(5)當(dāng)Rn在寄存器列表中且使用后綴“!” 對(duì)于STM指

26、令,若Rn為寄存器列表中的最低數(shù)字的寄存器,則會(huì)將Rn的初值保存; 其它情況下Rn的加載值和存儲(chǔ)值不可預(yù)知。 (6)地址字對(duì)齊 這些指令尋址是字對(duì)齊的,即忽略地址位1:0。,(7)關(guān)于模式項(xiàng) LDM/STM的主要用途是現(xiàn)場(chǎng)保護(hù)、數(shù)據(jù)復(fù)制和參數(shù)傳送等。其模式有如下8種(前面4種用于數(shù)據(jù)塊的傳輸(為存儲(chǔ)操作), 后面4種是堆棧操作): IA: 先傳、后地址加4; IB: 先地址加4 、后傳; DA:先傳、后地址減4; DB:先地址減4 、后傳; FD: 滿(mǎn)遞減堆棧,先地址減4、后傳,與DB對(duì)應(yīng); ED: 空遞減堆棧,先傳、后地址減4,與DA對(duì)應(yīng); FA: 滿(mǎn)遞增堆棧,先地址加4、后傳,與IB對(duì)應(yīng);

27、 EA: 空遞增堆棧,先傳、后地址加4,與IA對(duì)應(yīng)。,(7)關(guān)于模式項(xiàng) LDM/STM的主要用途是現(xiàn)場(chǎng)保護(hù)、數(shù)據(jù)復(fù)制和參數(shù)傳送等。其模式有如下8種(前面4種用于數(shù)據(jù)塊的傳輸(為加載寄存器),后面4種是堆棧操作): IA: 先傳、后地址加4; IB: 先地址加4 、后傳; DA:先傳、后地址減4; DB:先地址減4 、后傳; FD: 滿(mǎn)遞減堆棧,先減地址、后傳,與IA對(duì)應(yīng); ED: 空遞減堆棧,先傳、后減地址,與IB對(duì)應(yīng); FA: 滿(mǎn)遞增堆棧,先加地址、后傳,與DA對(duì)應(yīng); EA: 空遞增堆棧,先傳、后加地址,與DB對(duì)應(yīng)。,3、應(yīng)用舉例 LDMIA R0!,R3 - R9 ;加載R0指向地址上的多

28、字?jǐn)?shù)據(jù),保存到R3R9中,R0值更新。 STMIA R1!,R3 - R9 ;將R3R9的數(shù)據(jù)存儲(chǔ)到R1指向的地址上,R1值更新 。 STMFD SP!,R0 - R7,LR ;現(xiàn)場(chǎng)保存,將R0R7、LR入棧,SP值更新 。 LDMFD SP!,R0 - R7,PC ;恢復(fù)現(xiàn)場(chǎng),包括CPSR,異常處理返回,SP值更新。,三、單寄存器交換指令(SWP),SWP指令用于將一個(gè)存儲(chǔ)單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個(gè)寄存器Rd中,同時(shí)將另一個(gè)寄存器Rm的內(nèi)容寫(xiě)入到該存儲(chǔ)單元中。 1、指令格式 SWPcondB Rd,Rm,Rn B為可選后綴,若有B,則交換字節(jié),否則交換32位字 Rd為

29、被加載的寄存器 Rm的數(shù)據(jù)用于存儲(chǔ)到Rn所指的地址中 若Rm與Rd相同,則為寄存器與存儲(chǔ)器內(nèi)容進(jìn)行交換 Rn為要進(jìn)行數(shù)據(jù)交換的存儲(chǔ)器地址,Rn不能與Rd和Rm相同。,2、指令舉例 SWP R1,R1,R0 ;將R1的內(nèi)容與R0指向的存儲(chǔ)單元的內(nèi)容進(jìn)行交換。 SWPB R1,R2,R0 ;將R0指向的存儲(chǔ)單元的內(nèi)容讀取1字節(jié)數(shù)據(jù)到R1中(高24位清零),并將R2的內(nèi)容寫(xiě)入到該內(nèi)存單元中(最低字節(jié)有效),3.3.2 數(shù)據(jù)處理指令,主要內(nèi)容 1、數(shù)據(jù)處理指令概述 2、算術(shù)運(yùn)算指令 3、邏輯運(yùn)算指令 4、數(shù)據(jù)傳送指令 5、比較指令 6、測(cè)試指令,3.3.2.1 數(shù)據(jù)處理指令概述 1、ARM數(shù)據(jù)處理指令

30、的功能 主要完成寄存器中數(shù)據(jù)的算術(shù)和邏輯運(yùn)算操作。 2、ARM數(shù)據(jù)處理指令的特點(diǎn) 操作數(shù)來(lái)源:所有的操作數(shù)要么來(lái)自寄存器,要么來(lái)自立即數(shù),不會(huì)來(lái)自存儲(chǔ)器。 操作結(jié)果:如果有結(jié)果,則結(jié)果一定是為32位寬、或64位寬(長(zhǎng)乘法指令),并且放在一個(gè)或兩個(gè)寄存器中,不會(huì)寫(xiě)入存儲(chǔ)器。 有第二個(gè)操作數(shù)(除了乘法指令) Operand2 :切記其三種形式:立即數(shù)、寄存器、寄存器移位。 乘法指令的操作數(shù):全部是寄存器。,3、ARM數(shù)據(jù)處理指令分類(lèi) 22條可分為5類(lèi): 算術(shù)運(yùn)算指令: ADD ADC SUB SBC RSB RSC MUL MLA UMULL UMLAL SMULL SMLAL 邏輯運(yùn)算指令: A

31、NDORR EOR BIC 數(shù)據(jù)傳送指令: MOV MVN 比較指令: CMP CMN 測(cè)試指令: TST TEQ 上述指令只能對(duì)寄存器操作,不能針對(duì)存儲(chǔ)器。,4、數(shù)據(jù)處理指令對(duì)程序狀態(tài)寄存器CPSR的影響 (1)選擇“S”后綴問(wèn)題: 指令中可以選擇s后綴,以影響狀態(tài)標(biāo)志。但是比較指令(cmp、cmn、tst和teq)不需要后綴S,它們總會(huì)直接影響CPSR中的狀態(tài)標(biāo)志。 (2)對(duì)CPSR中標(biāo)志位的影響: 標(biāo)志位:如果結(jié)果為負(fù),則標(biāo)志位置;否則清。 標(biāo)志位:如果結(jié)果為,則標(biāo)志位置;否則清。 標(biāo)志位:如果是加、減運(yùn)算指令或比較指令時(shí),標(biāo)志位設(shè)置為的進(jìn)位輸出;否則設(shè)置為移位器的移位輸出。如果不需要移

32、位,則保持不變。 標(biāo)志位:在非加減操作中,標(biāo)志位保持原值。在加減操作中,如果有溢出,則置;不發(fā)生溢出,則清。,(3)關(guān)于恢復(fù)CPSR原值問(wèn)題: 如果指令帶有S后綴(除了比較指令以外),同時(shí)又以PC為目標(biāo)寄存器進(jìn)行操作, 在異常模式下:則操作的同時(shí)從SPSR恢復(fù)CPSR。比如: movs pc, #0 xff/* cpsr = spsr; pc = 0 xff */ adds pc, r1, #0 xffffff00 /* cpsr = spsr; pc = r1 + 0 xffffff00 */ ands pc, r1, r2/* cpsr = spsr; pc = r1 */ 在user或者

33、system模式:會(huì)產(chǎn)生不可預(yù)料的結(jié)果,因?yàn)樵谶@兩種模式下沒(méi)有SPSR。,數(shù)據(jù)處理指令的二進(jìn)制編碼,add r0, r1, #0 xff,add r0, r1, r1, LSL r2,add r0, r1, r1, LSL #31,5、數(shù)據(jù)處理指令的詳細(xì)列表(未含6條乘法指令),3.3.2.2 算術(shù)運(yùn)算指令 一、加減運(yùn)算指令 1、 ADD加法運(yùn)算指令 指令格式 ADDcondS Rd,Rn,operand2 ADD指令將operand2的數(shù)據(jù)與Rn的值相加,結(jié)果保存到Rd寄存器。 指令舉例 ADDS R1,R1,#1 ;R1R1+1 ADDS R3,R1,R2,LSL #2; R3R1+R22

34、,2、ADC帶進(jìn)位加法指令 指令格式 ADCcondS Rd,Rn,operand2 ADC指令將operand2的數(shù)據(jù)與Rn的值相加,再加上CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd寄存器。 指令舉例 ADDS R4,R0,R2 ;使用ADC實(shí)現(xiàn)64位加法 ADC R5,R1,R3 ;(R5、R4)(R1、R0)+(R3、R2),3、SUB減法運(yùn)算指令 指令格式 SUBcondS Rd,Rn,operand2 SUB指令用寄存器Rn減去operand2,結(jié)果保存到Rd中。 指令舉例 SUBS R0,R0,#l ;R0R0-1 SUB R6,R7,#0 x10 ;R6R7-0 x10,4、SBC

35、帶進(jìn)位減法指令 指令格式 SBCcondS Rd,Rn,operand2 SBC指令用寄存器Rn減去operand2,再減去CPSR中的C條件標(biāo)志位的反碼,結(jié)果保存到Rd中。 指令舉例 SUBS R4,R0,R2 ;使用SBC實(shí)現(xiàn)64位減法, SBC R5,R1,R3 ;(R5,R4)(R1,R0)-(R3,R2),5、 RSB反向減法指令 指令格式如下: RSBcondS Rd,Rn,operand2 RSB指令用寄存器operand2減去Rn,結(jié)果保存到Rd中。 指令舉例如下: RSB R3,R1,#0 xFF00 ;R30 xFF00-R1 RSBS R1,R2,R2,LSL #2 ;R

36、1R22-R2 ;(R1 =R23),6、RSC帶進(jìn)位反向減法指令 指令格式如下: RSCcondS Rd,Rn,operand2 RSC 指令用寄存器operand2減去Rn,再減去CPSR中的C條件標(biāo)志位的反碼,結(jié)果保存到Rd中。 指令舉例如下: RSBS R2,R0,#0;求一個(gè)32位數(shù)的負(fù)數(shù) RSC R3,R1,#0 ;使用RSC指令實(shí)現(xiàn) ;求64位數(shù)值的負(fù)數(shù),二、乘法指令 ARM有兩類(lèi)乘法指令: 32位的乘法指令,即乘法操作的結(jié)果為32位; 64位的乘法指令,即乘法操作的結(jié)果為64位。,二、乘法指令 ARM有兩類(lèi)乘法指令: 32位的乘法指令,即乘法操作的結(jié)果為32位; 64位的乘法指

37、令,即乘法操作的結(jié)果為64位。,1、 MUL32位乘法指令 指令格式如下: MULcondS Rd,Rm,Rs ;RdRm*Rs MUL指令將Rm和Rs中的值相乘,結(jié)果的低32位保存到Rd中。 指令舉例如下: MUL R1,R2,R3 ;R1=R2R3 MULS R0,R3,R7 ;R0=R3R7, ;設(shè)置CPSR的N位和Z位,2、 MLA32位乘加指令 指令格式如下: MLAcondS Rd,Rm,Rs,Rn ; RdRm*Rs+Rn MLA指令將Rm和Rs中的值相乘,再將乘積加上第3個(gè)操作數(shù),結(jié)果的低32位保存到Rd中。 指令舉例如下: MLA R1,R2,R3,R0 ;R1=R2R3+R

38、0,3、 UMULL64位無(wú)符號(hào)乘法指令 指令格式如下: UMULLcondS RdLo,RdHi,Rm,Rs ; RdHi, RdLo Rm*Rs UMULL指令將Rm和Rs中的值作無(wú)符號(hào)數(shù)相乘,結(jié)果的低32位保存到RdLo中,高32位保存到RdHi中。 指令舉例如下: UMULL R0,R1,R5,R8 ;(R1,R0)R5R8,4、 UMLAL64位無(wú)符號(hào)乘加指令 指令格式如下: UMLALcondS RdLo,RdHi,Rm,Rs ;RdHi, RdLo Rm*Rs+ RdHi, RdLo UMLAL指令將Rm和Rs中的值作無(wú)符號(hào)數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32

39、位保存到RdLo中,而高32位保存到RdHi中。 指令舉例如下: UMLAL R0,R1,R5,R8 ;(R1,R0)R5R8+(R1,R0),第6次到此,5、SMULL64位有符號(hào)乘法指令 指令格式如下: SMULLcondS RdLo,RdHi,Rm,Rs ; RdHi, RdLo Rm*Rs SMULL指令將Rm和Rs中的值作有符號(hào)數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。 指令舉例如下: SMULL R2,R3,R7,R6 ;(R3,R2)R7R6,6、 SMLAL64位有符號(hào)乘加指令 指令格式如下: SMLALcondS RdLo,RdHi,Rm,Rs ;

40、RdHi, RdLo Rm*Rs+ RdHi, RdLo SMLAL指令將Rm和Rs中的值作有符號(hào)數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,高32位保存到RdHi中。 指令舉例如下: SMLAL R2,R3,R7,R6 ; ;(R3,R2)R7R6+(R3,R2),7、乘法指令的特點(diǎn) 不支持第2操作數(shù)為立即數(shù)。 結(jié)果寄存器不能與第一源寄存器相同。 Rd、RdHi、RdLo不能與Rm為同一寄存器。 RdHi和RdLo不能為同一寄存器。 避免將R15定義為任一操作數(shù)或結(jié)果寄存器。 早期的ARM處理器僅支持32位乘法指令。ARM7版本和后續(xù)的在名字中有M的處理器才支

41、持64位乘法指令。,對(duì)標(biāo)志位的影響 對(duì)N標(biāo)志位:對(duì)有符號(hào)數(shù)乘法,若結(jié)果是32位指令形式,Rd的第31位是標(biāo)志位N;對(duì)于產(chǎn)生長(zhǎng)結(jié)果的指令形式,RdHi的第31位是標(biāo)志位。 對(duì)Z標(biāo)志位:如果Rd或RdHi、RdLo為0,則標(biāo)志位Z置位。 對(duì)V標(biāo)志位:乘法指令不影響V標(biāo)志位。 對(duì)C標(biāo)志位: ARM v5及以上的版本不影響C標(biāo)志位; ARM v5以前的版本,C標(biāo)志位數(shù)值不確定。,3.3.2.3 邏輯運(yùn)算指令 1、AND邏輯“與”操作指令 指令格式如下: ANDcondS Rd,Rn,operand2 AND指令將operand2的值與寄存器Rn的值按位邏輯“與”操作,結(jié)果保存到Rd中。 指令舉例如下:

42、 ANDS R0,R0,#0 x01 ;R0R0R0CPSR ORR R0,R0,#0 x20000000 ;置1進(jìn)位位C MSRCPSR_f, R0 ;CPSR_fR031:24 例2:從管理模式切換到IRQ模式 MRSR0, CPSR ;R0CPSR BICR0,R0,#0 x1f ;低5位清零 ORRR0,R0,#0 x12 ;設(shè)置為IRQ模式 MSRCPSR_c, R0 ;傳送回CPSR,注 意: 控制域的修改問(wèn)題:只有在特權(quán)模式下才能修改狀態(tài)寄存器的控制域7:0,以實(shí)現(xiàn)處理器模式轉(zhuǎn)換,或設(shè)置開(kāi)/關(guān)異常中斷 。 T控制位的修改問(wèn)題:程序中不能通過(guò)MSR指令,直接修改CPSR中的T控制位

43、來(lái)實(shí)現(xiàn)ARM狀態(tài)Thumb狀態(tài)的切換,必須使用BX指令完成處理器狀態(tài)的切換。 用戶(hù)模式下能夠修改的位:在用戶(hù)模式只能修改“標(biāo)志位域”,不能對(duì)CPSR23:0做修改。 S后綴的使用問(wèn)題:在MRS/MSR指令中不可以使用S后綴。,例:堆棧初始化 INITSTACK;堆棧初始化子程序 MOVR0,LR;保存返回地址 MRSR1,CPSR;保存CPSR原值 MSRCPSR_c,#0 xD3;切換到管理模式 ;設(shè)置堆棧大小等 LDRSP,StackSvc;設(shè)置堆棧指針 MSRCPSR_c,#0 xD2;切換到中斷模式 ;設(shè)置堆棧大小等 LDRSP,StackIrq;設(shè)置堆棧指針 ;對(duì)其它模式設(shè)置 MSR

44、CPSR_c,R1;恢復(fù)CPU原模式MOVPC,R0;子程序返回,第7次到此,二、異常中斷產(chǎn)生指令 異常中斷指令可以分為以下幾種: SWI: 軟件中斷指令 BKPT:斷點(diǎn)指令(v5T及以上體系) CLZ: 前導(dǎo)0計(jì)數(shù)(v5T及以上體系),1、SWI軟件中斷指令 軟件中斷指令SWI產(chǎn)生軟件異常中斷,用來(lái)實(shí)現(xiàn)用戶(hù)模式到特權(quán)模式的切換。用于在用戶(hù)模式下對(duì)操作系統(tǒng)中特權(quán)模式的程序的調(diào)用;它將處理器置于管理(_svc)模式,中斷矢量地址為0 x08。 指令格式如下: SWI 說(shuō)明: 主要用于用戶(hù)程序調(diào)用操作系統(tǒng)的API。 參數(shù)傳遞通常有兩種方法: 指令中的24bit立即數(shù)指定API號(hào),其它參數(shù)通過(guò)寄存器

45、傳遞。 忽略指令中的24bit立即數(shù),r0指定API號(hào),其它參數(shù)通過(guò)其它寄存器傳遞。,SWI指令舉例: 軟中斷號(hào)在指令中,不傳遞其它參數(shù) SWI10;中斷號(hào)為10 SWI0 x123456;中斷號(hào)為0 x123456 軟中斷號(hào)在指令中,其它參數(shù)在寄存器中傳遞 MOVR0,#34;準(zhǔn)備參數(shù) SWI12;調(diào)用12號(hào)軟中斷 不用指令中的立即數(shù),軟中斷號(hào)和其它參數(shù)都在寄存器中傳遞 MOVR0,#12;準(zhǔn)備中斷號(hào) MOVR1,#34;準(zhǔn)備參數(shù) SWI0;進(jìn)入軟中斷,SWI程序舉例: T_bitEQU0 x20;用于測(cè)試Thumb標(biāo)志位(第5位) SWI_handler STMFDSP!,R0-R3,R1

46、2,LR MRSR0,SPSR;保存中斷前的CPSR值 STMFDSP!,R0;到堆棧中 TSTR0,#T_bit;測(cè)試T位標(biāo)志 LDRNEHR0,LR,# -2;讀取16位的SWI指令碼 BICNER0,R0,#0 xFF00;獲取SWI中的中斷號(hào) LDREQR0,LR,# -4;讀取32的SWI指令碼 BICEQ R0,R0,#0 xFF000000;獲取SWI中的中斷號(hào) ;轉(zhuǎn)去處理相應(yīng)的軟中斷 LDMFDSP!,R0-R3,R12,PC ;中斷返回,包括恢復(fù)原CPSR值,2、BKPT斷點(diǎn)指令 斷點(diǎn)中斷指令BKPT用于產(chǎn)生軟件斷點(diǎn),供調(diào)試程序用。v5T及以上體系使用。 指令格式如下: BK

47、PT immed_16 immed_16:16位的立即數(shù)。該立即數(shù)被調(diào)試軟件用來(lái)保存額外的斷點(diǎn)信息。 斷點(diǎn)指令用于軟件調(diào)試;它使處理器停止執(zhí)行正常指令而進(jìn)入相應(yīng)的調(diào)試程序。,3、 CLZ前導(dǎo)0計(jì)數(shù)指令 前導(dǎo)0計(jì)數(shù)指令CLZ 對(duì)Rm中的前導(dǎo)0的個(gè)數(shù)進(jìn)行計(jì)數(shù),結(jié)果放到Rd中。 v5T及以上體系使用。 指令格式: CLZ Rd, Rm 舉例如下: MOV R2, #0X17C00 ;R2=0b0000 0000 0000 0001 0111 1100 0000 0000 CLZ R3, R2 ;R3=15,3.3.6 例 題 一、算數(shù)邏輯運(yùn)算指令的應(yīng)用 例1: 實(shí)現(xiàn)乘法的指令段 MOV R0,R0,

48、LSL #n ;R0=R0n;R0= R0*2n ADD R0,R0,R0,LSL #n ;R0=R0+R0*2n= R0*(2n+1) RSB R0,R0,R0,LSL #n ;R0=R0*2n-R0= R0*(2n-1),例2:64位數(shù)據(jù)運(yùn)算 假設(shè)R0和R1存放一個(gè)64位數(shù)據(jù),R0中存放數(shù)據(jù)的低32位;R2和R3中存放另一個(gè)64位數(shù)據(jù),R2中存放數(shù)據(jù)的低32位。對(duì)這兩個(gè)64位數(shù)進(jìn)行加、減和比較運(yùn)算。(R1,R0)、(R3,R2) 兩個(gè)64位數(shù)據(jù)的加法運(yùn)算,結(jié)果保存到R0和R1中。 ADDS R0,R0,R2 ;低32位相加,設(shè)置CPSR的C標(biāo)志位。 ADC R1,R1,R3 ;高32位的帶

49、位相加,兩個(gè)64位數(shù)據(jù)的減法運(yùn)算,結(jié)果保存到R0和R1中。 SUBS R0,R0,R2 ;低32位相減,設(shè)置CPSR的C標(biāo)志位。 SBC R1,R1,R3 ;高32位的帶位相減 兩個(gè)64位數(shù)據(jù)的比較操作,并設(shè)置CPSR中的條件標(biāo)志位。 CMP R1,R3 ;比較高32位 CMPEQ R0,R2 ;如果高32位相等,比較低32位,例3:轉(zhuǎn)換內(nèi)存中數(shù)據(jù)存儲(chǔ)方式 將寄存器R0中的數(shù)據(jù)存儲(chǔ)方式轉(zhuǎn)換成另一種存儲(chǔ)方式。指令執(zhí)行前R0中數(shù)據(jù)存儲(chǔ)方式為:R0=A,B,C,D;指令執(zhí)行后R0中數(shù)據(jù)存儲(chǔ)方式為:R0=D,C,B,A。 EOR R1,R0,R0, ROR #16 ;R1=AC,BD,CA,DB BI

50、C R1,R1,#OxFF0000 ;R1=AC,0,CA,DB MOV R0,R0,ROR #8 ;R0=D,A,B,C EOR RO,RO,R1,LSR #8 ;R0=D,C,B,A ;R0=D,A,B,C異或R1=0,AC,0,CA,二、跳轉(zhuǎn)指令的應(yīng)用 例1:子程序的調(diào)用 BL指令在執(zhí)行跳轉(zhuǎn)操作的同時(shí)保存下一條指令的地址,用于從被調(diào)用的子程序中返回。 BL function ;調(diào)用子程序function ;子程序結(jié)束后,程序?qū)⒎祷氐竭@里執(zhí)行 function ;子程序的程序體 MOV PC,LR ;子程序中的返回語(yǔ)句,例2:條件執(zhí)行 實(shí)現(xiàn)類(lèi)似于C語(yǔ)言中的if-else功能的代碼段。下例的

51、功能為求最大公約數(shù)。 C語(yǔ)言代碼為: int gcd (int a,int b) while (a!=b) if (ab) a=a-b; else b=b-a; return a; ,對(duì)應(yīng)的ARM匯編代碼段。(代碼執(zhí)行前R0中存放a,R1中存放b;代碼執(zhí)行后R0中存放最大公約數(shù)。 gcd CMP R0,R1 ;比較a和b的大小 SUBGT R0,R0,R1 ;if(ab) a=a-b SUBLT R1,R1,R0 ;if(ba) b=b-a BNE gcd ;if(a!=b)跳轉(zhuǎn)到gcd繼續(xù)執(zhí)行 MOV PC,LR ;子程序結(jié)束,返回,循環(huán)結(jié)構(gòu),MOVR1,#10 LOOP;循環(huán)體 SUBR1

52、,R1,#1 BNELOOP ,例3:循環(huán)語(yǔ)句 將內(nèi)存中從0 x400800開(kāi)始的100個(gè)字?jǐn)?shù)據(jù)相加,其結(jié)果存于R3、R2中(R3中為高32位)。 LDR R0,=0 x400800 MOV R1,#100 ;初始化循環(huán)次數(shù) MOV R2,#0 MOV R3,#0 loop ;循環(huán)體 LDR R4,R0,#4 ADDS R2,R2,R4 ADC R3,R3,#0或者ADDCS R3,R3,#1 SUBS R1,R1,#1 ;循環(huán)計(jì)數(shù)器減1,設(shè)置條件標(biāo)志 BNE loop ;循環(huán)計(jì)數(shù)器不為0,跳到loop繼續(xù)執(zhí)行 ;循環(huán)計(jì)數(shù)器為0,程序繼續(xù)執(zhí)行,例4:鏈表操作中的條件碼應(yīng)用 在鏈表中搜索與某一數(shù)

53、據(jù)相等的元素。 鏈表的每個(gè)元素包括兩個(gè)字,第1個(gè)字中包含一個(gè)字節(jié)數(shù)據(jù);第2個(gè)字中包含指向下一個(gè)鏈表元素的指針,當(dāng)這個(gè)指針為0時(shí)表示鏈表結(jié)束。 代碼執(zhí)行前R0指向鏈表的頭元素,R1中存放將要搜索的數(shù)據(jù);代碼執(zhí)行后R0指向第1個(gè)匹配的元素,或者當(dāng)沒(méi)有匹配元素時(shí),R0為0。,SEARCH CMP R0,#0 ;R0指針是否為空 LDRNEB R2,R0 ;讀取當(dāng)前元素中的字節(jié)數(shù)據(jù) CMPNE R1,R2 ;判斷數(shù)據(jù)是否為搜索的數(shù)據(jù) LDRNE R0,R0,#4 ;如果不是,指針R0指向下一個(gè)元素 BNE SEARCH ;跳轉(zhuǎn)到search執(zhí)行 MOV PC,LR ;搜索完成,程序返回,SEARCH

54、CMP R0,#0 ;R0指針是否為空 LDRNEB R2,R0 ;讀取當(dāng)前元素中的字節(jié)數(shù)據(jù) CMPNE R1,R2 ;判斷數(shù)據(jù)是否為搜索的數(shù)據(jù) LDRNE R0,R0,#4 ;如果不是,指針R0指向下一;個(gè)元素 BNE SEARCH ;跳轉(zhuǎn)到search執(zhí)行 MOV PC,LR ;搜索完成,程序返回,3.4 Thumb指令集 (在本章最后),主要內(nèi)容 3.5.1 概念 3.5.2 ARM匯編偽指令 3.5.3 ARM匯編偽操作 一、符號(hào)定義偽操作 二、 數(shù)據(jù)定義偽操作 三、匯編控制偽操作 四、其他偽操作 3.5.4 ARM匯編宏指令 ADS編譯環(huán)境下的偽操作,3.5 ARM匯編偽指令和偽操作

55、,3.5.1 偽指令、偽操作和宏指令概念,偽指令是匯編語(yǔ)言程序里的特殊指令助記符,在匯編時(shí)被合適的機(jī)器指令替代。 偽操作為匯編程序所用,在源程序進(jìn)行匯編時(shí)由匯編程序處理,只在匯編過(guò)程起作用,不參與程序運(yùn)行。 宏指令通過(guò)偽操作定義的一段獨(dú)立的代碼。在調(diào)用它時(shí)將宏體插入到源程序中。也就是常說(shuō)的宏。 說(shuō)明:所有的偽指令、偽操作和宏指令,均與具體的開(kāi)發(fā)工具中的編譯器有關(guān),當(dāng)前主要采用ARM公司的“ADS/SDT IDE”開(kāi)發(fā)工具,所以后面的討論,均是基于ARM公司的開(kāi)發(fā)工具。,3.5.2 ARM匯編偽指令,ARM偽指令不屬于ARM指令集中的指令,是為了編程方便而定義的。偽指令可以像其它ARM指令一樣使

56、用,但在編譯時(shí)這些指令將被等效的ARM指令代替。ARM偽指令有四條,分別是: ADR:小范圍的地址讀取偽指令。 ADRL:中等范圍的地址讀取偽指令。 LDR:大范圍的地址讀取偽指令。 NOP:空操作偽指令。,一、ADR小范圍的地址讀取 ADR偽指令功能:將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中。 ADR偽指令功能的實(shí)現(xiàn)方法:在匯編編譯器編譯源程序時(shí),ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來(lái)實(shí)現(xiàn)此ADR偽指令的功能,若不能用一條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。 語(yǔ)法格式: ADRcond register,expr 其中:

57、register:加載的目標(biāo)寄存器。 expr:地址表達(dá)式。取值范圍是參考P212,例1: (0 x20) ADR R1,Delay Delay (0 x64) MOV R0,R14 使用ADR將程序標(biāo)號(hào)Delay所表示的地址存入R1。,編譯后的反匯編代碼: ADD R1,PC,#0 x3C MOV R0,R14,PC+0 x3C =0 x20+0 x08+0 x3C =0 x64,例2:查表 ADR R0,D_TAB ;加載轉(zhuǎn)換表地址 LDRB R1,R0,R2 ;使用R2作為參數(shù),進(jìn)行查表 D_TAB DCB 0 xC0, 0 xF9, 0 xA4, 0 xB0, 0 x99, 0 x92

58、,二、ADRL中等范圍的地址讀取 ADRL偽指令功能:將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址。 ADRL偽指令功能實(shí)現(xiàn)方法:在匯編編譯器編譯源程序時(shí),ADRL被編譯器替換成兩條合適的指令。若不能用兩條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。 語(yǔ)法格式: ADRLcond register,expr 其中: register:加載的目標(biāo)寄存器。 expr:地址表達(dá)式。取值范圍參考P212,例3: (0 x20) ADRL R1,Delay Delay (0 x64) MOV R0,R14 使用ADRL將程序標(biāo)號(hào)Delay所表示的地址存入R1。,編譯后的反匯編代碼: ADD

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論