ARM體系結構與編程-第二章_第1頁
ARM體系結構與編程-第二章_第2頁
ARM體系結構與編程-第二章_第3頁
ARM體系結構與編程-第二章_第4頁
ARM體系結構與編程-第二章_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2章ARM指令分類及尋址方式第2章目錄1.ARM指令的分類和ARM指令的一般格式2.ARM處理器尋址方式第2章目錄1.ARM指令的分類和ARM指令的一般格式2.ARM處理器尋址方式ARM指令的分類 跳轉指令、數(shù)據(jù)處理指令、程序狀態(tài)傳輸指令、Load/Store指令、協(xié)處理器和異常中斷產生指令6類2.1ARM指令的一般格式

說明Cond

指令執(zhí)行的條件編碼Opcode

指令操作符編碼S

決定指令的操作是否影響CPSR的值Rd

操作目標寄存器編碼Rn

包含第一操作數(shù)的寄存器編碼Shifter_operand

表示第二操作數(shù)指令的編碼格式2.1ARM指令的一般格式一條指令代碼的舉例:ADDEQR5,R7,R3,LSL#2;若條件滿足Z=1,將R3左移2位與R7相加放入R5這條指令的二進制編碼是:

0000條件碼cond00001000指令編碼Sopcode0111源寄存器Rn0101目標寄存器Rd00010000移位數(shù)移位方式0011第二操作寄存器031Shifter-operandEQADDR7R52左移R3201216

ARM指令的基本書寫格式如下:2.1ARM指令的一般格式ARM指令集——條件碼<opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>

ADDEQR5,R7,R3,LSL#2

使用條件碼“cond”可以改變程序的執(zhí)行順序,提高代碼效率。

當條件滿足時執(zhí)行該指令,條件不滿足時該指令不被執(zhí)行。所有的ARM指令都可以條件執(zhí)行,如果指令不標明條件代碼,將默認為無條件(AL)執(zhí)行。操作碼條件助記符標志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數(shù)大于或等于0011CC/LOC=0無符號數(shù)小于0100MIN=1負數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1且Z=0無符號數(shù)大于1001LSC=0或Z=1無符號數(shù)小于或等于1010GEN=V有符號數(shù)大于或等于

1011LTN!=V有符號數(shù)小于

1100GTZ=0,N=V有符號數(shù)大于

1101LEZ=1,N!=V有符號數(shù)小于或等于

1110AL(always)任何無條件執(zhí)行

(指令默認條件)1111NV任何從不執(zhí)行(不要使用)指令條件碼表2.1ARM指令的一般格式ARM指令——條件碼C代碼:if((a!=10)&&(b!=20)) a=a+b;對應的匯編代碼:CMP R0,#10 ;比較R0是否為10CMPNE R1,#20 ;若Z=0,R0不是10,則比較R1是否為20ADDNE R0,R0,R1

;若Z=0,R0不為10且R1不為20,則執(zhí)行指令

R0=R0+R1示例:若兩個條件均成立,則將兩個數(shù)值相加。2.1ARM指令的一般格式ARM指令——條件碼C代碼:If((a!=10)&&(b==20)) a=a+b;對應的匯編代碼:

CMPR0,#10;比較R0是否為10 BEQlable ;若R0=10則不必后面的比較,跳轉至lable CMPNE R1,#20 ;R0!=10,再比較R1 ADDEQ R0,R0,R1

LableMOVR8,R11示例:若兩個條件均成立,則將兩個數(shù)值相加。對應的錯誤匯編代碼:CMP R0,#10 ADDNE R0,R0,R1

CMPEQ R1,#20 ADDNE R0,R0,R1

對應的匯編代碼:CMP R0,#10 ;比較R0是否為10CMPEQ R1,#20 ;若Z=1,即R0為10,則比較R1是否為20

;若Z=1,即R0不為10,則本指令不執(zhí)行ADDNE R0,R0,R1

;若R0不為10

或R1不為20,

