第8章 Cortex-M3指令系統(tǒng)與編程技術(shù)_第1頁
第8章 Cortex-M3指令系統(tǒng)與編程技術(shù)_第2頁
第8章 Cortex-M3指令系統(tǒng)與編程技術(shù)_第3頁
第8章 Cortex-M3指令系統(tǒng)與編程技術(shù)_第4頁
第8章 Cortex-M3指令系統(tǒng)與編程技術(shù)_第5頁
已閱讀5頁,還剩195頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章Cortex-M3指令系統(tǒng)與編程技術(shù)南京郵電大學自動化學院2課程內(nèi)容

8.1Cortex-M3編程模型

8.2Cortex-M3指令集分類

8.3ARM匯編程序設(shè)計

8.4嵌入式C語言混合編程38.1Cortex-M3編程模型8.1.1處理器工作模式及狀態(tài)8.1.2特權(quán)訪問和用戶訪問8.1.3雙堆棧機制8.1.4數(shù)據(jù)類型8.1.5異常及中斷4ARM體系架構(gòu)概述ARM處理器有兩種工作狀態(tài):ARM工作狀態(tài)(32位指令)Thumb工作狀態(tài)(16位指令)Thumb指令集是添加到ARM的標準RISC指令集之上的獨立指令集;Thumb指令集包括了基本的加法、減法、循環(huán)移位以及跳轉(zhuǎn)等大約36條16位指令;Thumb指令集作為ARM指令集的壓縮方案,簡潔、有效,應(yīng)用廣泛并得到很好的支持,通過Thumb指令替換ARM指令,可以將某些代碼的規(guī)模減小大約20%到30%。5ARM體系架構(gòu)概述⑤有限的Thumb指令僅對基本算術(shù)和邏輯操作有用:Thumb狀態(tài)下,處理器將僅可使用有限數(shù)量的寄存器,R8-R12的使用受到限制。無法完成諸如處理中斷、長跳轉(zhuǎn)、原子存儲器(atomicmemory)操作,或協(xié)處理器操作等等復雜任務(wù)。也無法像ARM模式那樣進行條件執(zhí)行和移位或循環(huán)移位等操作。⑥Thumb代碼和標準ARM代碼不能混雜使用,必須顯式地在兩種工作狀態(tài)間進行切換,這迫使程序員必須將所有的16位代碼與32位代碼分開并隔離到獨立的模塊中。6ARM體系架構(gòu)概述兩種工作狀態(tài)之間來回切換需要消耗時間,導致代碼運行速度降低大約15%,不僅要增加代碼,而且還需要幾十個前導(preamble)以及后同步指令(postamble)來組織指針并清空CPU的流水線。雖然Thumb指令能夠?qū)崿F(xiàn)較高密度的代碼,緩存使用效率更高,但實現(xiàn)ARM指令代碼的功能往往需要較多的Thumb指令代碼,相比較而言,ARM指令使用起來更靈活。7Cortex-M3指令體系采用Thumb-2指令體系Thumb-2并不是Thumb的升級。它是另起爐灶,繼承并集成了傳統(tǒng)的Thumb指令集和ARM指令集的各自優(yōu)點,可完全代替Thumb和原先的ARM指令集。是Thumb指令集和ARM指令集的一個超集。Thumb-2指令集體系架構(gòu),無需處理器進行工作狀態(tài)的切換,就可運行16位與32位混合代碼。與ARM體系架構(gòu)相比,速度提高大約15%到20%。8Cortex-M3指令體系Cortex-M3處理器使用的指令集是Thumb-2指令集的子集,它的(指令)工作狀態(tài)只有一個,那就是Thumb-2狀態(tài)。Cortex-M3處理器的兩種工作狀態(tài):Thumb狀態(tài)調(diào)試狀態(tài)按照指令的長度分類,Thumb-2指令集可分為兩種:(1)16-bit指令集(2)32-bit指令集9Cortex-M3指令體系A(chǔ)RM指令集體系架構(gòu)下,ARM指令與Thumb指令分屬不同的程序模塊,由不同的匯編器對其分別進行匯編。Thumb-2指令集體系架構(gòu)下,16bit指令與32bit指令可以在同一程序模塊出現(xiàn),并由同一匯編器對其進行匯編。108.1.1處理器工作模式及狀態(tài)Cortex-M3有Thread和Handler兩種工作模式:重啟時,處理器進入Thread模式,從異常返回時也可進入Thread模式,Thread模式代碼可為特權(quán)方式和用戶方式;異常時,處理器進入Handler模式,Handler模式下所有代碼必須都是特權(quán)代碼。Cortex-M3可工作在Thumb和Debug兩種操作狀態(tài):Thumb狀態(tài)是正常執(zhí)行16位和32位半字對齊的Thumb指令和Thumb-2指令時所處的狀態(tài);Debug(調(diào)試)狀態(tài)是調(diào)試時的狀態(tài)。118.1.2特權(quán)訪問和用戶訪問

代碼可以以特權(quán)方式和非特權(quán)方式執(zhí)行。當系統(tǒng)發(fā)生異常,處理器進入Handler模式時,代碼往往是特權(quán)方式的;當處理器在Thread模式下時,則代碼可以是特權(quán)方式的,也可以是非特權(quán)方式的。當處理器復位進入Thread模式后,代碼均為特權(quán)方式的。處理器在Thread模式下時,可從特權(quán)方式切換到用戶方式,但不能從用戶方式返回到特權(quán)方式。Thread模式下只有進行異常處理時,處理器進入Handler模式,才能由用戶方式切換到特權(quán)方式。128.1.3雙堆棧機制Cortex-M3處理器可使用兩個堆棧:主(main)棧和進程(process)棧。復位后,所有代碼都使用主棧。棧指針寄存器R13(SP)為分組(Banked)寄存器,可用于SP_main(MSP)與SP_process(PSP)之間的切換,任何時候僅有一個??梢姟S行┊惓L幚砣鏢VC(系統(tǒng)服務(wù)函數(shù)調(diào)用)可通過在其返回時修改EXC-RETURN值來將Thread模式下所使用的棧從主棧切換到進程棧。而其他異常則繼續(xù)使用主棧。138.1.4數(shù)據(jù)類型Cortex-M3既可使用大端格式也可使用小端格式訪問存儲器。Cortex-M3處理器有一個可配置引腳BIGEND,用來選擇小端格式或大端格式。通常是以小端格式訪問代碼,小端格式是ARM處理器的默認存儲器格式。ARM處理器支持下列數(shù)據(jù)類型:字節(jié)8位半字16位(必須分配為占用兩個字節(jié))字32位(必須分配為占用4個字節(jié))148.1.4數(shù)據(jù)類型小端數(shù)據(jù)模式:3124231615870

字節(jié)3在地址F字節(jié)2在地址E字節(jié)1在地址D字節(jié)0在地址C地址C字半字1在地址E半字0在地址C字節(jié)3在地址B字節(jié)2在地址A字節(jié)1在地址9字節(jié)0在地址8地址8字半字1在地址A半字0在地址8字節(jié)3在地址7字節(jié)2在地址6字節(jié)1在地址5字節(jié)0在地址4地址4字半字1在地址6半字0在地址4字節(jié)3在地址3字節(jié)2在地址2字節(jié)1在地址1字節(jié)0在地址0地址0字半字1在地址2半字0在地址0

字數(shù)據(jù)的高字節(jié)存儲在高地址中158.1.4數(shù)據(jù)類型大端數(shù)據(jù)模式:3124231615870

