MICETEKInternationalInc.第二章ARM指令集介紹第1頁第二章ARM組合語言與指令集介紹本章介紹ARM指令集、Thumb指令集,以及各類指令對應的定址方式,通過對本章的閱讀,希望讀者能瞭解ARM微處理器所支援的指令集及具體的使用方法。2.1ARM指令集的分類與格式ARM微處理器的指令集是屬於載入/存回型的,也即指令集僅能處理暫存器中的資料,而且處理結果都要放回暫存器中,而對系統記憶體的存取則需要通過專門的載入/存回指令來完成。ARM微處理器的指令集可以分為跳轉指令、資料處理指令、程式狀態暫存器(PSR)處理指令、載入/存回指令、輔助運算器指令和例外產生指令六大類,具體的指令及功能如表2-1所示(表中指令為基本ARM指令,不包括衍生的ARM指令)。ARM的指令集大致上可以分為六大類:跳轉指令(BranchInstructions):通常是用來做程式流程控制。資料處理指令(Data-processingInstructions):一般的暫存器運算指令。載入存回指令(LoadandStoreInstructions):對記憶體和暫存器之間的資料搬移指令。狀態暫存器存取指令(StatusRegisterTransferInstructions):存取CPSR和SPSR暫存器的相關指令。輔助運算器(協同處理器)指令(CoprocessorInstructions):存取協同處理器或與協同處理器溝通之指令。例外產生指令(Exception-generatingInstructions):產生軟體中斷和其他例外的指令。指令符號指令功能描述數學運算(Arithmeticinstruction)ADC納入進位旗標相加指令ADD加法指令CMN比較反號指令CMP比較指令SUB減法指令SUC納入進位旗標相減指令MLA32位元相乘並相加指令MUL32位元乘法指令RSB對調相減指令RSC納入進位旗標對調相減指令邏輯運算(Logicinstruction)ANDAND運算指令MICETEKInternationalInc.第二章ARM指令集介紹第2頁BIC位元清零(bitclear)指令EORExclusive或運算指令ORRORR運算指令TEQ相等測試指令TST位元測試指令跳轉指令(BranchInstruction)B跳轉指令BL帶返回的跳轉指令BLX帶返回和狀態切換的跳轉指令BX帶狀態切換的跳轉指令載入指令(LoadInstruction)LDM載入多個暫指令LDR記憶體到暫存器的資料傳輸指令搬移指令(Moveinstruction)MOV資料傳送(搬移)指令MVN資料取反搬移指令MRS傳送CPSR或SPSR的數值到一般暫存器指令MSR傳送一般暫存器到CPSR或SPSR的指令輔助運算器(協同處理器)(Coprocessorinstruction)MCR從ARM暫存器的數值到輔助運算器(協同處理器)暫存器的資料傳輸指令MRC從輔助運算器(協同處理器)暫存器的數值到ARM暫存器的資料傳輸指令LDC從輔助運算器(協同處理器)暫存器的數值到記憶體的資料傳輸指令STC從記憶體內的數值到輔助運算器(協同處理器)暫存器的資料傳輸指令CDP輔助運算器資料操作指令軟體中斷(SoftwareInterruptinstruction)SWI觸發軟體中斷指令SBC帶借位減法指令儲存指令(Storwinstruction)STM多重記憶體寫入指令STR暫存器到記憶體的資料傳輸指令其他指令(Others)NOP無指令SWP暫存器與記憶體數值交換指令表2-1ARM指令及功能描述2.1.1ARM條件式指令一般ARM指令的典型指令編碼格式如下所示:3128272524212019161512110condxxxopcodeSRnRdshifter_operand其中:cond指令執行的條件式編碼opcode指令操作符號MICETEKInternationalInc.第二章ARM指令集介紹第3頁S指定是否在運算執行時順便更新CPRS的旗標Rn包含第一個運算元的目標暫存器的編號Rd資料來源暫存器的編號shifter_operand第二個資料來源運算元ARM的指令包含一個可選的條件碼。只有在CPSR中的條件碼旗標滿足指定的條件時,帶條件碼的指令才可以執行。也可以根據一條指令設置的旗標,有條件地執行另一條指令。每一條ARM指令包含4位元的條件碼,位於指令的最高4位元[31:28]。每種條件碼可用兩個字元表示,這兩個字元可以添加在指符號的後面和指令同時使用。例如,跳轉指令B可以加上尾碼EQ變為BEQ表示“相等則跳轉”,即當CPSR中的Z旗標為1時發生跳轉。條件編碼有如下幾種:編碼[31:28]條件描述狀態旗標運算含義指令範例0000EQZ=1相等BEQ0001NEZ=0不等值BNE0010CS/HSC=1大於等於BCS0011CC/LOC=0小於BCC0100MIN=1負值BMI0101PLN=0正數或零BPL0110VSV=1溢位BVS0111VCV=0無溢出BVC1000HIC=1andZ=0大於BHI1001LSC=0orZv小於等於BLS1010GEN=V大於等於BGE1011LTN≠V小於BLT1100GTZ=0andN=V大於BGT1101LEZ=1,orN≠V小於或等於BLE1110ALAny預設值BAL表2-2條件式定義、編碼與跳轉指令範例ARM指令可根據執行結果來選擇是否更新條件旗標位元。若要更新條件旗標位元,須在指令中包含尾碼“S”。一些指令不需要尾碼“S”,如CMP、CMN、TST和TEQ。它們的功能本來就是更新條件旗標位元的。2.2ARM指令的定址方式定址方式就是處理器根據指令中給出的位址資訊來尋找實際位址的方式。目前ARM指令的定址方式(定址法)基本上可以分為以下幾種:1.立即定址指令中已包含了運算元,即立即數。例如:ADDR0,R0,#1;R0←R0+1MICETEKInternationalInc.第二章ARM指令集介紹第4頁ADDR0,R0,#0x3f;R0←R0+0x3f在以上兩條指令中,第二個資料來源運算元(數值)即為立即數,並要求以“#”為區分,對於以十六進位表示的立即數,還要求在“#”後加上“0x”或“&”。2.暫存器直接定址指令中的位址編碼部分給出某一暫存器編號,運算元(數值)在暫存器中。例如:ADDR0,R1,R2;R1+R2R0該指令的執行順序為將暫存器R1和R2的數值相加,將其結果存放在暫存器R0中。3.暫存器間接定址暫存器間接定址就是以暫存器中的值作為運算元的位址,而運算元本身存放在記憶體中。例如:LDRR0,[R1];[R1]R0//將R1指向的記憶體中的內容載入到R0中。STRR0,[R1];[R1]←R0//將R0的值傳送到以R1的值為位址的記憶體中。4.暫存器移位定址第二個暫存器中存放的運算元先進行移位操作,然後與第一個運算元結合。例如:ADDR0,R1,R2LSL#3;R1+R2*8R0//R2中的運算元左移3位元可以採用的移位指令有以下幾種:LSL(LogicalShiftLeft):邏輯左移。暫存器中的運算元左移一位,LSL從bit0低位補0進來。LSR(LogicalShiftRight):邏輯右移。暫存器中的運算元右移一位,LSR從bit31高位補0進來。ASR(ArithmeticShiftRight):算術右移。ArithmeticShift代表保留正負號欄位其他做位移動作。因此移位元的過程中應保持運算元的符號不變。暫存器中的運算元右移一位。若運算元為正數,則bit31補0。若運算元為負數,則bit31補進1。ROR(RotateRight):迴圈右移。暫存器中的運算元右移一位,最高位元空出位元並移入最低位移出的位元。RRX(RotateRighteXtended):延伸ROR的迴圈右移。暫存器中的運算元右移一位,最高位元空出位元後用原來CPSR的旗標位元中的值填入。5.多暫存器定址用此方式可一次傳遞幾個暫存器中的值。允許在一條指令中最多傳送16個一般暫存器的任何子集。例如:LDMIAR0,{R1,R2,R3};[R0]R1;[R0+4]R2MICETEKInternationalInc.第二章ARM指令集介紹第5頁;[R0+8]R3該指令的尾巴的IA表示每次執行完下載/存回操作後,R0按Word長度增加,因此指令可將連續記憶體的值傳送到R1~R3。6.基址定址此方式是將基址暫存器中的內容與指令中的偏移量相加,得到運算元的存放位址。基址定址用於存取基底位址附近的記憶體。例如:LDRR0,[R1,#8];[R1+8]R0LDRR0,[R1+R2];[R1+R2]R0基址定址包括前索引和後索引定址。前索引定址指將基底位址加上偏移量之後產生的位址作為有效位址。例如:LDRR0,[R1,#8];[R1+8]R0後索引定址指將不帶有偏移量的基底位址作為有效位址。LDRR0,[R1],#8;[R1]R0;R1+8R1另外,符號“!”可以用來使指令執行完後更新基底位址。例如:LDRR0,[R1,#8]!;[R1+8]R0;R1+8R17.堆疊定址堆疊定址即利用堆疊指標,按特定順序存取記憶體單元,使用push指令向堆疊寫資料。使用pop指令從堆疊中讀數據。堆疊可分為兩種:遞增堆疊(ascendingstack),即堆疊向高位址方向伸展;遞減堆疊(descendingstack),即堆疊向低位址方向伸展;堆疊指標指向最後壓入堆疊的有效資料,稱為滿堆疊(fullstack)。堆疊指標指向下一個有效資料將要存放的位置,稱為空堆疊(emptystack)。按此組合,可產生4種類型的堆疊:滿遞增:滿堆疊,遞增堆疊空遞增:空堆疊,遞增堆疊滿遞減:滿堆疊,遞減堆疊空遞減:空堆疊,遞減堆疊8.相對定址把PC指標作為基底位址。計算出目的地址和現行指令位址之間的偏移量。基底位址加偏移量即得到最終的有效位址。例如:BLSUBR;跳轉到SUBR…SUBR…;副程式入口MOVPC,R14;返回MICETEKInternationalInc.第二章ARM指令集介紹第6頁2.3ARM指令分類介紹前面已知ARM指令可分為六大類:接下來為這六大類指令進行詳細的解說。2.3.1記憶體存取指令1.LDR和STR:用於單一word和無符號位元組(UnsignedByte)時。載入暫存器指令(LDR)將資料從記憶體載入到暫存器中。儲存暫存器指令(STR)將資料從暫存器存放到記憶體中。可用於32位元word或8位元無符號位元組。位元組載入會用“0”延伸至32位元。LDR和STR都有如下4種形式:零偏移量(zerooffset)op{cond}{B}{T}Rd,[Rn]Rn的值作為傳送資料的位址。前索引偏移(pre-indexedoffset)op{cond}{B}Rd,[Rn,Flexoffset]{!}在資料傳送之前,將偏移量加到Rn中。其結果作為傳送資料的記憶體位址。若使用尾碼“!”,則結果寫回到Rn中,且Rn不允許是R15。程式相對偏移(programrelative)op{cond}{B}Rd,label程式相對偏移是前索引形式的另一種版本。從PC計算偏移量,並將PC作為Rn產生前索引指令。不能使用尾碼“!”。後索引偏移(post-indexedoffset)op{cond}{B}{T}Rd,[Rn],FlexoffsetRn的值用做傳送資料的記憶體位址。在資料傳送後,將偏移量加到Rn中。結果寫回到Rn。Rn不允許是R15。其中:op操作碼,指令LDR或STR。cond可選擇的條件碼。B可選擇尾碼。若有B,則傳送Rd的最低有效位元組。若op是LDR,則將Rd的其他位元組清除為零。T可選擇尾碼。若有T,那麼即使處理器是在特殊模式下,儲存系統也將存取看成處理器是在使用者模式下。T在使用者模式下無效,不能與前索引偏移一起使用T。Rd用於載入或儲存的ARM暫存器。Rn記憶體的基底暫存器。若指令是具有