則執(zhí)行R0=R0+R1。2.1ARM指令的一般格式ARM指令——條件碼C代碼:If((a!=10)||(b!=20)) a=a+b;示例:若兩個條件有一個成立,則將兩個數(shù)值相加。2.1ARM指令的一般格式ARM指令——指令格式2.2ARM處理器尋址方式尋址方式分類

尋址方式是尋找真實操作數(shù)地址的方式。ARM處理器具有5種基本尋址方式。數(shù)據(jù)處理指令的操作數(shù)的尋址方式字及無符號字節(jié)的Load/Store指令的尋址方式雜類Load/Store指令的尋址方方式批量Load/Store指令的尋址方式協(xié)處理器Load/Store指令的尋址方式

ARM指令的基本書寫格式如下:<opcode>{<cond>}{S}<Rd>,<Rn>,<shift_operand>

第2個操作數(shù)“shift_operand”有如下3種形式(見教材25頁*):#<immediate>——立即數(shù)表達式MOVR0,#0X04800000 ;R0=0X04800000<Rm>——寄存器方式SUBR0,R1,R2 ;R0=R1-R2<Rm>,shift——寄存器移位方式ADDR0,R1,R1,LSL

#2 ;R0=R1+R1*42.2.1數(shù)據(jù)處理指令的操作數(shù)尋址方式2.2ARM處理器尋址方式尋址方式分類

尋址方式是尋找真實操作數(shù)地址的方式。ARM處理器具有5種基本尋址方式。數(shù)據(jù)處理指令的操作數(shù)的尋址方式字及無符號字節(jié)的Load/Store指令的尋址方式雜類Load/Store指令的尋址方方式批量Load/Store指令的尋址方式協(xié)處理器Load/Store指令的尋址方式先介紹:#<immediate>——立即數(shù)MOVR0,#0X04800000 ;R0=0X04800000在數(shù)據(jù)處理指令中,規(guī)定這個立即數(shù)必須是一個8bit的常數(shù)通過循環(huán)右移偶數(shù)位得到。循環(huán)右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常數(shù)2.2.1數(shù)據(jù)處理指令的操作數(shù)尋址方式合法的立即數(shù)(參見教材25頁圖)〈immediate〉=immed_8循環(huán)右移(2Xrotate_imm)8bit4bit(0—15)范圍:0—30最大為0xffADDr1,r2,#0xFF0000;uses0xFF(immed_8)ror16(rotate_imm=8)MOVR0,#0X04800000;immed_8=0x12,rotate_imm=5 ;將0x12循環(huán)右移10(2*rotate_imm)位判斷合法立即數(shù)的方法0-0xff之間的一個8位數(shù)。在滿足不超8位的情況下,若最右側的“1”的右側0形成偶數(shù)位時,從最右側的“1”算起,否則為奇數(shù)時在右側多取一個0,向高位(向左),得到這個8位數(shù)。類型為0xf000000f的除外,(合法立即數(shù))。循環(huán)右移偶數(shù)位。練習下面哪些立即數(shù)是數(shù)據(jù)處理指令中有效的數(shù)據(jù)?a)0x000003FCb)0x000001FEc)0xF0000000d)0x0000FFFFe)0xF0000001f)0xF0000010g)0x0000010824頁書上√0xFF>>30×√0xF0>>8×√0x1F>>4或0x7C>>6×√0x42>>300x800000100x108 循環(huán)右移4位得到0x800000100001

00001000取0x42循環(huán)右移30位可以得到0x10801000010那么,0x42循環(huán)右移34位可以得到0x80000010也就是0x42循環(huán)右移兩位就可得到0x80000010。0x80000010為合法立即數(shù)0x20000010

0x102 循環(huán)右移4位得到0x200000100001

0000

0010取0x81循環(huán)右移31位可以得到0x102,移位為奇數(shù),則0x102非法。那么0x20000010為非法。藍色數(shù)值合法即合法,非法即非法。立即數(shù)(2)一個合法的立即數(shù)可能有多種編碼方法。如0x3f0是一個合法的立即數(shù),它可以采用下面兩種編碼方法生成:

Immed_8=0x3f,rotate_imm=14循環(huán)右移28位或者

