第3章 ARM指令集尋址方式_第1頁
第3章 ARM指令集尋址方式_第2頁
第3章 ARM指令集尋址方式_第3頁
第3章 ARM指令集尋址方式_第4頁
第3章 ARM指令集尋址方式_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章ARM指令集尋址方式ARM嵌入式系統(tǒng)結構與編程內容提要3.1ARM指令的編碼格式3.2數(shù)據(jù)處理指令尋址方式3.3Load/Store指令尋址3.4批量Load/Store指令尋址方式3.5協(xié)處理器指令尋址方式第3章ARM指令集尋址方式ARM指令尋址方式可分為四大類:數(shù)據(jù)處理指令尋址Load/Store指令的尋址批量Load/Store指令的尋址協(xié)處理指令尋址3.1ARM指令的編碼格式每條ARM指令占有4個字節(jié),其指令長度為32位

cond(bit[31:28])

指令執(zhí)行的條件碼type(bit[27:26]) 指令類型碼

opcode(bit[24:21]) 指令操作碼;

S (bit[20]) 決定指令的操作結果是否影響CPSR;

Rn

(bit[19:16]) 包含第一個操作數(shù)的寄存器編碼;Rd(bit[15:12]) 目標寄存器編碼;

Operand2(bit[11:0) 指令第二個操作數(shù)。ARM匯編指令語法格式:<opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>例:ADDR0,R1,R2;R0R1+R2

MULSR3,R2,R1

;R3R2×R1,同時設置CPSRtype(bit[27:26])描述00數(shù)據(jù)處理指令及雜類Load/Store指令01Load/Store指令10批量Load/Store指令及分支指令11協(xié)處理指令與軟中斷指令指令條件碼0000EQ相等 Z=10001NE不相等 Z=00010CS/HS無符號大于等于 C=10011CC/LO無等號小于 C=00100MI負數(shù) N=10101PL非負數(shù) N=00110VS上溢出 V=10111VC沒有上溢出 V=01000HI無符號數(shù)大于 C=1且Z=01001LS無符號小于等于C=0或Z=11010GE有符號數(shù)大于等于 N=1且V=1或N=0且V=01011LT有符號數(shù)小于 N=1且V=0或N=0且V=11100GT有符號數(shù)大于 Z=0且N=V1101LE有符號數(shù)小于/等于 Z=1或N!=V1110AL無條件執(zhí)行3.2數(shù)據(jù)處理指令尋址方式數(shù)據(jù)處理指令第2操作數(shù)的構成方式具體尋址類型數(shù)據(jù)處理指令第2操作數(shù)的構成方式立即數(shù)方式每個立即數(shù)由一個8位的常數(shù)進行32位循環(huán)右移偶數(shù)位得到,其中循環(huán)右移的位數(shù)由一個4位二進制的兩倍表示。即:<immediate>=immed_8進行32位循環(huán)右移(2*rotate_4)位在ARM數(shù)據(jù)處理指令中,當參與操作的第2操作數(shù)為立即數(shù)時,每個立即數(shù)都是采用一個8bit的常數(shù)循環(huán)右移偶數(shù)位而間接得到,其中循環(huán)右移的位數(shù)由一個4bit二進制的兩倍表示。注意,如果一個32bit立即數(shù)直接用在32bit指令編碼中,就有可能完全占據(jù)32bit編碼空間,而使指令的操作碼等無法在編碼中實現(xiàn)。如何判斷一個數(shù)是否是合法立即數(shù)首先將這個數(shù)轉換為32bit16進制形式,例如218=0xDA=0x000000DA除零外,僅有一位數(shù)為合法立即數(shù)。除零外,僅有二位數(shù),并且相鄰(包括首尾,如0x1000000A)的為合法立即數(shù)。除零外,僅有三位數(shù),并且相鄰(包括中間有0相間,例如0x10800000,包括首尾相鄰,如:0x14000003),這三位數(shù)中,最高位取值僅能為1、2、3,最低位取值僅能為4、8、C,中間位0x0~0xF。這種組合的為合法立即數(shù)。除了以上三種,其他基本是非法立即數(shù)。判斷一個數(shù)是否符合8位位圖的原則,首先看這個數(shù)的二進制表示中1的個數(shù)是否不超過8個.如果不超過8個,再看這n個1(n<=8)是否能同時放到8個二進制位中,如果可以放進去,再看這八個二進制位是否可以循環(huán)右移偶數(shù)位得到我們欲使用的數(shù).如果可以,則此數(shù)符合8位位圖原理,是合法的立即數(shù).否則,不符合。無法表示的32位數(shù),只有通過邏輯或算術運算等其它途徑獲得了.比如0xffffff00,可以通過0x000000ff按位取反得到。編程中,時刻檢查用到的第二操作數(shù)是否符合8位位圖是一件不能疏忽的事。3.2數(shù)據(jù)處理指令尋址方式數(shù)據(jù)處理指令第2操作數(shù)的構成方式:立即數(shù)方式寄存器方式寄存器移位方式具體尋址類型1.第二操作數(shù)為立即數(shù)匯編語法格式:#<immediate>例:MOVR0,#0xFC0;R00xFC0

2.第二操作數(shù)為寄存器匯編語法格式:<Rm>例:ADDR0,R1,R2;R0R1+R23.第二操作數(shù)為寄存器移位方式,且移位的位數(shù)為一個5位的立即數(shù)匯編語法格式:<Rm>,<shift>#<shift_imm>例:MOVR0,R0,LSL#n;R0R0*2n其中,shift表示移位類型編碼,bit5用H表示,bit6用S表示,其描述如表SH描述00邏輯左移LSL01邏輯右移LSR10算術右移ASR11循環(huán)右移ROR4.第二操作數(shù)為寄存器移位方式,且移位數(shù)值放在寄存器中匯編語法格式:<Rm>,<shift><Rs>5.第二操作數(shù)為寄存器進行RRX移位得到匯編語法格式:<Rm>,RRX3.3Load/Store指令尋址Load/Store指令是對內存進行存儲/加載數(shù)據(jù)操作的指令,根據(jù)訪問的數(shù)據(jù)格式的不同,將這類指令的尋址分為字、無符號字節(jié)的Load/Store指令尋址和半字、有符號字節(jié)Load/Store指令尋址兩大類。地址計算方法

1.寄存器間接尋址

寄存器間接尋址就是以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲器中。例如以下指令:

LDR R0,[R1] ;R0←[R1]

STR R0,[R1] ;[R1]←R0

2.基址加變址尋址基址加變址尋址即將寄存器的內容與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地址。常用于訪問某基地址附近的地址單元。LDRR0,[R1,#4];R0←[R1+4]

LDRR0,[R1,#4]!;R0←[R1+4],R1=R1+4LDRR0,[R1],#4;R0←[R1],R1=R1+4LDRR0,[R1,R2];R0←[R1+R2]

根據(jù)訪問存儲單元和基地址寄存器更新的先后順序可以將基址加變址尋址分為兩種(1)前變址法,基地址寄存器中的值和地址偏移量先做加減運算,生成的操作數(shù)作為內存訪問的地址。(2)后變址法,將基地址寄存器中的值直接作為內存訪問的地址進行操作,內存訪問完畢后基地址寄存器中的值和地址偏移量做加減運算,并更新基地址寄存器。字、無符號字節(jié)尋址匯編指令語法格式為:LDR{<cond>}{B}{T}<Rd>,<addressing_mode>STR{<cond>}{B}{T}<Rd>,<addressing_mode>1.Addressing_mode中的偏移量為立即數(shù)前變址不回寫形式:[<Rn>,#+/-<immed_offset>]前變址回寫形式: [<Rn>,#+/-<immed_offset>]!后變址回寫形式: [<Rn>],#+/-<immed_offset>偏移量為立即數(shù)的指令編碼類型WP 匯編語法格式01 [<Rn>,#+/-<immed_offset>]10 [<Rn>],#+/-<immed_offset>11 [<Rn>,#+/-<immed_offset>]!1.Addressing_mode中的偏移量為立即數(shù)例:LDRR0,[R1,#4];R0←[R1+4]

LDRR0,[R1,#-4];R0←[R1-4]LDRR0,[R1,#4]!;R0←[R1+4],R1=R1+4LDRR0,[R1],#4;R0←[R1],R1=R1+42.Addressing_mode中的偏移量為寄存器的值前變址不回寫形式:[<Rn>,+/-<Rm>]前變址回寫形式: [<Rn>,+/-<Rm>]!后變址回寫形式: [<Rn>],+/-<Rm>偏移量為寄存器的指令編碼類型對應關系WP 匯編語法格式01 [<Rn>,+/-<Rm>]10 [<Rn>],+/-<Rm>11 [<Rn>,+/-<Rm>]!2.Addressing_mode中的偏移量為寄存器的值例:LDRR0,[R1,R2];R0←[R1+R2]LDRR0,[R1,-R2];R0←[R1-R2]LDRR0,[R1,R2]!;R0←[R1+R2],R1=R1+R2LDRR0,[R1],R2;R0←[R1],R1=R1+R23.Addressing_mode中的偏移量通過寄存器移位得到前變址不回寫形式:[<Rn>,+/-<Rm>,<shift>#shift_amount]前變址回寫形式: [<Rn>,+/-<Rm>,<shift>#shift_amount]!后變址回寫形式:[<Rn>],+/-<Rm>,<shift>#shift_amount偏移量為移位寄存器的指令編碼類型對應關系WP 匯編語法格式01 [<Rn>,+/-<Rm>,<shift>#shift_amount]10 [<Rn>],+/-<Rm>,<shift>#shift_amount11 [<Rn>,+/-<Rm>,<shift>#shift_amount]!3.Addressing_mode中的偏移量通過寄存器移位得到例:LDRR0,[R1,R2,LSL#2];R0←[R1+R2*4]LDRR0,[R1,R2,LSL#2]!;R0←[R1+R2*4],

;且R1=

R1+R2*4LDRR0,[R1],R2,LSL#2;R0←[R1],

;且R1=

R1+R2*4半字、有符號字節(jié)尋址這類指令可用來加載有符號字節(jié)、加載有符號半字、加載/存儲無符號半字。Load/Store指令對半字、有符號字節(jié)操作指令編碼格式如下:半字、有符號字節(jié)尋址加載有符號字節(jié)到寄存器:LDR{<cond>}SB<Rd>,<addressing_mode>加載有符號半字到寄存器:LDR{<cond>}SH<Rd>,<addressing_mode>加載無符號半字到寄存器:LDR{<cond>}H<Rd>,<addressing_mode>存儲無符號半字到內存: STR{<cond>}H<Rd>,<addressing_mode>1.Addressing_mode中的偏移量為立即數(shù) 前變址不回寫形式:[<Rn>,#+/-<immed_offset8>]前變址回寫形式:[<Rn>,#+/-<immed_offset8>]!后變址回寫形式: [<Rn>],#+/-<immed_offset8>偏移量為立即數(shù)的指令編碼類型WP 匯編語法格式01 [<Rn>,#+/-<immed_offset8>]10 [<Rn>],#+/-<immed_offset8>11 [<Rn>,#+/-<immed_offset8>]!1.Addressing_mode中的偏移量為立即數(shù) LDRSBR0,[R1,#4];R0←[R1+4]字節(jié),R0有符號擴展為32位

LDRHR2,[R1,#-4];R2←[R1-4]半字,R2高16位清零STRHR0,[R1,#4]!;[R1+4]←R0低16位,R1=R1+4LDRSHR0,[R1],#4;R0←[R1]半字,R0有符號擴展為32位

;且R1=R1+42.Addressing_mode中的偏移量為寄存器的值 前變址不回寫形式: [<Rn>,+/-<Rm>]前變址回寫形式: [<Rn>,+/-<Rm>]!后變址回寫形式:

[<Rn>],+/-<Rm>偏移量為寄存器值的指令編碼類型對應關系WP 匯編語法格式01 [<Rn>,+/-<Rm>]10 [<Rn>],+/-<Rm>11 [<Rn>,+/-<Rm>]!2.Addressing_mode中的偏移量為寄存器的值LDRSBR0,[R1,R5];R0←[R1+R5]字節(jié),R0有符號擴展為32位

LDRHR2,[R1,-R5];R2←[R1-R5]半字,R2高16位清零STRHR0,[R1,R5]!;[R1+R5]←R0低16位,R1=R1+R5LDRSHR0,[R1],R5;R0←[R1]半字,R0有符號擴展為32位

;且R1=R1+R53.4批量Load/Store指令尋址方式ARM指令系統(tǒng)提供了批量Load/Store指令尋址方式,即通常所說的多寄存器尋址,也就是一次可以傳送幾個寄存器的值,允許一條指令最多傳送16個寄存器。編碼格式批量加載:LDM{<cond>}<addr_mode><Rn>{!},<register>{^}批量存儲:STM{<cond>}<addr_mode><Rn>{!},<register>{^}地址變化方式內存地址塊的基地址要加載或存儲的寄存器列表register_list表示要加載或存儲的寄存器列表,bit[15:0]可以表示16個寄存器,如果某位為1,則該位的位置作為寄存器的編號,此寄存器參預加載或存儲。S用于恢復CPSR和強制用戶位。當程序計數(shù)器PC包含在LDM指令的register_list中,且S為1時,則當前模式的SPSR被拷貝到CPSR中,使處理器的程序返回和狀態(tài)的恢復成為一個原子操作。如果register_list中不包含程序計數(shù)器PC,S為1則加載或存儲的是用戶模式下的寄存器組。注意事項:*指令中寄存器和連續(xù)內存地址單元的對應關系:編號低的寄存器對應內存低地址單元,編號高的寄存器對應內存高地址單元。內存操作后增IA(IncrementAfter):每次數(shù)據(jù)傳送后地址加4;先增IB(IncrementBefore):每次數(shù)據(jù)傳送前地址加4;后減DA(DecrementAfter):每次數(shù)據(jù)傳送后地址減4;先減DB(DecrementBefore):每次數(shù)據(jù)傳送前地址減4;

LDM{<cond>}<addr_mode><Rn>{!},<register>{^}STM{<cond>}<addr_mode><Rn>{!},<register>{^}堆棧操作滿堆棧(FullStack):當堆棧指針指向最后壓入堆棧的數(shù)據(jù)時;空堆棧(EmptyStack):當堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時;根據(jù)堆棧的生成方式,又可以分為遞增堆棧和遞減堆棧:遞增堆棧(AscendingStack):當堆棧由低地址向高地址生成時;遞減堆棧(DecendingStack):當堆棧由高地址向低地址生成時;滿遞增堆棧FA滿遞減堆棧FD空遞增堆棧EA空遞減堆棧EDLDM{<cond>}<addr_mode><Rn>{!},<register>{^}STM{<cond>}<addr_mode><Rn>{!},<register>{^}堆棧操作滿堆棧(FullStack):當堆棧指針指向最后壓入堆棧的數(shù)據(jù)時;空堆棧(EmptyStack):當堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時;根據(jù)堆棧的生成方式,又可以分為遞增堆棧和遞減堆棧:遞增堆棧(AscendingStack):當堆棧由低地址向高地址生成時;遞減堆棧(DecendingStack):當堆棧由高地址向低地址生成時;塊拷貝與棧操作的對應關系STMIAR9!,{R0,R1,R5}STMIBR9!,{R0,R1,R5}STMDAR9!,{R0,R1,R5}STMDBR9!,{R0,R1,R5}例:LDMIAR0,{R5-R8}

;將內存單元[R0]~[R0+15]以字為單位讀到R5~R8中STMFDR13!,{R0,R3-R10,LR}

;將寄存器(R0,R3-R10,LR)內容壓入堆棧LDMFDR13!,{R0,R3-R10,PC};將堆棧內容恢復到寄存器(R0,R3-R10,PC)3.5協(xié)處理器指令尋址方式<opcode>{<cond>}{L}<coproc>,<CRd>,<addressing_mode>其中:opcode為指令操作碼;coproc為協(xié)處理器名稱;addressing_mode為指令尋址模式。CRd作為目標寄存器的協(xié)處理器寄存器。1.內存地址索引格式前變址不回寫形式: [<Rn>,#+/-<imm_offset8>*4]前變址回寫形式: [<Rn>,#+/-<imm_offset8>*4]!后變址回寫形式: [<Rn>],#+/-<imm_offset8>*42.內存地址非索引格式這種指令尋址匯編語法格式為[<Rn>],<user-define> 協(xié)處理器數(shù)據(jù)處理指令的尋址方式協(xié)處理器數(shù)據(jù)處理指令的尋址方式主要通過寄存器尋址,根據(jù)寄存器編碼來查找相應的寄存器,這部分內容在指令系統(tǒng)中進行詳細介紹。例:LDCP3

,CR4

,[R0];將ARM處理器的寄存器R0所指向;的存儲器的字數(shù)據(jù)傳送到協(xié)處理器P3的CR4寄存器中STCP5,CR1,[R0,#4];將協(xié)處理器P5的CR1寄存器的值;寫入到ARM處理器的寄存器R0+4所指向的存儲器的字數(shù)據(jù)單元尋址方式舉例1.立即尋址ADDR0,R0,#1 ;R0R0+1ANDR8,R7,#0xFF;R8 R7AND0xFF2.寄存器尋址ADDR0,R1,R2 ;R0R1+R2ADDR3,R2,R1,LSR#2;R3R2+R1/4ADDR3,

溫馨提示

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

評論

0/150

提交評論