版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章ARM指令集尋址方式ARM嵌入式系統(tǒng)結(jié)構(gòu)與編程內(nèi)容提要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個(gè)字節(jié),其指令長度為32位
cond(bit[31:28])
指令執(zhí)行的條件碼type(bit[27:26]) 指令類型碼
opcode(bit[24:21]) 指令操作碼;
S (bit[20]) 決定指令的操作結(jié)果是否影響CPSR;
Rn
(bit[19:16]) 包含第一個(gè)操作數(shù)的寄存器編碼;Rd(bit[15:12]) 目標(biāo)寄存器編碼;
Operand2(bit[11:0) 指令第二個(gè)操作數(shù)。ARM匯編指令語法格式:<opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>例:ADDR0,R1,R2;R0R1+R2
MULSR3,R2,R1
;R3R2×R1,同時(shí)設(shè)置CPSRtype(bit[27:26])描述00數(shù)據(jù)處理指令及雜類Load/Store指令01Load/Store指令10批量Load/Store指令及分支指令11協(xié)處理指令與軟中斷指令指令條件碼0000EQ相等 Z=10001NE不相等 Z=00010CS/HS無符號(hào)大于等于 C=10011CC/LO無等號(hào)小于 C=00100MI負(fù)數(shù) N=10101PL非負(fù)數(shù) N=00110VS上溢出 V=10111VC沒有上溢出 V=01000HI無符號(hào)數(shù)大于 C=1且Z=01001LS無符號(hào)小于等于C=0或Z=11010GE有符號(hào)數(shù)大于等于 N=1且V=1或N=0且V=01011LT有符號(hào)數(shù)小于 N=1且V=0或N=0且V=11100GT有符號(hào)數(shù)大于 Z=0且N=V1101LE有符號(hào)數(shù)小于/等于 Z=1或N!=V1110AL無條件執(zhí)行3.2數(shù)據(jù)處理指令尋址方式數(shù)據(jù)處理指令第2操作數(shù)的構(gòu)成方式具體尋址類型數(shù)據(jù)處理指令第2操作數(shù)的構(gòu)成方式立即數(shù)方式每個(gè)立即數(shù)由一個(gè)8位的常數(shù)進(jìn)行32位循環(huán)右移偶數(shù)位得到,其中循環(huán)右移的位數(shù)由一個(gè)4位二進(jìn)制的兩倍表示。即:<immediate>=immed_8進(jìn)行32位循環(huán)右移(2*rotate_4)位在ARM數(shù)據(jù)處理指令中,當(dāng)參與操作的第2操作數(shù)為立即數(shù)時(shí),每個(gè)立即數(shù)都是采用一個(gè)8bit的常數(shù)循環(huán)右移偶數(shù)位而間接得到,其中循環(huán)右移的位數(shù)由一個(gè)4bit二進(jìn)制的兩倍表示。注意,如果一個(gè)32bit立即數(shù)直接用在32bit指令編碼中,就有可能完全占據(jù)32bit編碼空間,而使指令的操作碼等無法在編碼中實(shí)現(xiàn)。如何判斷一個(gè)數(shù)是否是合法立即數(shù)首先將這個(gè)數(shù)轉(zhuǎn)換為32bit16進(jìn)制形式,例如218=0xDA=0x000000DA除零外,僅有一位數(shù)為合法立即數(shù)。除零外,僅有二位數(shù),并且相鄰(包括首尾,如0x1000000A)的為合法立即數(shù)。除零外,僅有三位數(shù),并且相鄰(包括中間有0相間,例如0x10800000,包括首尾相鄰,如:0x14000003),這三位數(shù)中,最高位取值僅能為1、2、3,最低位取值僅能為4、8、C,中間位0x0~0xF。這種組合的為合法立即數(shù)。除了以上三種,其他基本是非法立即數(shù)。判斷一個(gè)數(shù)是否符合8位位圖的原則,首先看這個(gè)數(shù)的二進(jìn)制表示中1的個(gè)數(shù)是否不超過8個(gè).如果不超過8個(gè),再看這n個(gè)1(n<=8)是否能同時(shí)放到8個(gè)二進(jìn)制位中,如果可以放進(jìn)去,再看這八個(gè)二進(jìn)制位是否可以循環(huán)右移偶數(shù)位得到我們欲使用的數(shù).如果可以,則此數(shù)符合8位位圖原理,是合法的立即數(shù).否則,不符合。無法表示的32位數(shù),只有通過邏輯或算術(shù)運(yùn)算等其它途徑獲得了.比如0xffffff00,可以通過0x000000ff按位取反得到。編程中,時(shí)刻檢查用到的第二操作數(shù)是否符合8位位圖是一件不能疏忽的事。3.2數(shù)據(jù)處理指令尋址方式數(shù)據(jù)處理指令第2操作數(shù)的構(gòu)成方式:立即數(shù)方式寄存器方式寄存器移位方式具體尋址類型1.第二操作數(shù)為立即數(shù)匯編語法格式:#<immediate>例:MOVR0,#0xFC0;R00xFC0
2.第二操作數(shù)為寄存器匯編語法格式:<Rm>例:ADDR0,R1,R2;R0R1+R23.第二操作數(shù)為寄存器移位方式,且移位的位數(shù)為一個(gè)5位的立即數(shù)匯編語法格式:<Rm>,<shift>#<shift_imm>例:MOVR0,R0,LSL#n;R0R0*2n其中,shift表示移位類型編碼,bit5用H表示,bit6用S表示,其描述如表SH描述00邏輯左移LSL01邏輯右移LSR10算術(shù)右移ASR11循環(huán)右移ROR4.第二操作數(shù)為寄存器移位方式,且移位數(shù)值放在寄存器中匯編語法格式:<Rm>,<shift><Rs>5.第二操作數(shù)為寄存器進(jìn)行RRX移位得到匯編語法格式:<Rm>,RRX3.3Load/Store指令尋址Load/Store指令是對內(nèi)存進(jìn)行存儲(chǔ)/加載數(shù)據(jù)操作的指令,根據(jù)訪問的數(shù)據(jù)格式的不同,將這類指令的尋址分為字、無符號(hào)字節(jié)的Load/Store指令尋址和半字、有符號(hào)字節(jié)Load/Store指令尋址兩大類。地址計(jì)算方法
1.寄存器間接尋址
寄存器間接尋址就是以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)器中。例如以下指令:
LDR R0,[R1] ;R0←[R1]
STR R0,[R1] ;[R1]←R0
2.基址加變址尋址基址加變址尋址即將寄存器的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個(gè)操作數(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ù)訪問存儲(chǔ)單元和基地址寄存器更新的先后順序可以將基址加變址尋址分為兩種(1)前變址法,基地址寄存器中的值和地址偏移量先做加減運(yùn)算,生成的操作數(shù)作為內(nèi)存訪問的地址。(2)后變址法,將基地址寄存器中的值直接作為內(nèi)存訪問的地址進(jìn)行操作,內(nèi)存訪問完畢后基地址寄存器中的值和地址偏移量做加減運(yùn)算,并更新基地址寄存器。字、無符號(hào)字節(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>偏移量為寄存器的指令編碼類型對應(yīng)關(guān)系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偏移量為移位寄存器的指令編碼類型對應(yīng)關(guān)系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半字、有符號(hào)字節(jié)尋址這類指令可用來加載有符號(hào)字節(jié)、加載有符號(hào)半字、加載/存儲(chǔ)無符號(hào)半字。Load/Store指令對半字、有符號(hào)字節(jié)操作指令編碼格式如下:半字、有符號(hào)字節(jié)尋址加載有符號(hào)字節(jié)到寄存器:LDR{<cond>}SB<Rd>,<addressing_mode>加載有符號(hào)半字到寄存器:LDR{<cond>}SH<Rd>,<addressing_mode>加載無符號(hào)半字到寄存器:LDR{<cond>}H<Rd>,<addressing_mode>存儲(chǔ)無符號(hào)半字到內(nèi)存: 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有符號(hào)擴(kuò)展為32位
LDRHR2,[R1,#-4];R2←[R1-4]半字,R2高16位清零STRHR0,[R1,#4]!;[R1+4]←R0低16位,R1=R1+4LDRSHR0,[R1],#4;R0←[R1]半字,R0有符號(hào)擴(kuò)展為32位
;且R1=R1+42.Addressing_mode中的偏移量為寄存器的值 前變址不回寫形式: [<Rn>,+/-<Rm>]前變址回寫形式: [<Rn>,+/-<Rm>]!后變址回寫形式:
[<Rn>],+/-<Rm>偏移量為寄存器值的指令編碼類型對應(yīng)關(guān)系WP 匯編語法格式01 [<Rn>,+/-<Rm>]10 [<Rn>],+/-<Rm>11 [<Rn>,+/-<Rm>]!2.Addressing_mode中的偏移量為寄存器的值LDRSBR0,[R1,R5];R0←[R1+R5]字節(jié),R0有符號(hào)擴(kuò)展為32位
LDRHR2,[R1,-R5];R2←[R1-R5]半字,R2高16位清零STRHR0,[R1,R5]!;[R1+R5]←R0低16位,R1=R1+R5LDRSHR0,[R1],R5;R0←[R1]半字,R0有符號(hào)擴(kuò)展為32位
;且R1=R1+R53.4批量Load/Store指令尋址方式ARM指令系統(tǒng)提供了批量Load/Store指令尋址方式,即通常所說的多寄存器尋址,也就是一次可以傳送幾個(gè)寄存器的值,允許一條指令最多傳送16個(gè)寄存器。編碼格式批量加載:LDM{<cond>}<addr_mode><Rn>{!},<register>{^}批量存儲(chǔ):STM{<cond>}<addr_mode><Rn>{!},<register>{^}地址變化方式內(nèi)存地址塊的基地址要加載或存儲(chǔ)的寄存器列表register_list表示要加載或存儲(chǔ)的寄存器列表,bit[15:0]可以表示16個(gè)寄存器,如果某位為1,則該位的位置作為寄存器的編號(hào),此寄存器參預(yù)加載或存儲(chǔ)。S用于恢復(fù)CPSR和強(qiáng)制用戶位。當(dāng)程序計(jì)數(shù)器PC包含在LDM指令的register_list中,且S為1時(shí),則當(dāng)前模式的SPSR被拷貝到CPSR中,使處理器的程序返回和狀態(tài)的恢復(fù)成為一個(gè)原子操作。如果register_list中不包含程序計(jì)數(shù)器PC,S為1則加載或存儲(chǔ)的是用戶模式下的寄存器組。注意事項(xiàng):*指令中寄存器和連續(xù)內(nèi)存地址單元的對應(yīng)關(guān)系:編號(hào)低的寄存器對應(yīng)內(nèi)存低地址單元,編號(hào)高的寄存器對應(yīng)內(nèi)存高地址單元。內(nèi)存操作后增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):當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí);空堆棧(EmptyStack):當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置時(shí);根據(jù)堆棧的生成方式,又可以分為遞增堆棧和遞減堆棧:遞增堆棧(AscendingStack):當(dāng)堆棧由低地址向高地址生成時(shí);遞減堆棧(DecendingStack):當(dāng)堆棧由高地址向低地址生成時(shí);滿遞增堆棧FA滿遞減堆棧FD空遞增堆棧EA空遞減堆棧EDLDM{<cond>}<addr_mode><Rn>{!},<register>{^}STM{<cond>}<addr_mode><Rn>{!},<register>{^}堆棧操作滿堆棧(FullStack):當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí);空堆棧(EmptyStack):當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置時(shí);根據(jù)堆棧的生成方式,又可以分為遞增堆棧和遞減堆棧:遞增堆棧(AscendingStack):當(dāng)堆棧由低地址向高地址生成時(shí);遞減堆棧(DecendingStack):當(dāng)堆棧由高地址向低地址生成時(shí);塊拷貝與棧操作的對應(yīng)關(guān)系STMIAR9!,{R0,R1,R5}STMIBR9!,{R0,R1,R5}STMDAR9!,{R0,R1,R5}STMDBR9!,{R0,R1,R5}例:LDMIAR0,{R5-R8}
;將內(nèi)存單元[R0]~[R0+15]以字為單位讀到R5~R8中STMFDR13!,{R0,R3-R10,LR}
;將寄存器(R0,R3-R10,LR)內(nèi)容壓入堆棧LDMFDR13!,{R0,R3-R10,PC};將堆棧內(nèi)容恢復(fù)到寄存器(R0,R3-R10,PC)3.5協(xié)處理器指令尋址方式<opcode>{<cond>}{L}<coproc>,<CRd>,<addressing_mode>其中:opcode為指令操作碼;coproc為協(xié)處理器名稱;addressing_mode為指令尋址模式。CRd作為目標(biāo)寄存器的協(xié)處理器寄存器。1.內(nèi)存地址索引格式前變址不回寫形式: [<Rn>,#+/-<imm_offset8>*4]前變址回寫形式: [<Rn>,#+/-<imm_offset8>*4]!后變址回寫形式: [<Rn>],#+/-<imm_offset8>*42.內(nèi)存地址非索引格式這種指令尋址匯編語法格式為[<Rn>],<user-define> 協(xié)處理器數(shù)據(jù)處理指令的尋址方式協(xié)處理器數(shù)據(jù)處理指令的尋址方式主要通過寄存器尋址,根據(jù)寄存器編碼來查找相應(yīng)的寄存器,這部分內(nèi)容在指令系統(tǒng)中進(jìn)行詳細(xì)介紹。例:LDCP3
,CR4
,[R0];將ARM處理器的寄存器R0所指向;的存儲(chǔ)器的字?jǐn)?shù)據(jù)傳送到協(xié)處理器P3的CR4寄存器中STCP5,CR1,[R0,#4];將協(xié)處理器P5的CR1寄存器的值;寫入到ARM處理器的寄存器R0+4所指向的存儲(chǔ)器的字?jǐn)?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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 民航機(jī)場項(xiàng)目總工面試題庫
- 實(shí)木復(fù)合門建設(shè)項(xiàng)目可行性分析報(bào)告(總投資6000萬元)
- 物聯(lián)網(wǎng)平臺(tái)開發(fā)工程師面試題集
- 感應(yīng)熱處理機(jī)床建設(shè)項(xiàng)目可行性分析報(bào)告(總投資3000萬元)
- 災(zāi)害預(yù)防工程師面試題及答案
- 深度解析(2026)《GBT 18866-2017橡膠 酸消化溶解法》
- 通信行業(yè)成本會(huì)計(jì)實(shí)務(wù)面試問題及答案
- 深度解析(2026)《GBT 18714.3-2003信息技術(shù) 開放分布式處理 參考模型 第3部分體系結(jié)構(gòu)》
- 年產(chǎn)xxx低噪聲風(fēng)機(jī)箱項(xiàng)目可行性分析報(bào)告
- 數(shù)據(jù)庫管理員崗位招聘面試題集
- 中建epc人防工程施工方案
- 物業(yè)公司業(yè)主投訴處理和回訪制度(3篇)
- 團(tuán)員證明模板(周五)
- 頸椎病的手術(shù)治療方法
- 野性的呼喚讀書分享
- 極簡化改造實(shí)施規(guī)范
- 科研方法論智慧樹知到期末考試答案章節(jié)答案2024年南開大學(xué)
- DBJ51-T 139-2020 四川省玻璃幕墻工程技術(shù)標(biāo)準(zhǔn)
- 一帶一路教學(xué)課件教學(xué)講義
- 工廠蟲害控制分析總結(jié)報(bào)告
- 廣東省消防安全重點(diǎn)單位消防檔案
評論
0/150
提交評論