Immed_8=0xfc,rotate_imm=15循環(huán)右移30位

MOVR0,#4096;uses(immed_8=0x40)ror26(rotate_imm=13);將0x40循環(huán)右移26位,也就相當于0X40左移6位;亦可immed_8=0x01ror(rotate_imm=10)。;也就是將0x01循環(huán)右移20位,也可以得到。ARM匯編編譯器按照下面的規(guī)則來生成立即數(shù)編碼:當立即數(shù)數(shù)值在0—0xff范圍內時,令<immediate>=immed_8,rotate_imm=0其它情況下,匯編編譯器選擇rotate_imm數(shù)值最小的編碼方法。裝載32bit常數(shù) 為允許裝載較大的立即數(shù),匯編器提供了一條偽指令:

LDRRd,=const

推薦使用這種方法把常數(shù)裝入寄存器如,LDRR1,=0XFFFFFF00操作數(shù)的值存放在寄存器中,指令執(zhí)行時直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2

;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結果保存到R0

0xAA0x55R2R1<Rm>——寄存器方式MOVR1,R20xAA2.2.1數(shù)據(jù)處理指令的操作數(shù)尋址方式<opcode>{<cond>}{S}<Rd>,<Rn>,<shift_operand>

可以采取的移位操作如下:LSL:邏輯左移(LogicalShiftLeft)LSR:邏輯右移(LogicalShiftRight)ASR:算術右移(ArithmeticShiftRight)ROR:循環(huán)右移(ROtateRight)RRX:擴展為1的循環(huán)右移(RotateRighteXtendedby1place)寄存器移位尋址2.2.1數(shù)據(jù)處理指令的操作數(shù)尋址方式<opcode>{<cond>}{S}<Rd>,<Rn>,<shift_operand>

LSL邏輯左移:右側用0填充,最后移出位入C0LSR邏輯右移:左側用0填充,最后移出位入C0ASR算術右移:用符號位填充,最后移出位入CROR循環(huán)右移:最后移出位入CRRX擴展的循環(huán)右移(只移一位)右側移出入C,C入左側一位CCCC2.2.1數(shù)據(jù)處理指令的操作數(shù)尋址方式2.2ARM處理器尋址方式尋址方式分類

尋址方式是尋找真實操作數(shù)地址的方式。ARM處理器具有5種基本尋址方式。數(shù)據(jù)處理指令的操作數(shù)的尋址方式字及無符號字節(jié)的Load/Store指令的尋址方式雜類Load/Store指令的尋址方方式批量Load/Store指令的尋址方式協(xié)處理器Load/Store指令的尋址方式2.2ARM處理器尋址方式尋址方式分類

尋址方式是尋找真實操作數(shù)地址的方式。ARM處理器具有5種基本尋址方式。數(shù)據(jù)處理指令的操作數(shù)的尋址方式字及無符號字節(jié)的Load/Store指令的尋址方式雜類Load/Store指令的尋址方方式批量Load/Store指令的尋址方式協(xié)處理器Load/Store指令的尋址方式Load指令用于從存儲器(包括內存和外存)中讀取數(shù)據(jù)加載到寄存器中;Store指令用于將寄存器的數(shù)據(jù)保存到存儲器。各種類型的Load/Store指令中尋找的地址由兩部分組成:

1〉基址寄存器:一般使用通用寄存器

2〉地址偏移量:立即數(shù)、寄存器、寄存器及一個移位常數(shù)。

需要的地址=基址寄存器+地址偏移量2.2.2字及無符號字節(jié)的Load/Store指令的尋址方式寄存器移位尋址是ARM指令集特有的尋址方式。0x55R0R20x01寄存器移位尋址MOVR0,R2,LSL#30x080x08邏輯左移3位2.2.1數(shù)據(jù)處理指令的操作數(shù)尋址方式變址尋址就是將基址寄存器中的地址與指令中給出的偏移量相加/減,形成有效地址。變址尋址用于訪問基址附近的存儲單元,常用于查表、數(shù)組操作、功能部件寄存器(與通用寄存器R0-R12不同)訪問等。變址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAAR3+0x0C作為地址2.2.2字及無符號字節(jié)的Load/Store指令的尋址方式LDR指令的語法格式如下:(訪問的數(shù)據(jù)的地址)LDR{<cond>}{B}{T}<Rd>,<address_mode>;T后綴,在特權模式下對存儲器的訪問,將被存儲器看成是用戶模式(即非特權)的訪問,操作的寄存器也是用戶模式下的。(destination目的地)(書上34頁*,35頁*)其中,<