字節(jié)0在地址F字節(jié)1在地址E字節(jié)2在地址D字節(jié)3在地址C地址C字半字1在地址E半字0在地址C字節(jié)0在地址B字節(jié)1在地址A字節(jié)2在地址9字節(jié)3在地址8地址8字半字1在地址A半字0在地址8字節(jié)0在地址7字節(jié)1在地址6字節(jié)2在地址5字節(jié)3在地址4地址4字半字1在地址6半字0在地址4字節(jié)0在地址3字節(jié)1在地址2字節(jié)2在地址1字節(jié)3在地址0地址0字半字1在地址2半字0在地址0

字數(shù)據(jù)的高字節(jié)存儲在低地址中168.1.5異常及中斷常見中斷指令與其格式和功能中斷指令格式功能SWI軟件中斷指令SWI{條件}24位的立即數(shù)用于產(chǎn)生軟件中斷,以使用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)例程BKPT斷點中斷指令BKPT16位的立即數(shù)用于產(chǎn)生軟件斷點中斷,供軟件調(diào)試時使用178.2Cortex-M3指令集分類8.2.1數(shù)據(jù)傳送指令8.2.2數(shù)據(jù)處理指令8.2.3無條件轉(zhuǎn)移指令與子程序調(diào)用8.2.4標志位與條件轉(zhuǎn)移指令8.2.5隔離指令8.2.6飽和運算指令8.2.7其他指令188.2.1數(shù)據(jù)傳送指令Cortex-M3中的數(shù)據(jù)傳送類型包括:(1)寄存器間數(shù)據(jù)傳送。(2)寄存器與存儲器間數(shù)據(jù)傳送。(3)堆棧操作指令實現(xiàn)數(shù)據(jù)傳送。(4)寄存器與特殊功能寄存器間數(shù)據(jù)傳送。(5)立即數(shù)加載到寄存器。198.2.1數(shù)據(jù)傳送指令8.2.1.1寄存器間數(shù)據(jù)傳送(1)MOV指令匯編格式:MOV{<cond>}{S}Rd,operand2功能:MOV指令用于將源操作數(shù)operand2傳送到目的寄存器Rd中。通常operand2是一個立即數(shù)、寄存器Rm或被移位的寄存器。S選項決定指令的操作是否影響CPSR(CurrentProgramStatusRegister,當前程序狀態(tài)寄存器)中條件標志位的值,有S時指令執(zhí)行后的結(jié)果影響CPSR中條件標志位N和Z的值,計算第2個操作數(shù)時更新標志位C,不影響標志位V。208.2.1數(shù)據(jù)傳送指令8.2.1.1寄存器間數(shù)據(jù)傳送MOV指令示例如下:MOVRl,R0;將寄存器R0的值傳送到寄存器R1MOVPC,R14;將寄存器R14值傳送到PC,常用于子程序返回MOVRl,R0,LSL#3;將寄存器R0的值左移3位后傳送到R1MOVR0,#5

;將立即數(shù)5傳送到寄存器R0

218.2.1數(shù)據(jù)傳送指令(2)MVN指令匯編格式:MVN{<cond>}{S}Rd,operand2功能:MVN指令用于將另一個寄存器、被移位的寄存器中的數(shù)據(jù)或?qū)⒁粋€立即數(shù)取反并傳送到目的寄存器Rd。與MOV指令不同之處是:數(shù)據(jù)在傳送之前被按位取反了,即MVN指令把一個被取反的值傳送到目的寄存器中。MVN指令示例如下:MVNR0,#0;將立即數(shù)0取反并傳送到寄存器R0中,完成指令后R0=-1MVNR1,R2;將R2取反,結(jié)果存放到R1中228.2.1數(shù)據(jù)傳送指令8.2.1.2寄存器與存儲器間數(shù)據(jù)傳送用于訪問存儲器的基本指令功能是“加載”(Load)和“存儲”(Store)。加載指令LDR用于把存儲器中的內(nèi)容加載到寄存器中;存儲指令STR用于把寄存器的內(nèi)容存儲至存儲器中。238.2.1數(shù)據(jù)傳送指令格式功能描述LDRBRd,[Rn,#offset]從地址Rn+offset處讀取1字節(jié)到RdLDRHRd,[Rn,#offset]從地址Rn+offset處讀取1半字到RdLDRRd,[Rn,#offset]從地址Rn+offset處讀取1字到RdLDRDRd1,Rd2,[Rn,#offset]從地址Rn+offset處讀取1雙字(64位整數(shù))到Rd1(低32位)和Rd2(高32位)中STRBRd,[Rn,#offset]把Rd中低字節(jié)存儲到地址Rn+offset處STRHRd,[Rn,#offset]把Rd中低半字存儲到地址Rn+offset處STRRd,[Rn,#offset]把Rd中低字存儲到地址Rn+offset處STRDRd1,Rd2,[Rn,#offset]把Rd1(低32位)和Rd2(高32位)組成的雙字存儲到地址Rn+offset處248.2.1數(shù)據(jù)傳送指令

使用LDMxy和STMxy可以一次傳輸更多數(shù)據(jù)。x可以為I或D:I表示自增D表示自減y可以為A或B:A表示自增/減的時機在每次訪問后B表示自增/減的時機在每次訪問前258.2.1數(shù)據(jù)傳送指令格式功能描述LDMIARd!,{寄存器列表}從Rd處讀取多個字,并依次送到寄存器列表的寄存器中。每讀取一個字后Rd自增一次,16位寬度STMIARd!,{寄存器列表}依次存儲寄存器列表中各寄存器的值到Rd給出的地址。每存儲一個字后Rd自增一次,16位寬度LDMIA.WRd!,{寄存器列表}從Rd處讀取多個字,并依次送到寄存器列表的寄存器中。每讀取一個字后Rd自增一次,32位寬度LDMDB.WRd!,{寄存器列表}從Rd處讀取多個字,并依次送到寄存器列表的寄存器中。每讀取一個字后Rd自減一次,32位寬度STMIA.WRd!,{寄存器列表}依次存儲寄存器列表中各寄存器的值到Rd給出的地址。每存儲一個字后Rd自增一次,32位寬度STMDB.WRd!,{寄存器列表}存儲多個字到Rd處。每存儲一個字前Rd自減一次,32位寬度268.2.1數(shù)據(jù)傳送指令