address_mode>

有下面9種格式(Rn為基址寄存器):

1.[<Rn>,#+/-<offset_12>]立即數(shù),注定在Rn的4k范圍

2.[<Rn>,+/-<Rm>]寄存器

3.[<Rn>,+/-<Rm>,<shift>#<shift_imm>]寄存器移位

LDRR0,[R1,#4];將[R1+4]中的字讀取到R0寄存器

4.[<Rn>,#+/-<offset_12>]!注定在Rn的4k范圍

5.[<Rn>,+/-<Rm>]! 6.[<Rn>,+/-<Rm>,<shift>#<shift_imm>]!

LDRR0,[R1,#4]!;將[R1+4]中數(shù)據(jù)放到R0寄存器,更新R1為R1+4 7.[<Rn>],#+/-<offset_12>注定在Rn的4k范圍

8.[<Rn>],+/-<Rm> 9.[<Rn>],+/-<Rm>,<shift>#<shift_imm> LDRR0,[R1],#4;將[R1]中數(shù)據(jù)放入R0寄存器,更新R1為R1+4偏移量方法不更新基址寄存器事先更新(前變址)(前索引)事后更新(后變址)(后索引)偏移量方法LDRR0,[R1,R2,LSL#2];R0←[R1+R2*4],R1不變事先更新基址(前索引)(前變址)

操作之前,先改變基址寄存器。LDRR0,[R1,R2,LSL#2]!;R0←[R1+R2*4],更新R1為R1+R2*4事后更新基址(后索引)(后變址)操作之后,再改變基址寄存器。LDRR0,[R1],R2,LSL#2;R0←[R1],更新R1為R1+R2*4舉例:這里R1為基址寄存器地址=基址+偏移地址PreorPostIndexedstore尋址I=0,立即數(shù)偏移I=1,寄存器偏移P=1,偏移量/前索引P=0,后索引U=1,加偏移U=0,減偏移W=1,后綴有!回寫基址寄存器W=0,后綴無!不回寫基址寄存器B=1,對字節(jié)進行操作B=0,對字進行操作L=0,存儲操作L=1,加載操作LOAD/STORE指令中出現(xiàn)的位(34頁*1):2.2ARM處理器尋址方式尋址方式分類

尋址方式是尋找真實操作數(shù)地址的方式。ARM處理器具有5種基本尋址方式。數(shù)據(jù)處理指令的操作數(shù)的尋址方式字及無符號字節(jié)的Load/Store指令的尋址方式雜類Load/Store指令的尋址方方式(見教材)批量Load/Store指令的尋址方式協(xié)處理器Load/Store指令的尋址方式2.2ARM處理器尋址方式尋址方式分類

尋址方式是尋找真實操作數(shù)地址的方式。ARM處理器具有5種基本尋址方式。數(shù)據(jù)處理指令的操作數(shù)的尋址方式字及無符號字節(jié)的Load/Store指令的尋址方式雜類Load/Store指令的尋址方方式(見教材)批量Load/Store指令的尋址方式協(xié)處理器Load/Store指令的尋址方式批量Load/Store指令的尋址方式多(批量)寄存器尋址 先增加地址(IB):STMIB,LDMIB;每次傳送前指針加4

后增加地址(IA):STMIA,LDMIA;每次傳送后指針加4

先減少地址(DB):STMDB,LDMDB;每次傳送前指針減4

后減少地址(DA):STMDA,LDMDA;每次傳送后指針減4

I:Increment

D:Decrement

B:Before

A:Afterr10+4r10r10+8r10+cAddressing_mode為IA、IB、DA、DB其中xx為IA、IB、DA、DBr10+4r10+8r10+cAddressing_mode為IA、IB、DA、DB其中xx為IA、IB、DA、DBdata7data5data3data5data3data3data1data5data9data8data4data6r4

r1r0r4

r1r0r102.2ARM處理器尋址方式尋址方式分類——堆棧尋址棧底棧頂棧區(qū)SP

堆棧存儲區(qū)棧頂棧底棧區(qū)

SP向下增長向上增長0x123456780x12345678堆棧壓棧堆棧壓棧Ascending

棧Descending

棧高地址高地址低地址低地址增減棧頂SP

棧頂SP

棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿(Full)堆棧;堆棧指針指向下一個待壓入數(shù)據(jù)的空(Empty)位置,稱為空堆棧。2.2ARM處理器尋址方式尋址方式分類——堆棧尋址0x123456780x12345678棧頂SP

0x12345678棧頂SP

壓棧壓棧所以可以組合出四種類型的堆棧方式(須注意皆指入棧):滿遞增:堆棧向上增長,堆棧指針指向最高有效數(shù)據(jù)項。指令如STMFA、LDMFA等;空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如STMEA、LDMEA等;滿遞減:堆棧向下增長,堆棧指針指向最低有效數(shù)據(jù)項。指令如STMFD、LDMFD等;空遞減:堆棧向下增長,堆棧指針指向堆棧下的第一個空位置。指令如STMED、LDMED等。2.2ARM處理器尋址方式尋址方式分類——堆棧尋址2.2ARM處理器尋址方式多(批量)寄存器尋址和堆棧尋址之間的關系增長先后入棧時堆棧向上生長入棧時堆棧向下生長滿空滿空增加之前STMIBSTMFALDMIBLDMED之后STMIASTMEALDMIALDMFD減少之前LDMDBLDMEASTMDBSTMFD之后LDMDALDMFASTMDASTMEDSTMFAr13!,{r0-r5};←PushontoaFullAscendingStackLDMFAr13!,{r0-r5};→PopfromaFullAscendingStackSTMFDr13!,{r0-r5};←

PushontoaFullDescendingStackLDMFDr13!,{r0-r5};→PopfromaFullDescendingStackSTMEAr13!,{r0-r5};←PushontoanEmptyAscendingStackLDMEAr13!,{r0-r5};→PopfromanEmptyAscendingStackSTMEDr13!,{r0-r5};←PushontoEmptyDescendingStackLDMEDr13!,{r0-r5};→PopfromanEmptyDescendingStack2.2ARM處理器尋址方式高地址低地址2.2ARM處理器尋址方式尋址方式分類

尋址方式是尋找真實操作數(shù)地址的方式。ARM處理器具有5種基本尋址方式。數(shù)據(jù)處理指令的操作數(shù)的尋址方式字及無符號字節(jié)的Load/Store指令的尋址方式雜類Load/Store指令的尋址方方式(見教材)批量Load/Store指令的尋址方式協(xié)處理器Load/Store指令的尋址方式數(shù)據(jù)塊傳送存儲堆棧操作壓棧數(shù)據(jù)塊傳送加載堆棧操作出棧STMDASTMEDLDMDALDMFASTMIASTMEALDMIALDMFDSTMDBSTMFDLDMDBLDMEASTMIBSTMFALDMIBLDMED;使用數(shù)據(jù)塊傳送指令進行堆棧操作STMDB R0!,{R5-R7}...LDMIA R0!,{R5-R7};使用堆棧指令進行堆棧操作STMFD R0!,{R5-R7}...LDMFD R0!,{R5-R7}

兩段代碼的執(zhí)行結果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡單(只要前后后綴一致即可),而使用數(shù)據(jù)塊指令進行壓棧和出棧操作則需要考慮空與滿、加與減對應的問題。堆棧操作和數(shù)據(jù)塊傳送指令類似,也有4種模式,它們之間的關系如下表

溫馨提示

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

評論

0/150

提交評論