自動索引數(shù)據(jù)傳送指令,例如:LDR.WR0,[R1,#offset]!;該指令先把地址Rl+offset處的值加載到R0,然后令R1等于Rl+offset(offset也可以是負數(shù))。這里“!”的作用在傳送后更新基址寄存器R1的值?!?”是可選的。如果沒有“!”,則該指令就是普通的帶偏移量加載指令,不會自動調(diào)整R1的值。自動索引的數(shù)據(jù)傳送指令可以用在多種數(shù)據(jù)類型上,既可用于加載,又可用于存儲。278.2.1數(shù)據(jù)傳送指令

格式功能描述LDR.WRd,[Rn,#offset]!LDRB.WRd,[Rn,#offset]!LDRH.WRd,[Rn,#offset]!LDRD.WRd1,Rd2,[Rn,#offset]!字、字節(jié)、半字、雙字的自動索引加載(不做帶符號擴展,沒有用到的高位全清0)LDRSB.WRd,[Rn,#offset]!LDRSH.WRd,[Rn,#offset]!字節(jié)、半字的自動索引加載,并且在加載后執(zhí)行帶符號擴展(擴展成32位整數(shù))STR.WRd,[Rn,#offset]!STRB.WRd,[Rn,#offset]!STRH.WRd,[Rn,#offset]!STRD.WRd1,Rd2,[Rn,#offset]!字、字節(jié)、半字、雙字的自動索引存儲288.2.1數(shù)據(jù)傳送指令

后索引也要使用一個立即數(shù)offset,但與自動索引不同的是,后索引忠實地使用基址寄存器Rd的值,并把它作為傳送的目的地址。待到數(shù)據(jù)傳送后,再執(zhí)行Rd+offset指令(offset可以是負數(shù))。例如,STR.WR0,[Rl],#-12;后索引,該指令是把R0的值存儲到地址R1處。在存儲完后,R1等于Rl+(-12)。注意,[R1]后面是沒有“!”的;在后索引中,基址寄存器是無條件被更新。298.2.1數(shù)據(jù)傳送指令

格式功能描述LDR.WRd,[Rn],#offsetLDRB.WRd,[Rn],#offsetLDRH.WRd,[Rn],#offsetLDRD.WRd1,Rd2,[Rn],#offset字、字節(jié)、半字、雙字的后索引加載(不做帶符號擴展,沒有用到的高位全清0)LDRSB.WRd,[Rn],#offsetLDRSH.WRd,[Rn],#offset字節(jié)、半字的后索引加載,并且在加載后執(zhí)行帶符號擴展(擴展成32位整數(shù))STR.WRd,[Rn],#offsetSTRB.WRd,[Rn],#offsetSTRH.WRd,[Rn],#offsetSTRD.WRd1,Rd2,[Rn],#offset字、字節(jié)、半字、雙字的后索引存儲308.2.1數(shù)據(jù)傳送指令

ARM處理器是加載/存儲體系結(jié)構(gòu)的處理器,對存儲器的訪問只能通過加載和存儲指令實現(xiàn)。數(shù)據(jù)加載與存儲指令用于存儲器與處理器的寄存器之間傳送數(shù)據(jù)。加載是指把內(nèi)存中的數(shù)據(jù)裝載到寄存器中,而存儲是指把寄存器中的數(shù)據(jù)存入內(nèi)存。318.2.1數(shù)據(jù)傳送指令1、數(shù)據(jù)加載與存儲器指令的尋址數(shù)據(jù)加載與存儲指令的尋址基本格式為opcode{<cond>}Rd,addr其中,opcode為指令代碼,如LDR表示將存儲器中的數(shù)據(jù)加載到寄存器中。addr為存儲器的地址表達式,也稱為第2個操作數(shù),可表示為[Rn,offset],這里Rn表示基址寄存器,offset表示偏移量。addr有如下幾種表示形式:328.2.1數(shù)據(jù)傳送指令(1)立即數(shù)。立即數(shù)可以是一個無符號的數(shù)值,這個數(shù)值可以加到基址寄存器,此外也可以從基址寄存器中減去這個數(shù)值。例如:LDRR5,[R6,#0x08]

STRR6,[R7],#0x08(2)寄存器。寄存器中的數(shù)值可以加到基址寄存器,此外也可以從基址寄存器中減去這個數(shù)值。例如:LDRR5,[R6,R3]

STRR6,[R7],-R8338.2.1數(shù)據(jù)傳送指令(3)寄存器移位。寄存器中的數(shù)值可以根據(jù)指令中的移位標志位以及移位常數(shù)進行一定的移位操作,生成一個地址偏移量。這個地址偏移量可以加到基址寄存器,此外也可以從基址寄存器中減去這個數(shù)值。例如:LDRR3,[R2,R4,LSL#2]LDRR3,[R2],-R4,LSR#3;R2=R2-R4(右移3位),R2R3348.2.1數(shù)據(jù)傳送指令(4)標號。是一種簡單的尋址方法。在這種方法中,程序計數(shù)器PC是隱含的基址寄存器,偏移量是語句標號所在的地址和PC(當前正在執(zhí)行的指令)之間的差值。例如:LDRR4,START358.2.1數(shù)據(jù)傳送指令2、地址索引ARM指令中的地址索引也是指令的一個功能。索引作為指令的一部分,它影響指令的執(zhí)行結(jié)果。地址索引分為:前索引(Pre-indexed)自動索引(Auto-indexed)后索引(Post-indexed)368.2.1數(shù)據(jù)傳送指令(1)前索引。前索引也稱為前變址,該索引是在指令執(zhí)行前把偏移量和基址相加/減,得到的值作為尋址的地址。例如:LDRR5,[R6,#0x04]

STRR0,[R5,-R8]第1條指令在尋址前先把R6加上偏移量4來作為尋址的地址值;第2條指令在尋址前先把基址R5與偏移量R8相減,并以計算的結(jié)果作為地址值。在這兩條指令中,指令執(zhí)行后基址寄存器的地址值與指令執(zhí)行前相同,并不發(fā)生變化。378.2.1數(shù)據(jù)傳送指令(2)自動索引。自動索引也稱為自動變址。為了修改基址寄存器的內(nèi)容,使之指向數(shù)據(jù)傳送地址,可使用這種方可法自動修改基址寄存器。例如:LDRR5,[R6,#0x04]!這條指令在尋址前先把R6加上偏移量4來作為尋址的地址值,通過可選后綴“!”完成基址寄存器的更新,本例中執(zhí)行完操作后R6(基址寄存器)的內(nèi)容加4。388.2.1數(shù)據(jù)傳送指令(3)后索引。后索引也稱為后變址,是用基址寄存器的地址值尋址,找出操作數(shù)進行操作,操作完成后再把地址偏移量和基址相加/減,結(jié)果送到基址寄存器,作為下一次尋址的基址。例如:LDRR5,[R6],#0x04STRR6,[R7],#-0x08在第1條指令中,先把R6指向的地址單元的數(shù)據(jù)賦給R5,再把偏移量4加到基址寄存器R6中;在第2條指令中,先把R6的值存儲到R7指向的地址單元中,再把偏移量-8加到R7中。在后索引中,基址在指令執(zhí)行的前后是不相同的。398.2.1數(shù)據(jù)傳送指令前索引和自動索引區(qū)別:前索引利用對基址寄存器的改變值進行尋址,但是基址寄存器在操作之后仍然保持原值。自動索引在計算出新的地址后要用新的地址更新基址寄存器的內(nèi)容,然后利用新的基址寄存器進行尋址。前索引和后索引區(qū)別:前索引在指令執(zhí)行完成后并沒有改變基址寄存器的值,后索引在指令執(zhí)行完成后改變了基址寄存器的地址值。后索引和自動索引區(qū)別:后索引和自動索引類似,也要更新基址寄存器的內(nèi)容,但是后索引先利用基址寄存器的原值進行尋址操作,再更新基址寄存器。408.2.1數(shù)據(jù)傳送指令3、單寄存器加載與存儲指令單寄存器加載與存儲指令用于把單一的數(shù)據(jù)傳入或者傳出一個寄存器,其支持的數(shù)據(jù)類型有字(32位)、半字(16位)和字節(jié)。常用單寄存器加載與存儲指令包括以下幾個。LDR/STR:字數(shù)據(jù)加載/存儲指令。LDRB/STRB:字節(jié)數(shù)據(jù)加載/存儲指令。LDRH/STRH:半字數(shù)據(jù)加載/存儲指令。LDRSB/LDRSH:有符號數(shù)字節(jié)/半字加載指令。

418.2.1數(shù)據(jù)傳送指令字數(shù)據(jù)加載存儲指令LDR/STRcond:指令執(zhí)行的條件編碼。I、P、U、W:I、P、U、W用于區(qū)別不同的地址模式(偏移量)。I為0時,偏移量為12位立即數(shù);I為1時,偏移量為寄存器移位。P表示前/后索引,U表示加/減,W表示回寫。B:B為1表示字節(jié)訪問,B為0表示字訪問。L:L為1表示加載,L為0表示存儲。Rn:基址寄存器。Rd:源/目標寄存器。

addr_mode:addr_mode表示偏移量(一個12位的無符號二進制數(shù)),其與Rn一起構(gòu)成地址addr。428.2.1數(shù)據(jù)傳送指令匯編格式:LDR{<cond>}Rd,addr功能:LDR指令用于從存儲器中將一個32位的字數(shù)據(jù)加載到目的寄存器Rd中。該指令通常用于從存儲器中讀取32位的字數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。當程序計數(shù)器作為目的寄存器時,指令從存儲器中讀取的字數(shù)據(jù)被當作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。438.2.1數(shù)據(jù)傳送指令LDR指令示例如:(1)地址使用標號形成LDRR4,START

;將存儲地址為START的字數(shù)據(jù)讀入R4STRR5,DATA1;將R5存入存儲地址為DATA1的單元中(2)前索引LDRR0,[R1];將存儲器地址為R1的字數(shù)據(jù)讀入寄存器R0LDRR0,[R1,R2];將存儲器地址為R1+R2的字數(shù)據(jù)讀入寄存器R0LDRR0,[R1,#8];將存儲器地址為R1+8的字數(shù)據(jù)讀入寄存器R0LDRR0,[R1,R2,LSL#2];將存儲器地址為R1+R2×4的字數(shù)據(jù)讀入R0中448.2.1數(shù)據(jù)傳送指令(3)自動索引STRR0,[R1,R2]!;將R0字數(shù)據(jù)存入存儲器地址為R1+R2的存儲單元中,并將新地址R1+R2寫入R1STRR0,[R1,#8]!;將R0字數(shù)據(jù)存入存儲器地址為R1+8的存儲單元中,并將新地址R1+8寫入R1STRR0,[R1,R2,LSL#2]!;將R0字數(shù)據(jù)存入存儲器地址為R1+R2×4的存儲單元中,并將新地址R1+R2×4寫入R1458.2.1數(shù)據(jù)傳送指令(4)后索引LDRR0,[R1],#8;將存儲器地址為R1的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+8寫入R1。LDRR0,[R1],R2;將存儲器地址為R1的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+R2寫入R1。LDRR0,[R1],R2,LSL#2;將存儲器地址為R1的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1。468.2.1數(shù)據(jù)傳送指令注意事項:立即數(shù)的規(guī)定。立即數(shù)為絕對值不大于4095的數(shù)值且可使用帶符號數(shù),即立即數(shù)可為-4095~+4095。標號使用的限制。要注意語句標號不能指向程序存儲器的程序存儲區(qū),而是指向程序存儲器的數(shù)據(jù)存儲區(qū)或數(shù)據(jù)存儲器的數(shù)據(jù)存儲區(qū)。另外,指向的區(qū)域是可修改的。地址對齊。字傳送時,偏移量必須保證偏移的結(jié)果能夠使地址對齊。478.2.1數(shù)據(jù)傳送指令使用寄存器移位的方法計算偏移量時,移位的位數(shù)不能超過規(guī)定的數(shù)值。移位位數(shù)規(guī)定如下:ASR#n:算術(shù)右移n位,l≤n≤32。LSL#n:邏輯左移n位,0≤n≤31。LSR#n:邏輯右移n位,l≤n≤32。ROR#n:循環(huán)右移n位,1≤n≤31。注意程序計數(shù)器R15。R15作為基址寄存器Rn時,不可以使用回寫功能,即使用后綴“!”。另外,R15不可作為偏移寄存器使用。488.2.1數(shù)據(jù)傳送指令指令的正誤示例如下:LDRR1,[R2,R5]!

;正確STRR2,[R3],#0xFFFF8;錯誤,超出了立即數(shù)的范圍STREQR4,[R0,R4,LSLR5];錯誤,不能用寄存器表示移位的位數(shù)LDLR4,[R0,R1,LSL#32];錯誤,超出了移位的范圍STREQR3,[R6],#-0x08;正確LDRR0,[R2]!,-R6

;錯誤,后索引不使用“!”后綴LDRR4,START;正確LDRR1,[SP,#-0x04];正確STRR1,START;格式正確,但必須保證標號可以存儲數(shù)據(jù)LDRPC,R6

;錯誤,R6不表示一個存儲地址LDRPC,[R6]

;正確LDRR1,[R3,R15]

;錯誤,R15不可作為偏移寄存器498.2.1數(shù)據(jù)傳送指令字節(jié)數(shù)據(jù)加載/存儲指令LDRB/STRB匯編格式:LDRB/STRB{<cond>}Rd,addr功能:LDRB指令用于從存儲器中將一個8位字節(jié)數(shù)據(jù)加載到目的寄存器中,同時將寄存器的高24位清0。通常用于從存儲器中讀取8位的字節(jié)數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。當程序計數(shù)器作為目的寄存器時,指令從存儲器中讀取的字數(shù)據(jù)被當作目的地址,以實現(xiàn)程序流程的跳轉(zhuǎn)。STRB用于從源寄存器中將一個8位字節(jié)數(shù)據(jù)存儲到存儲器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。STRB和LDRB的區(qū)別在于數(shù)據(jù)的傳送方向。508.2.1數(shù)據(jù)傳送指令必須明確的是:即使傳送的是8位數(shù)據(jù),地址總線仍然以32位的寬度工作,而數(shù)據(jù)總線也是以32位的寬度工作;傳送16位的半字數(shù)據(jù),地址總線和數(shù)據(jù)總線也是以32位的寬度工作。518.2.1數(shù)據(jù)傳送指令a.從寄存器存儲到存儲器的過程。寄存器中的數(shù)據(jù)是32位結(jié)構(gòu),在向存儲器存儲8位字節(jié)時,怎樣去選擇寄存器中4字節(jié)中的某一字節(jié)呢?在ARM指令中,從寄存器到存儲器的1字節(jié)數(shù)據(jù)存儲只能傳送最低8位,即最低字節(jié)[7:0]。如果想要存儲其他字節(jié),此時可以采用移位的方法把要存儲的字節(jié)移至最低字節(jié)。528.2.1數(shù)據(jù)傳送指令b.從存儲器到寄存器的加載過程。與上述不同的是,在實現(xiàn)從存儲器到寄存器的加載過程時,可以選擇任何一個存儲器的地址單元,這時是不要求地址對齊的。也就是說,可以不加限制地選擇任何存儲器中的字節(jié)加載。538.2.1數(shù)據(jù)傳送指令LDRB/STRB指令示例如下:LDRBR0,[R1];將存儲器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清0LDRBR0,[R1,#8];將存儲器地址為R1+8的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清0STRBR0,[R1];將寄存器R0中的字節(jié)數(shù)據(jù)寫入以R1為地址的存儲器中STRBR0,[R1,#8];將寄存器R0中的字節(jié)數(shù)據(jù)寫入R1+8為地址的存儲器中548.2.1數(shù)據(jù)傳送指令半字數(shù)據(jù)加載/存儲指令LDRH/STRH匯編格式:LDRH/STRH{<cond>}Rd,addr功能:LDRH指令用于從存儲器中將一個16位的半字數(shù)據(jù)加載到目的寄存器Rd中,同時將寄存器的高16位清0。該指令通常用于從存儲器中讀取16位的半字數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進行處理。當程序計數(shù)器作為目的寄存器時,指令從存儲器中讀取的字數(shù)據(jù)被當作目的地址,從而可以實現(xiàn)程序流程的跳轉(zhuǎn)。558.2.1數(shù)據(jù)傳送指令LDRH/STRH指令示例如下:LDRHR0,[R1];將存儲器地址為R1的半字數(shù)據(jù)讀入寄存器R0,并將R0的高16位清0LDRHR0,[R1,#8];將存儲器地址為R1+8的半字數(shù)據(jù)讀入寄存器R0,并將R0的高16位清0LDRHR0,[R1,R2];將存儲器地址為R1+R2的半字數(shù)據(jù)讀入寄存器R0,并將R0的高16位清0STRHR0,[R1]

;將寄存器R0中的半字數(shù)據(jù)寫入以R1為地址的存儲器中568.2.1數(shù)據(jù)傳送指令使用半字加載/存儲指令需要注意如下事項:

(1)必須半字地址對齊。(2)對于R15的使用需要慎重,R15作為基址寄存器Rn時,不可以使用回寫功能。(3)立即數(shù)偏移使用的是8位無符號數(shù)。(4)不能使用寄存器移位尋址。(5)有符號數(shù)字節(jié)/半字加載指令LDRSB/LDRSH

578.2.1數(shù)據(jù)傳送指令匯編格式:LDRSB/LDRSH{<cond>}Rd,addr功能:LDRSB指令用于從存儲器中將一個8位的字節(jié)數(shù)據(jù)加載到目的寄存器中,同時將寄存器的高24位設(shè)置為該字節(jié)數(shù)據(jù)的符號位的值,即將該8位字節(jié)數(shù)據(jù)進行符號位擴展,生成32位數(shù)據(jù)。LDRSH指令用于從存儲器中將一個16位的半字數(shù)據(jù)加載到目的寄存器Rd中,同時將寄存器的高16位設(shè)置為該字數(shù)據(jù)的符號位的值,即將該16位字數(shù)據(jù)進行符號位擴展,生成32位數(shù)據(jù)。有符號數(shù)字節(jié)/半字加載指令LDRSB/STRSH588.2.1數(shù)據(jù)傳送指令LDRSB/LDRSH指令示例如下:LDRSBR0,[R1,#4];將存儲地址為R1+4的有符號字節(jié)數(shù)據(jù)讀入R0,R0中的高24位設(shè)置成該字節(jié)數(shù)據(jù)的符號位

LDRSHR6,[R2],#2;將存儲地址為R2的有符號半字數(shù)據(jù)讀入R6,R6中的高16位設(shè)置成該字節(jié)數(shù)據(jù)的符號位,R2=R2+2598.2.1數(shù)據(jù)傳送指令多寄存器加載與存儲指令也稱為批量數(shù)據(jù)加載/存儲指令,ARM微處理器所支持批量數(shù)據(jù)加載/存儲指令可以一次在一片連續(xù)的存儲器單元和多個寄存器之間傳送數(shù)據(jù)。批量數(shù)據(jù)加載指令用于將一片連續(xù)的存儲器中的數(shù)據(jù)加載到多個寄存器;批量數(shù)據(jù)存儲指令則完成相反的操作。批量數(shù)據(jù)加載/存儲指令在數(shù)據(jù)塊操作、上下文切換、堆棧操作等方面比單寄存器加載與存儲指令有更高執(zhí)行效率。常用批量數(shù)據(jù)加載/存儲指令有LDM/STM。4、多寄存器加載與存儲指令608.2.1數(shù)據(jù)傳送指令批量數(shù)據(jù)加載/存儲指令LDM/STMLDM/STM指令的機器編碼格式:cond:指令執(zhí)行的條件編碼。P、U、W:P、U、W用于區(qū)別不同的地址模式(偏移量);P表示前/后變址,U表示加/減,W表示回寫。S:用于區(qū)別有符號訪問(S為1)和無符號訪問(S為0)。L:L為1表示加載,L為0表示存儲。Rn:基址寄存器。regs:表示寄存器列表。618.2.1數(shù)據(jù)傳送指令匯編格式:LDM/STM{<cond>}{<type>}Rn{!},<regs>功能:LDM指令用于從基址寄存器所指示的一片連續(xù)存儲器單元中讀取數(shù)據(jù)到寄存器列表所指示的多個寄存器中,內(nèi)存單元的起始地址為基址寄存器Rn的值,各個寄存器由寄存器列表regs表示。該指令一般用于多個寄存器數(shù)據(jù)的出棧操作。STM指令用于將寄存器列表所指示的多個寄存器中的值存入由基址寄存器所指示的一片連續(xù)存儲器單元中,內(nèi)存單元的起始地址為基址寄存器Rn的值,各個寄存器由寄存器列表regs表示。該指令的其他參數(shù)用法與LDM指令的其他參數(shù)用法是相同的。此外,該指令可用于多個寄存器數(shù)據(jù)的進棧操作。628.2.1數(shù)據(jù)傳送指令LDM/STM{<cond>}{<type>}Rn{!},<regs>type表示指令后綴類型,用于數(shù)據(jù)的存儲與讀取時有以下幾種情況:IA每次傳送后地址值加。IB每次傳送前地址值加。DA每次傳送后地址值減。DB每次傳送前地址值減。{!}為可選后綴。若選用該后綴,則當數(shù)據(jù)加載與存儲完后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變?;芳拇嫫鞑辉试S為R15,寄存器列表可以為R0~R15的任意組合。638.2.1數(shù)據(jù)傳送指令LDM/STM指令尋址的區(qū)別648.2.1數(shù)據(jù)傳送指令設(shè)執(zhí)行前R0=0x00090010,R6=R7=R8=0x00000000,存儲器地址0x00090010的存儲內(nèi)容如下圖所示,執(zhí)行指令LDMIAR0!,{R6-R8}執(zhí)行后,各寄存器的值如下:658.2.1數(shù)據(jù)傳送指令設(shè)執(zhí)行前R0=0x00090010,R6=R7=R8=0x00000000,存儲器地址0x00090010的存儲內(nèi)容如下圖所示,執(zhí)行指令LDMIBR0!,{R6-R8}執(zhí)行后,各寄存器的值如下:668.2.1數(shù)據(jù)傳送指令3.堆棧操作指令實現(xiàn)數(shù)據(jù)傳送PUSH/POP作為堆棧專用操作,也屬于數(shù)據(jù)傳送類指令。語法格式:PUSH{cond}reglistPOP{cond}reglist其中,reglist為非空寄存器列表。678.2.1數(shù)據(jù)傳送指令堆棧就是在RAM存儲器中開辟(指定)的一個特定的存儲區(qū)域。在這個區(qū)域中,信息的存入(此時稱為推入)與取出(此時稱為彈出)的原則不再是“隨機存取”,而是按照“后進先出”的原則進行存取。1、堆棧結(jié)構(gòu)688.2.1數(shù)據(jù)傳送指令堆棧的一端是固定的,另一端是浮動的。堆棧固定端是堆棧的底部,稱為棧底。堆棧浮動端可以推入或彈出數(shù)據(jù)。向堆棧推入數(shù)據(jù)時,新推入的數(shù)據(jù)堆放在以前推入數(shù)據(jù)的上面,而最先推入的數(shù)據(jù)被推至堆棧底部,最后推入的數(shù)據(jù)堆放在堆棧頂部,稱為棧頂。從堆棧彈出數(shù)據(jù)時,堆棧頂部數(shù)據(jù)最先彈出,而最先推入的數(shù)據(jù)則是最后彈出。由于堆棧頂部是浮動的,為了指示現(xiàn)在堆棧中存放數(shù)據(jù)的位置,因此通常設(shè)置一個堆棧指針SP(R13),且它始終指向堆棧的頂部。當一個數(shù)據(jù)(32位)推入堆棧時,SP(R13的值減4)向下浮動指向下一個地址,即新的棧頂。698.2.1數(shù)據(jù)傳送指令當數(shù)據(jù)從堆棧中彈出時,SP(R13的值加4)向上浮動指向新的棧頂。在使用一個堆棧的時候,需要確定堆棧在存儲器空間中是向上生長還是向下生長的。向上稱為遞增(ascending)向下稱為遞減(descending)滿堆棧(fullstack)是指堆棧指針SP(R13)指向堆棧的最后一個已使用的地址或滿位置(也就是SP指向堆棧的最后一個數(shù)據(jù)項的位置);空堆棧(emptystack)是指SP指向堆棧的第一個沒有使用的地址或空位置。FD表示滿遞減堆棧;ED表示空遞減堆棧;FA表示滿遞增堆棧;EA表示空遞增堆棧。708.2.1數(shù)據(jù)傳送指令堆棧的基本操作包括建棧、進棧、出棧3種。(1)建棧建棧就是規(guī)定堆棧底部在RAM存儲器中的位置,用戶可以通過LDR命令設(shè)置SP的值來建立堆棧。例如:LDRR13,=0x90010LDRSP,=0x90010SP指向地址0x90010,棧中無數(shù)據(jù),堆棧的底部與頂部是重疊的,該棧是一個空棧。2、堆棧的基本操作718.2.1數(shù)據(jù)傳送指令(2)進棧、出棧使用POP操作(出棧)和PUSH操作(進棧)。進?;虺鰲2僮鞫际且宰郑?2位)為單位的。堆棧操作指令如下:;R0=X,R1=Y,R2=ZBLFxlFxlPUSH{R0};把R0存入棧,并調(diào)整SPPUSH{Rl};把R1存入棧,并調(diào)整SPPUSH{R2};把R2存入棧,并調(diào)整SP...;執(zhí)行Fxl的功能,中途可以改變R0~R2的值POP{R2};恢復R2早先的值,并再次調(diào)整SPPOP{Rl};恢復R1早先的值,并再次調(diào)整SPPOP{R0};恢復R0早先的值,并再次調(diào)整SPBXLR;返回回到主程序,R0=X,R1=Y,R2=Z,調(diào)用Fxl前后,R0~R2的值不變。728.2.1數(shù)據(jù)傳送指令舉例:PUSH{R0-R2}

;壓入R0~R2PUSH{R3-R5,R8,R12};壓入R3~R5、R8,以及R12在執(zhí)行POP指令時,可以進行如下操作:

POP{R3-R5,R8,R12};彈出R3~R5、R8,以及R12POP{R0-R2};彈出R0~R2注意:在寄存器列表中,不管寄存器序號是以什么順序給出的,匯編器都將把它們升序排列。先堆入(push)序號大的寄存器,后期先彈出(pop)序號小的寄存器。738.2.1數(shù)據(jù)傳送指令例8-1設(shè)指令執(zhí)行之前SP=0x00090010(R13),R4=0x00000003,R3=0x00000002,R2=0x00000001,將R2~R4入棧,然后出棧,注意進棧和出棧后SP的值。解:下列指令明了進棧和出棧的過程PUSH{R2-R4}POP{R6-R8}分析:第1條指令將R2~R4的數(shù)據(jù)入棧,指令執(zhí)行前SP的值為0x00090010,指令執(zhí)行時SP指向下一個地址(SP_4)存放R4,然后依次存放R3、R2,數(shù)據(jù)入棧后SP的值為0x00090004,指向堆棧的滿位置,如果有數(shù)據(jù)繼續(xù)入棧則下一地址為0x90000。748.2.1數(shù)據(jù)傳送指令其過程如下圖所示,注意入棧的順序。第2條指令POP{R6-R8}實現(xiàn)退棧操作。在第1條指令的基礎(chǔ)上,表示將剛才入棧的數(shù)據(jù)分別退棧到R6~R8,退棧后SP指向0x00090010。758.2.1數(shù)據(jù)傳送指令4.寄存器與特殊功能寄存器間數(shù)據(jù)傳送MRS/MSR專門用于訪問特殊功能寄存器,必須在特權(quán)級下才允許訪問,以免系統(tǒng)因誤操作或惡意破壞而功能紊亂。應(yīng)用程序狀態(tài)寄存器(APSR)卻允許在用戶級下訪問。MRS<gp_reg>,<special_reg>;讀特殊功能寄存器的值到通用寄存器MSR<special_reg>,<gp_reg>;寫通用寄存器的值到特殊功能寄存器768.2.1數(shù)據(jù)傳送指令MRS/MSR指令示例如下:MRSR0,BASEPRI;讀取BASEPRI到R0中MRSR0,FAULTMASK;似上MRSR0,PRIMASK;似上MSRBASEPRI,R0;寫入R0到BASEPRI中MSRFAULTMASK,R0;似上MSRPRIMASK,R0;似上778.2.1數(shù)據(jù)傳送指令5.立即數(shù)加載到寄存器16位指令MOV支持8位立即數(shù)加載例如:MOVR0,#0x1232位指令MOVW和MOVT可以支持16位立即數(shù)加載MOVW:把16位立即數(shù)放到寄存器的低16位,髙16位清0。MOVT:把16位立即數(shù)放到寄存器的高16位,低16位不受影響通過組合使用MOVW和MOVT就能產(chǎn)生32位立即數(shù)。但要注意的是,必須先使用MOVW,再使用MOVT。788.2.2數(shù)據(jù)處理指令數(shù)據(jù)處理指令中常見的運算指令包括算術(shù)四則運算指令、邏輯運算指令、移位和循環(huán)指令、符號擴展指令、數(shù)據(jù)反轉(zhuǎn)指令。798.2.2數(shù)據(jù)處理指令格式功能描述ADDRd,Rn,Rm;Rd=Rn+RmADDRd,Rm;Rd+=RmADDRd,#immRd+=imm常規(guī)加法imm的范圍為im8(16位指令或im12(32位指令)ADCRd,Rn,Rm;Rd=Rn+Rm+CADCRd,Rm;Rd+=Rm+CADCRd,#imm;Rd+=imm+C帶進位的加法imm的范圍為im8(16位指令)或im12(32位指令)ADD.WRd,#imm12;Rd+=imm12帶12位立即數(shù)的常規(guī)加法SUBRd,Rn;Rd-=RnSUBRd,Rn,#imm3;Rd=Rn-imm3SUBRd,#imm8;Rd-=imm8SUBRd,Rn,Rm;Rd=Rn-Rm常規(guī)減法SBCRd,Rm;Rd-=Rm+CSBC.WRd,Rn,#imm12;Rd=Rn-imm12-CSBC.WRd,Rn,Rm;Rd=Rn-Rm-C帶借位的減法RSB.WRd,Rn,#imm12;Rd=imm12-RnRSB.WRd,Rn,Rm;Rd=Rm-Rn逆向減法1.算術(shù)四則運算指令808.2.2數(shù)據(jù)處理指令格式功能描述MULRd,Rm

;Rd*=RmMUL.WRd,Rn,Rm;Rd=Rn*Rm常規(guī)乘法MLARd,Rm,Rn,Ra;Rd=Ra+Rm*RnMLSRd,Rm,Rn,Ra;Rd=Ra-Rm*Rn乘加與乘減UDIVRd,Rn,Rm

;Rd=Rn/Rm(無符號除法)SDIVRd,Rn,Rm

;Rd=Rn/Rm(帶符號除法)硬件支持的除法SMULLRL,RH,Rm,Rn;[RH:RL]=Rm*RnSMLALRL,RH,Rm,Rn;[RH:RL]+=Rm*Rn帶符號的64位乘法UMULLRL,RH,Rm,Rn;[RH:RL]=Rm*RnUMLALRL,RH,Rm,Rn;[RH:RL]+=Rm*Rn不帶符號的64位乘法818.2.2數(shù)據(jù)處理指令(1)加法指令和減法指令A(yù)RM中的算術(shù)指令主要是指加法指令和減法指令,這些指令主要實現(xiàn)兩個32位數(shù)據(jù)的加減操作。該類指令常常與移位器結(jié)合起來使用,從而可以獲得許多更為靈活的功能。ADD:加法指令。ADC:帶進位加法指令。SUB:減法指令。SBC:帶借位減法指令。RSB:逆向減法指令。RSC:帶借位的逆向減法指令。828.2.2數(shù)據(jù)處理指令加法指令A(yù)DD匯編格式:ADD{<cond>}{S}Rd,Rn,operand2功能:ADD指令用于把寄存器Rn值和操作數(shù)operand2相加,并將結(jié)果存放到Rd寄存器中,即Rd=Rn+operand2。其中,Rd為目的寄存器;Rn為操作數(shù)1,要求是一個寄存器;operand2為操作數(shù)2,可以是寄存器、被移位的寄存器或立即數(shù);cond為執(zhí)行條件;S選項決定指令的操作是否影響APSR中條件標志位的值,有S時指令執(zhí)行后的結(jié)果影響APSR中條件標志位N、Z、C、V。838.2.2數(shù)據(jù)處理指令A(yù)DD指令示例如下:ADDR0,Rl,R2;R0=R1+R2ADDR0,R1,#5;R0=R1+5ADDR0,Rl,R2,LSL#2;R0=R1+(R2左移2位)848.2.2數(shù)據(jù)處理指令數(shù)字常量表達式可以簡單到只是一個立即數(shù),還可以使用單目運算符、雙目運算符等。例如:#0x88;立即數(shù)#0x40+0x20;使用加法運算#0x40+0x20*4;使用加法、乘法運算#0x80:ROR:02;移位操作,循環(huán)右移2位#2_11010010;使用二進制數(shù)#0xFF:MOD:08;取模操作#0xFF0000:AND:660000;邏輯操作:兩數(shù)相與

858.2.2數(shù)據(jù)處理指令帶進位加法指令A(yù)DC匯編格式:ADC{<cond>}{S}Rd,Rn,operand2功能:ADC指令用于把寄存器Rn的值和操作數(shù)operand2相加,再加上APSR中的C條件標志位的值,并將結(jié)果存放到目的寄存器Rd中,即Rd=Rn+operand2+C。其中,Rn為操作數(shù)1,必須是一個寄存器;operand2為操作數(shù)2,它可以是寄存器、被移位的寄存器或立即數(shù);S選項決定指令的操作是否影響APSR中條件標志位的值,有S時指令執(zhí)行后的結(jié)果影響APSR中條件標志位N、Z、C、V。該指令使用一個進位標志位,這樣就可以進行比32位大的數(shù)的加法,設(shè)置S后綴來更改進位標志位。

868.2.2數(shù)據(jù)處理指令該指令用于實現(xiàn)超過32位的加法。用ADC指令完成64位加法,設(shè)第一個64位操作數(shù)放在R2、R3中,第二個64位操作數(shù)放在R4、R5中,64位結(jié)果放在R0、R1中。例如:ADDSR0,R2,R4ADCRl,R3,R5減法指令SUB匯編格式:SUB{<cond>}{S}Rd,Rn,operand2功能:SUB指令用于把寄存器Rn的值減去操作數(shù)operand2,并將結(jié)果存放到目的寄存器Rd中,即Rd=Rn-operand2。其中,Rd為目的寄存器;Rn為操作數(shù)1,必須是一個寄存器;878.2.2數(shù)據(jù)處理指令operand2為操作數(shù)2,它可以是寄存器、被移位的寄存器或立即數(shù);S選項決定指令操作的結(jié)果是否影響APSR中條件標志位的值,有S時指令執(zhí)行后的結(jié)果影響APSR中條件標志位N、Z、C、V。該指令可用于有符號數(shù)或無符號數(shù)的減法運算。SUB指令示例如下:

SUBR0,Rl,R2;R0=R1-R2SUBR0,Rl,#6;R0=R1-6SUBR0,R2,R3,LSL#1;R0=R2-(R3左移1位)

888.2.2數(shù)據(jù)處理指令帶借位減法指令SBC匯編格式:SBC{<cond>}{S}Rd,Rn,operand2功能:SBC指令用于把寄存器Rn的值減去操作數(shù)operand2,再減去APSR中的C條件標志位的反碼,并將結(jié)果存放到目的寄存器Rd中,即Rd=Rn-operand2-!C。其中,Rd為目的寄存器;Rn為操作數(shù)1,必須是一個寄存器;operand2是操作數(shù)2,它可以是寄存器、被移位的寄存器或立即數(shù);S選項決定指令的操作是否影響APSR中條件標志位的值,有S時指令執(zhí)行后的結(jié)果影響APSR中條件標志位N、Z、C、V。

898.2.2數(shù)據(jù)處理指令逆向減法指令RSB匯編格式:RSB{<cond>}{S}Rd,Rn,operand2功能:RSB指令用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果存放到目的寄存器中,即Rd=operand2-Rn。RSB指令示例如下:RSBR0,Rl,R2;R0=R2-R1RSBR0,R1,#6;R0=6-R1RSBR0,R2,R3,LSL#1;R0=(R3左移1位)-R2908.2.2數(shù)據(jù)處理指令帶借位的逆向減法指令RSC匯編格式:RSC{<cond>}{S}Rd,Rn,operand2功能:RSC指令用于把操作數(shù)operand2減去寄存器Rn的值,再減去APSR中的C條件標志位的反碼,并將結(jié)果存放到目的寄存器Rd中,即Rd=operand2-Rn-!C。其中,Rd為目的寄存器;Rn為操作數(shù)1,必須是一個寄存器。RSC指令示例如下:

RSCR0,Rl,R2;R0=R2-R1-!C918.2.2數(shù)據(jù)處理指令(2)乘法指令和乘加指令乘法指令把一對寄存器的內(nèi)容相乘,然后根據(jù)指令類型把結(jié)果累加到其他的寄存器。ARM微處理器支持乘法指令和乘加指令,根據(jù)運算結(jié)果可分為32位運算和64位運算兩類。64位乘法指令又稱為長整型乘法指令,由于其運算結(jié)果太大,不能存放在一個32位的寄存器中,因此把結(jié)果存放在兩個32位的寄存器Rdlo和Rdhi中。Rdlo存放低32位,Rdhi存放髙32位。與前面的數(shù)據(jù)處理指令不同,指令中的所有源操作數(shù)、目的寄存器必須為通用寄存器,不能對操作數(shù)使用立即數(shù)或被移位的寄存器。同時,目的寄存器Rd和操作數(shù)Rm必須是不同的寄存器。928.2.2數(shù)據(jù)處理指令乘法指令和乘加指令共有以下幾個:MUL:32位乘法指令。MLA:32位乘加指令。SMULL:64位有符號數(shù)乘法指令。SMLAL:64位有符號數(shù)乘加指令。UMULL:64位無符號數(shù)乘法指令。UMLAL:64位無符號數(shù)乘加指令。938.2.2數(shù)據(jù)處理指令32位乘法指令MUL匯編格式:MUL{<cond>}{S}Rd,Rm,Rs功能:MUL指令用于完成操作數(shù)Rm與操作數(shù)Rs的乘法運算,并把結(jié)果存放到目的寄存器Rd中,即Rd=Rm*Rs。S選項決定指令的操作是否影響APSR中條件標志位的值(以下幾個乘法指令對于S選項的規(guī)定與此處相同)。MUL指令示例如下。MULR0,Rl,R2;R0=R1*R2MULSR0,Rl,R2;R0=R1*R2,同時設(shè)置APSR中的相關(guān)條件標志位948.2.2數(shù)據(jù)處理指令32位乘加指令MLA匯編格式:MLA{<cond>}{S}Rd,Rm,Rs,Rn功能:MLA指令用于完成操作數(shù)Rm與操作數(shù)Rs的乘法運算,再將乘積加上Rn,并把結(jié)果存放到目的寄存器Rd中,即Rd=Rm*Rs+Rn。如果書寫了S,同時根據(jù)運算結(jié)果設(shè)置APSR中相應(yīng)的條件標志位。MLA指令示例如下:MLAR0,Rl,R2,R3;R0=R1*R2+R3MLASR0,Rl,R2,R3;R0=R1*R2+R3,同時設(shè)置APSR中的相關(guān)條件標志位958.2.2數(shù)據(jù)處理指令64位有符號數(shù)乘法指令SMULL匯編格式:SMULL{<cond>}{S}Rdlo,Rdhi,Rm,Rs功能:SMULL指令用于實現(xiàn)32位有符號數(shù)相乘,得到64位的結(jié)果。32位操作數(shù)Rm與32位操作數(shù)Rs進行乘法運算,并把結(jié)果的低32位存放到目的寄存器Rdlo中,結(jié)果的高32位放置到目的寄存器Rdhi中,即[RdhiRdlo]=Rm*Rs。如果書寫了S,同時根據(jù)運算結(jié)果設(shè)置APSR中相應(yīng)的條件標志位。SMULL指令示例如下:

SMULLR0,Rl,R2,R3結(jié)果:R0=(R2*R3)的低32位,Rl=(R2*R3)的高32位968.2.2數(shù)據(jù)處理指令64位有符號數(shù)乘加指令SMLAL匯編格式:SMLAL{<cond>}{S}Rdlo,Rdhi,Rm,Rs功能:SMLAL指令用于實現(xiàn)32位有符號數(shù)相乘并累加,得到64位的結(jié)果。如果書寫了S,同時根據(jù)運算結(jié)果設(shè)置APSR中相應(yīng)的條件標志位。其中,操作數(shù)Rm和操作數(shù)Rs均為32位的有符號數(shù)。對于目的寄存器Rdlo,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位。SMLAL指令示例如下:SMLALR0,Rl,R2,R3結(jié)果:R0=(R2*R3)的低32位+R0的低32位,

Rl=(R2*R3)+R1的高32位978.2.2數(shù)據(jù)處理指令64位無符號數(shù)乘法指令UMULL匯編格式:UMULL{<cond>}{S}Rdlo,Rdhi,Rm,Rs功能:UMULL指令用于實現(xiàn)32位無符號數(shù)相乘,得到64位的結(jié)果。32位操作數(shù)Rm與32位操作數(shù)Rs進行乘法運算,并把結(jié)果的低32位存放到目的寄存器Rdlo中,把結(jié)果的高32位存放到目的寄存器Rdhi中,即[RdhiRdlo]=Rm*Rs。如果書寫了S,根據(jù)運算結(jié)果設(shè)置APSR中相應(yīng)的條件標志位。UMULL指令示例如下:

UMULLR0,Rl,R2,R3結(jié)果:R0=(R2*R3)的低32位;Rl=(R2*R3)的高32位988.2.2數(shù)據(jù)處理指令64位無符號數(shù)乘加指令UMLAL匯編格式:UMLAL{<cond>}{S}Rdlo,Rdhi,Rm,Rs功能:UMLAL指令用于實現(xiàn)32位無符號數(shù)相乘并累加,得到64位的結(jié)果。UMLAL指令示例如下:UMLALR0,Rl,R2,R3結(jié)果:R0=(R2*R3)+R0的低32位Rl=(R2*R3)+R1的高32位998.2.2數(shù)據(jù)處理指令使用乘法指令應(yīng)注意以下事項:①在操作中需使用寄存器,但R15不可用。②在寄存器的使用中,注意Rd不能同時作為Rm,其他無限制。③有符號運算與無符號運算的低32位是沒有區(qū)別的。④Rdlo、Rdhi和Rm必須使用不同的寄存器。⑤對于UMULL和UMLAL指令運算,即使操作數(shù)的最高位為1,也解釋為無符號數(shù)。1008.2.2數(shù)據(jù)處理指令邏輯運算是對操作數(shù)按位進行操作的,位與位之間無進位或借位,無數(shù)的正負和數(shù)的大小之分。這種運算的操作數(shù)稱為邏輯數(shù)或邏輯值。邏輯運算指令主要包括以下幾個:AND:邏輯與指令。ORR:邏輯或指令。EOR:邏輯異或指令。BIC:位清零指令。2.邏輯運算指令1018.2.2數(shù)據(jù)處理指令示例功能描述ANDRd,Rn

;Rd&=RnAND.WRd,Rn,#imm12;Rd=Rn&imm12AND.WRd,Rm,Rn;Rd&=Rm&Rn按位與ORRRd,Rn

;Rd|=RnORR.WRd,Rn,#imm12;Rd=Rn|imm12ORR.WRd,Rm,Rn

;Rd=Rm|Rn按位或BICRd,Rn;Rd&=~RnBIC.WRd,Rn,#imm12

;Rd=Rn&~imm12BIC.WRd,Rm,Rn

;Rd=Rm&~Rn位清零ORN.WRd,Rn,#imm12;Rd=Rn|~imm12ORN.WRd,Rm,Rn按位或反碼EORRd,Rn;Rd^=RnEOR.WRd,Rn,#imm12;Rd=Rn^imm12EOR.WRd,Rm,Rn;Rd=Rm^Rn按位異或1028.2.2數(shù)據(jù)處理指令(1)邏輯與指令A(yù)ND匯編格式:AND{<cond>}{S}Rd,Rn,operand2功能:AND指令用于將兩個操作數(shù)按位進行邏輯與運算,結(jié)果存放到目的寄存器Rd中,即Rd=RnANDoperand2。其中,Rn為操作數(shù)1,是一個寄存器;operand2為操作數(shù)2,它可以是寄存器、被移位的寄存器或立即數(shù);S選項決定指令的操作是否影響APSR中條件標志位的值,有S時指令執(zhí)行后的結(jié)果影響APSR中條件標志位N和Z的值,且在計算第2個操作數(shù)時更新標志位C,不影響標志位V。設(shè)R0=0xFFFFFFFF,ANDR0,R0,#0xF,R0=?1038.2.2數(shù)據(jù)處理指令(2)邏輯或指令ORR匯編格式:ORR{<cond>}{S}Rd,Rn,operand2功能:ORR指令用于將兩個操作數(shù)按位進行邏輯或運算,結(jié)果存放到目的寄存器Rd中,即Rd=RnORRoperand2。其中Rn為操作數(shù)1,是一個寄存器;operand2為操作數(shù)2,它可以是寄存器、被移位的寄存器或立即數(shù)。若要將R0的第0位和第3位設(shè)置為1,其余位不變,則應(yīng)執(zhí)行什么指令?ORRR0,R0,#51048.2.2數(shù)據(jù)處理指令(3)邏輯異或指令EOR匯編格式:EOR{<cond>}{S}Rd,Rn,operand2功能:EOR指令用于將兩個操作數(shù)按位進行邏輯異或運算,并把結(jié)果存放到目的寄存器Rd中,即Rd=RnEORoperand2。若要將R0的低4位取反,其余位不變,則應(yīng)執(zhí)行什么指令?EORR0,R0,#0xF1058.2.2數(shù)據(jù)處理指令(4)位清零指令BIC匯編格式:BIC{<cond>}{S}Rd,Rn,operand2功能:BIC指令用于清零操作數(shù)Rn的某些位,并把結(jié)果存放到目的寄存器Rd中,即Rd=RnAND(!operand2)。若要將R0的第0位和第3位清0,其余位不變,則應(yīng)執(zhí)行什么指令?BICR0,R0,#91068.2.2數(shù)據(jù)處理指令3.移位和循環(huán)指令示例功能描述LSLRd,Rn,#imm5;Rd=Rn<<imm5LSLRd,Rn;Rd<<=RnLSL.WRd,Rm,Rn;Rd=Rm<<Rn邏輯左移LSRRd,Rn,#imm5;Rd=Rn>>imm5LSRRd,Rn;Rd>>=RnLSR.WRd,Rm,Rn;Rd=Rm>>Rn邏輯右移ASRRd,Rn,#imm5;Rd=Rn·>>imm5ASRRn;Rd·>>=RnASR.WRd,Rm,Rn;Rd=Rm·>>Rn算術(shù)右移RORRd,Rn;Rd>>=Rn

溫馨提示

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

評論

0/150

提交評論