EMPUCh3指令系統(tǒng).ppt
《EMPUCh3指令系統(tǒng).ppt》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《EMPUCh3指令系統(tǒng).ppt(245頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第3章ARM指令集,ARM指令系統(tǒng),指令系統(tǒng)簡(jiǎn)介,ARM處理器是基于精簡(jiǎn)指令集計(jì)算機(jī)(RISC)原理設(shè)計(jì)的,指令集和相關(guān)譯碼機(jī)制較為簡(jiǎn)單。ARM具有32位ARM指令集和16位Thumb指令集;ARM指令集效率高,但是代碼密度低;Thumb指令集是ARM指令集的子集。Thumb2是ARM指令集和Thumb指令集的融合。所有的ARM指令都是可以有條件執(zhí)行的,而Thumb指令僅有一條指令具備條件執(zhí)行功能。ARM程序和Thumb程序可相互調(diào)用,相互之間的狀態(tài)切換開(kāi)銷(xiāo)幾乎為零。,第3章目錄,3.1ARM指令集概述3.2ARM尋址方式3.3ARM指令詳細(xì)介紹,第3章目錄,3.1ARM指令集概述3.2ARM尋址方式3.3ARM指令詳細(xì)介紹,3.1ARM指令集概述,ARM指令集是32位的。ARM匯編程序的啟動(dòng)都是從ARM指令集開(kāi)始。所有的ARM指令集都可以是有條件執(zhí)行的。本節(jié)從以下三個(gè)方面介紹:ARM指令集編碼條件執(zhí)行指令分類(lèi)及指令格式,概述,3.1.1ARM指令集編碼,ARM指令集是以32位二進(jìn)制編碼的方式給出的;指令編碼中定義了目的操作數(shù)、第一操作數(shù)、第二操作數(shù)條件標(biāo)志影響位指令所對(duì)應(yīng)的不同功能實(shí)現(xiàn)的二進(jìn)制位,指令編碼概述,指令編碼表如下,ARM指令集編碼表,ARM指令集編碼表,ARM指令集指令碼opcode表,ARM指令集指令條件碼cond表,ARM指令集指令簡(jiǎn)表,ARM指令集指令簡(jiǎn)表,ARM指令集指令簡(jiǎn)表,ARM指令集基本格式,S,Cond:ARM指令根據(jù)CPSR中的條件位自動(dòng)判斷是否執(zhí)行指令,在條件滿(mǎn)足時(shí),指令執(zhí)行,否則指令被忽略。S:指令執(zhí)行后,是否還改寫(xiě)“cond”位。使用條件碼“cond”可以實(shí)現(xiàn)高效的邏輯操作,提高代碼效率。所有的ARM指令都可以條件執(zhí)行。如果指令不標(biāo)明條件代碼,將默認(rèn)為無(wú)條件(AL)執(zhí)行。,3.1.2條件執(zhí)行,ARM指令集舉例,C代碼:if(ab)a+;elseb+;,對(duì)應(yīng)的匯編代碼:a-r0,b-r1CMPR0,R1;R0與R1比較ADDHIR0,R0,#1;若R0R1,則R0=R0+1ADDLSR1,R1,#1;若R0R1,則R1=R1+1,3.1.2條件執(zhí)行,ARM指令集可以分為六大類(lèi):數(shù)據(jù)處理指令Load/Store指令跳轉(zhuǎn)指令程序狀態(tài)寄存器處理指令協(xié)處理器指令異常產(chǎn)生指令。,3.1.3指令分類(lèi)及指令格式,ARM指令集分類(lèi),ARM指令的基本格式如下:,ARM指令集指令格式,S,其中號(hào)內(nèi)的項(xiàng)是必須的;號(hào)內(nèi)的項(xiàng)是可選的;Rd是固定不變的;Rn是固定不變的;operand2變化繁多;,3.1.3指令分類(lèi)及指令格式,Opcode:操作碼;助記符,如AND=0000。Cond:條件碼;助記符,如EQ=0000。S:更新碼;若指定“S”,則指令執(zhí)行后,自動(dòng)更新CPSR中的Cond。Rd:目的寄存器;如R0=0000。Rn:第1源操作數(shù);是寄存器;如R1=0001。Op2:第2源操作數(shù);可為立即數(shù)/寄存器,變形式多樣。,ARM指令集指令格式說(shuō)明,3.1.3指令分類(lèi)及指令格式,S,ARM指令集ARM指令格式舉例,LDRR0,R1;讀R1地址上的存儲(chǔ)單元內(nèi)容,執(zhí)行條件ALBEQDATAEVEN;條件分支指令,相等則跳轉(zhuǎn)到DATAEVENADDSR2,R1,#1;加法指令,R2R2,更新CPRS,3.1.3指令分類(lèi)及指令格式,ARM指令集operand2,S,operand2的形式十分靈活#immed立即數(shù)方式;Rm寄存器方式;Rm,Shift寄存器移位方式;下面分別介紹:,3.1.3指令分類(lèi)及指令格式,ARM指令集operand2=#immed,operand2=#immed32位指令無(wú)法遍歷32位立即數(shù)!operand2是12bits,被分解為“8位常數(shù)immed_8”和“4位移位位數(shù)rimm_4”,用“immed_8循環(huán)右移2*rimm_4位”來(lái)表示一個(gè)立即數(shù)。有效立即數(shù)immediate表示成:=immed_8ROR(2rimm_4)12bits=rimm_4拼接immed_8,3.1.3指令分類(lèi)及指令格式,3.1.3指令分類(lèi)及指令格式,循環(huán)右移10位,8位常數(shù),ARM指令集operand2=#immed,operand2=#immed=immed_8ROR(2r_imm_4)例如:0 x04800000可以看成0 x12循環(huán)右移10位,凡是左右循環(huán)移位偶數(shù)位后,能夠表示成一個(gè)字節(jié)的數(shù)都是合法的立即數(shù)。(1之間的間距小于等于8),ARM指令集operand2=Rm,3.1.3指令分類(lèi)及指令格式,operand2=Rm在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUBR1,R1,R2MOVPC,R0,ARM指令集operand2=Rm,3.1.3指令分類(lèi)及指令格式,operand2=Rm在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。將寄存器的移位結(jié)果作為操作數(shù),但Rm值保持不變。格式如下:Rm,shifttype#rimm_5Rm,shifttypeRs,operand2=Rm移位操作含義LSL:邏輯左移,空出的最低有效位用0填充。LSR:邏輯右移,空出的最高有效位用0填充。ASL:算術(shù)左移,由于左移空出的有效位用0填充,因此它與LSL同義。ASR:算術(shù)右移,算術(shù)移位的對(duì)象是帶符號(hào)數(shù),移位過(guò)程中必須保持操作數(shù)的符號(hào)不變。如果源操作數(shù)是正數(shù),空出的最高有效位用0填充,如果是負(fù)數(shù)用1填充。ROR:循環(huán)右移,移出的字的最低有效位依次填入空出的最高有效位。RRX:帶擴(kuò)展的循環(huán)右移。將寄存器的內(nèi)容循環(huán)右移1位,空位用原來(lái)C標(biāo)志位填充。,ARM指令集operand2=Rm,3.1.3指令分類(lèi)及指令格式,operand2=Rm移位方式:圖示,ARM指令集operand2=Rm,3.1.3指令分類(lèi)及指令格式,operand2=Rm實(shí)例:ADDR1,R1,R1,LSL#3;R1=R1+R1*8=9R1SUBR1,R1,R2,LSRR3;R1=R1-(R2/2R3),ARM指令集operand2=Rm,3.1.3指令分類(lèi)及指令格式,第3章目錄,3.1ARM指令集概述3.2ARM尋址方式3.3ARM指令詳細(xì)介紹,3.2ARM處理器尋址方式,尋址方式定義,尋址方式就是根據(jù)指令中給出的地址碼字段來(lái)實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。操作數(shù)可能的形式:操作數(shù)為立即數(shù):直接給出立即數(shù)操作數(shù)在寄存器中:直接指明寄存器操作數(shù)在內(nèi)存中:如何給出存儲(chǔ)單元的地址?,3.2ARM處理器尋址方式,尋址方式分類(lèi),ARM處理器具有7種基本尋址方式:立即尋址;寄存器尋址;寄存器間接尋址;基址加偏址;堆棧尋址;塊拷貝尋址;相對(duì)尋址。,定義:在立即尋址指令中,只能用Operand2表示立即數(shù)!也就是說(shuō),數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱(chēng)為立即數(shù))。立即尋址指令舉例如下:SUBSR0,R0,#1;R0減1,結(jié)果放入R0,并且影響標(biāo)志位MOVR0,#0 xFF000;將立即數(shù)0 xFF000裝入R0寄存器,MOVR0,#0 xFF00,0 xFF00,從代碼中獲得數(shù)據(jù),3.2.1立即尋址,立即尋址-定義,3.2.1立即尋址,指令:測(cè)試下列指令是否正確?為什么?ADDR0,R0,1111ADDR0,R0,0 x3fMOVR0,#0 x128MOVR0,#0 x1FFMOVR0,#0 xFFFFFFFF;等價(jià)MVNR0,#0上機(jī)練習(xí),立即尋址-實(shí)例1-上機(jī)練習(xí),3.2.1立即尋址,立即數(shù)要求以“”為前綴十六進(jìn)制立即數(shù),在“”后加上“0 x”或“(1)MOVR1,#0X00110000;(2)MOVR4,#0X00012800;(3),8000:E3A00CF2;(1)8004:E3A01811;(2)8008:E2A04B4A;(3),注:8位立即數(shù)不需要經(jīng)過(guò)移位間接表示,而可以直接表示。,3.2.2寄存器尋址,寄存器獨(dú)立尋址寄存器移位尋址,3.2ARM處理器尋址方式,格式:操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來(lái)操作。寄存器尋址指令舉例如下:MOVR1,R2;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值;結(jié)果保存到R0,MOVR1,R2,0 xAA,寄存器獨(dú)立尋址-格式,3.2.2寄存器尋址,格式:,Rm,Rm:第二操作數(shù)寄存器;:移位類(lèi)型(LSL,LSR,ASL,ASR,ROR或RRX)和移位位數(shù)(#rimm_5或Rs)。在指令執(zhí)行時(shí)將移位后的內(nèi)容作為第二操作數(shù)參與運(yùn)算。但是,Rm保持不變。ADDR3,R2,R1,LSR#2;R3R2+R14,寄存器移位尋址-格式,3.2.2寄存器尋址,移位位數(shù)為立即數(shù):ADDR3,R2,R1,LSR#2;R3R2+R14寄存器R1的內(nèi)容邏輯右移2位(亦即R14),再與寄存器R2的內(nèi)容相加,結(jié)果放入R3中。移位位數(shù)為寄存器:ADDR3,R2,R1,LSRR4;R3R2+R12R4寄存器R1的內(nèi)容邏輯右移R4位(亦即R12R4),再與寄存器R2的內(nèi)容相加,結(jié)果放入R3中。,寄存器移位尋址-實(shí)例,3.2.2寄存器尋址,移位位數(shù)為立即數(shù):MOVR1,#R1=R1-(R2/2R3),寄存器移位尋址-演示-練習(xí),3.2.2寄存器尋址,定義:寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDRR0,R2;將R2指向的存儲(chǔ)單元的數(shù)據(jù)讀出;保存在R1中,寄存器間接尋址-格式,3.2.3寄存器間接尋址,LDRR0,R2,0 xAA,定義:基址加偏移尋址又稱(chēng)變址尋址?;芳悠穼ぶ肪褪菍⒒芳拇嫫鞯膬?nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址。基址尋址用于訪(fǎng)問(wèn)基址附近的存儲(chǔ)單元,常用于查表、數(shù)組操作、功能部件寄存器訪(fǎng)問(wèn)等?;穼ぶ分噶钆e例如下:格式:base_reg,indexLDRR2,R3,#0 x0C;讀R3+0 x0C地址上的存儲(chǔ)單元,3.2.4基址加偏址尋址,基址加偏址尋址-格式,LDRR2,R3,#0 x0C,0 xAA,將R3+0 x0C作為地址裝載數(shù)據(jù),分類(lèi):breg=BaseRegister偏移量模式:breg,indexLDRR0,R1,4;R0R14前變址模式:breg,index!LDRR0,R1,4!;R0R14,R1R14!表示自動(dòng)變址后變址模式:breg,indexLDRR0,R1,4;R0R1、R1R14說(shuō)明:具有高優(yōu)先級(jí);Index是偏移地址稱(chēng)為偏址,3.2.4基址加偏址尋址,基址加偏址尋址-分類(lèi),偏址-index格式:偏移地址是一個(gè)立即數(shù)LDRR0,R1,4;R0R14偏移地址是一個(gè)寄存器LDRR0,R1,R2;R0mem32R1+R2偏移地址是一個(gè)寄存器移位操作LDRR0,R1,R2,LSL#2;R0R1+R2*4,3.2.4基址加偏址尋址,基址加偏址尋址-偏址格式,偏移量ldrR0,R1,#4ldrR0,R1,R5ldrR0,R1,R5,LSL#PUSHldmfdSP!,R4-R7,LR;POP,3.2.5堆棧尋址,堆棧尋址-演示-練習(xí),約定:大大小小編號(hào)小的寄存器在存儲(chǔ)/加載數(shù)據(jù)時(shí)對(duì)應(yīng)于存儲(chǔ)器的小地址。也就是說(shuō),編號(hào)低的寄存器保存到堆棧的最低地址,或者從最低地址取數(shù);反之,亦然!其次是其他寄存器按照寄存器編號(hào)的次序保存到第一個(gè)地址后面的相鄰地址或從中取數(shù)。,3.2.5堆棧尋址,堆棧尋址-約定,定義:塊拷貝尋址是多寄存器傳送指令LDM/STM的尋址方式。LDM/STM指令可以把存儲(chǔ)器中的一個(gè)數(shù)據(jù)塊連續(xù)地加載到多個(gè)寄存器中,也可以把多個(gè)寄存器中的內(nèi)容連續(xù)地保存到存儲(chǔ)器中。尋址操作中的寄存器可以是R0-R15這16個(gè)寄存器的子集或是所有寄存器。,3.2.6塊拷貝尋址,塊拷貝尋址-定義,分類(lèi):I=IncrementA=AfterD=DecrementB=Before,3.2.6塊拷貝尋址,塊拷貝尋址-分類(lèi),指令:,3.2.6塊拷貝尋址,塊拷貝尋址-指令,實(shí)例1:,3.2.6塊拷貝尋址,塊拷貝尋址-實(shí)例,STMIAR9!,R0,R1,R5,0X1000,0X100C,0X1018,R9,R9,0X1000,0X100C,0X1018,STMIBR9!,R0,R1,R5,R9,R9,實(shí)例2:,3.2.6塊拷貝尋址,塊拷貝尋址-實(shí)例,STMDAR9!,R0,R1,R5,0X1000,0X100C,0X1018,R9,R9,0X1000,0X100C,0X1018,R9,R9,STMDBR9!,R0,R1,R5,約定:編號(hào)低的寄存器在存儲(chǔ)數(shù)據(jù)或者加載數(shù)據(jù)時(shí)對(duì)應(yīng)于存儲(chǔ)器的低地址。也就是說(shuō),編號(hào)低的寄存器保存到存儲(chǔ)器的最低地址或從最低地址取數(shù);其次是其他寄存器按照寄存器編號(hào)的次序保存到第一個(gè)地址后面的相鄰地址或從中取數(shù)。Theregistersaretransferredintheorderlowesttohighest,soR15(ifinthelist)willalwaysbetransferredlast.Thelowestregisteralsogetstransferredto/fromthelowestmemoryaddress.,3.2.6塊拷貝尋址,塊拷貝尋址-約定,比較1:數(shù)據(jù)塊傳送指令和堆棧操作指令之間的關(guān)系如下:,3.2.6塊拷貝尋址,塊拷貝尋址-比較,比較2:數(shù)據(jù)塊傳送指令和堆棧操作指令之間的關(guān)系如下:,3.2.6塊拷貝尋址,塊拷貝尋址-比較,比較3:兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡(jiǎn)單(只要前后一致即可),而使用數(shù)據(jù)塊指令進(jìn)行壓棧和出棧操作則需要考慮空與滿(mǎn)、加與減對(duì)應(yīng)的問(wèn)題。,3.2.6塊拷貝尋址,塊拷貝尋址-比較,;使用塊拷貝指令進(jìn)行堆棧操作STMDAR0!,R5-R6.LDMIBR0!,R5-R6,;使用堆棧指令進(jìn)行堆棧操作STMEDR0!,R5-R6.LDMEDR0!,R5-R6,實(shí)例:STMIAR0!,R1-R7;將R1R7的數(shù)據(jù)保存到存儲(chǔ)器中。;存儲(chǔ)指針在保存第一個(gè)值之后增加,;增長(zhǎng)方向?yàn)橄蛏显鲩L(zhǎng)。STMIBR0!,R1-R7;將R1R7的數(shù)據(jù)保存到存儲(chǔ)器中。;存儲(chǔ)指針在保存第一個(gè)值之前增加,;增長(zhǎng)方向?yàn)橄蛏显鲩L(zhǎng)。,3.2.6塊拷貝尋址,塊拷貝尋址-實(shí)例,練習(xí)1:下列指令實(shí)現(xiàn)功能:STMIAR1!,R5-R7STMIBR1!,R5-R7STMDAR1!,R5-R7STMDBR1!,R5-R7,3.2.6塊拷貝尋址,塊拷貝尋址-練習(xí),練習(xí)1:數(shù)據(jù)塊傳送指令操作過(guò)程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1則為指令執(zhí)行后的基址寄存器;綠箭頭表示Reg存入存儲(chǔ)器的順序:低低高高;寫(xiě)出相應(yīng)的指令:,3.2.6塊拷貝尋址,塊拷貝尋址-練習(xí),指令STMIAR1!,R5-R7,指令STMDAR1!,R5-R7,指令STMIBR1!,R5-R7,指令STMDBR1!,R5-R7,練習(xí)2:下列指令實(shí)現(xiàn)功能:LDMIAR0!,R2-R4STMIAR1!,R2-R4STMIAR1,R2-R4,3.2.6塊拷貝尋址,塊拷貝尋址-練習(xí),練習(xí)2:寫(xiě)出相應(yīng)的指令,3.2.6塊拷貝尋址,塊拷貝尋址-練習(xí),LDMIAR0!,R2-R4,0X1000,0X100C,0X1018,R0,R0,0X1000,0X100C,0X1018,STMIAR1!,R2-R4,R1,R1,練習(xí)2:寫(xiě)出相應(yīng)的指令,3.2.6塊拷貝尋址,塊拷貝尋址-練習(xí),LDMIAR0!,R2-R4,0X1000,0X100C,0X1018,R0,R0,0X1000,0X100C,0X1018,STMIAR1,R2-R4,R1,R1,練習(xí)3:寫(xiě)出下列指令的功能STMFDR13!,R2-R4LDMIAR0!,R2-R4STMIAR1!,R2-R4LDMFDR13!,R2-R4,3.2.6塊拷貝尋址,塊拷貝尋址-練習(xí),定義:相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對(duì)尋址指令舉例如下:BLNEXT;跳轉(zhuǎn)到子程序;NEXT處執(zhí)行NEXTMOVPC,LR,3.2.7相對(duì)(PC)尋址,相對(duì)尋址-定義,寫(xiě)出下列指令完成的功能:1.SUBNESR2,R1,#0X202.LDRR0,R1,4!3.STDR0,R1,44.LDRR0,R1,45.ADDR3,R2,R1,LSR#26.SUBSR3,R2,R1,LSRR47.ANDSR1,R1,R2,LSLR38.LDRr0,r1,r29.STRr0,r1,r2,LSL#210.STRR0,R1,第3章作業(yè)題,第3章目錄,3.1ARM指令集概述3.2ARM尋址方式3.3ARM指令詳細(xì)介紹,簡(jiǎn)單的ARM程序,;文件名:TEST1.S;功能:實(shí)現(xiàn)兩個(gè)寄存器相加;說(shuō)明:使用ARMulate軟件仿真調(diào)試AREAExample1,CODE,READONLY;聲明代碼段Example1ENTRY;標(biāo)識(shí)程序入口CODE32;聲明32位ARM指令STARTMOVR0,#0;設(shè)置參數(shù)MOVR1,#10LOOPBLADD_SUB;調(diào)用子程序ADD_SUBBLOOP;跳轉(zhuǎn)到LOOPADD_SUBADDSR0,R0,R1;R0=R0+R1MOVPC,LR;子程序返回END;文件結(jié)束,使用“;”進(jìn)行注釋,標(biāo)號(hào)頂格寫(xiě),實(shí)際代碼段,聲明文件結(jié)束,3.3ARM指令詳細(xì)介紹,1.數(shù)據(jù)處理指令2.Load/Store指令3.程序狀態(tài)寄存器與通用寄存器之間的傳送指令4.轉(zhuǎn)移指令5.異常中斷指令6.協(xié)處理器指令,3.3ARM指令詳細(xì)介紹,1.數(shù)據(jù)處理指令2.Load/Store指令3.程序狀態(tài)寄存器與通用寄存器之間的傳送指令4.轉(zhuǎn)移指令5.異常中斷指令6.協(xié)處理器指令,3.3.1數(shù)據(jù)處理指令,ARM的數(shù)據(jù)處理指令功能:ARM的數(shù)據(jù)處理指令主要完成寄存器中數(shù)據(jù)的算術(shù)和邏輯運(yùn)算操作。本節(jié)按以下內(nèi)容組織:數(shù)據(jù)處理指令分類(lèi)數(shù)據(jù)處理指令二進(jìn)制編碼數(shù)據(jù)處理指令表,3.3.1數(shù)據(jù)處理指令,ARM數(shù)據(jù)處理指令的基本原則為:所有的操作數(shù)都是32位寬,或來(lái)自寄存器,或是在指令中定義的立即數(shù)(符號(hào)或0擴(kuò)展);如果數(shù)據(jù)操作有結(jié)果,則結(jié)果為32位寬,放在一個(gè)寄存器中。(有一個(gè)例外:長(zhǎng)乘指令產(chǎn)生64位的結(jié)果);ARM指令中使用“3地址模式”,即每一個(gè)操作數(shù)寄存器和結(jié)果寄存器在指令中分別指定。,3.3.1數(shù)據(jù)處理指令,ARM指令集ARM數(shù)據(jù)處理指令注意事項(xiàng),數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,而不能對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影響狀態(tài)標(biāo)志。,3.3.1數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為以下六類(lèi):數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;乘法指令。,3.3.1數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為以下六類(lèi):數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;乘法指令。,3.3.1ARM數(shù)據(jù)處理指令指令表(前5類(lèi)),3.3.1ARM數(shù)據(jù)處理指令指令編碼(前5類(lèi)),指令執(zhí)行的條件碼,I用于區(qū)別立即數(shù)(I為1)和寄存器移位(I為0),opcode數(shù)據(jù)處理指令操作碼,第二操作數(shù),Rd目標(biāo)寄存器,Rn第一操作數(shù)寄存器,S設(shè)置條件碼,與指令中的S位對(duì)應(yīng),1MOV,MVN(singleoperandinstructions.)condSRd,2CMP,CMN,TEQ,TST(instructionswhichdonotproducearesult.)condRn,3AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC(Threeoperants)condSRd,Rn,Op2isOp2isRmOp2isRm,指令格式,3.3.1ARM數(shù)據(jù)處理指令指令格式(前5類(lèi)),實(shí)例,例如:MOVR0,#1ANDR1,R2,#0 x0FSUBR1,R1,R2MOVPC,R0ADDR1,R1,R1,LSL#3;R1=R1+R1*8=9R1SUBR1,R1,R2,LSRR3;R1=R1-(R2/2R3),3.3.1ARM數(shù)據(jù)處理指令指令實(shí)例(前5類(lèi)),3.3.1ARM數(shù)據(jù)處理指令指令編碼(前5類(lèi)),3.3.1ARM數(shù)據(jù)處理指令指令編碼(前5類(lèi)),3.3.1ARM數(shù)據(jù)處理指令特殊指令,RSB是反減,即用第二操作數(shù)減去源操作數(shù)。由于第二操作數(shù)可選的范圍寬,所以這條指令很有用。RSC是帶進(jìn)位標(biāo)志的反減。若進(jìn)位標(biāo)志為零,則結(jié)果減1。BIC用于將源操作數(shù)的各位與第二操作數(shù)中相應(yīng)位的反碼進(jìn)行“與”操作。BIC可用于將寄存器中某些位的值設(shè)置為0。MVN是“取反傳送”,它是把第二操作數(shù)的每一位取反,將得到的值置入結(jié)果寄存器。CMN表示“取反比較”,將目的操作數(shù)和源操作數(shù)相加,根據(jù)結(jié)果更新條件碼標(biāo)志。,3.3.1數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為以下六類(lèi):數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;乘法指令。,3.3.1ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送,Assemblersyntax:(singleoperandinstructions.)condSRd,Op2isOp2isRmOp2isRm,;:=;:=#expression;:=RRX;sare:ASL,LSL,LSR,ASR,ROR,MOVcondSRd,operand2MOV指令將立即數(shù)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運(yùn)算等操作。MOV指令舉例如下:MOVR1,#0 x10;R1=0 x10MOVSR0,R1;R0=R1MOVSR0,R1,LSL#2;R3=R12,并影響標(biāo)志位MOVSR0,R1,LSLR2;R3=R1R2,并影響標(biāo)志位MOVSR0,R1,RRX;R3=R1R2,并影響標(biāo)志位MOVPC,LR;PC=LR,子程序返回,3.3.1ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送,MVNcondSRd,operand2MVN指令將8位圖立即數(shù)或寄存器(operand2)按位取反后傳送到目標(biāo)寄存器(Rd),因?yàn)槠渚哂腥》垂δ埽钥梢匝b載范圍更廣的立即數(shù)。指令格式如下:MVN指令舉例如下:MVNR1,#0 xFF;R1=0 xFFFFFF00MVNR1,R2;將R2取反,結(jié)果存到R1,3.3.1ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送,MOVcondSRd,operand2課堂練習(xí)與實(shí)驗(yàn):MOVR1,#0 x10;R1=0 x10MOVSR0,R1;R0=R1MOVSR0,R1,LSL#2;R3=R12,并影響標(biāo)志位MOVSR0,R1,LSLR2;R3=R1R2,并影響標(biāo)志位MOVSR0,R1,RRX;R3=R1R2,并影響標(biāo)志位MOVPC,LR;PC=LR,子程序返回MVNR0,#0 xFFMVNR0,R1,3.3.1ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送,3.3.1數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為以下六類(lèi):數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;乘法指令。,3.3.1ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,Assemblersyntax:condSRd,Rn,Op2isOp2isRmOp2isRm,ADDcondSRd,Rn,operand2加法運(yùn)算指令A(yù)DD指令將operand2的值與Rn的值相加,結(jié)果保存到Rd寄存器。指令格式如下:應(yīng)用示例:ADDSR1,R1,#1;R1=R1+1,并影響標(biāo)志位ADDR1,R1,R2;R1=R1+R2,3.3.1ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,SUBcondSRd,Rn,operand2減法運(yùn)算指令SUB指令用寄存器Rn減去operand2,結(jié)果保存到Rd中。指令格式如下:應(yīng)用示例:SUBSR0,R0,#1;R0=R0-1,并影響標(biāo)志位SUBSR2,R1,R2;R2=R1-R2,并影響標(biāo)志位,3.3.1ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,RSBcondSRd,Rn,operand2逆向減法運(yùn)算指令RSB指令將operand2的值減去Rn,結(jié)果保存到Rd中。指令格式如下:應(yīng)用示例:RSBR3,R1,#0 xFF00;R3=0 xFF00-R1RSBSR1,R2,R2,LSL#2;R1=(R22)-R2=R23,3.3.1ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,ADCcondSRd,Rn,operand2帶進(jìn)位加法指令A(yù)DC將operand2的值與Rn的值相加,再加上CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd寄存器。指令格式如下:應(yīng)用示例(使用ADC實(shí)現(xiàn)64位加法,結(jié)果存于R1、R0中):ADDSR0,R0,R2;R0等于低32位相加,并影響標(biāo)志位ADCR1,R1,R3;R1等于高32位相加,并加上低位進(jìn)位,3.3.1ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,SBCcondSRd,Rn,operand2帶進(jìn)位減法指令SBC用寄存器Rn減去operand2,再減去CPSR中的C條件標(biāo)志位的非(即若C標(biāo)志清零,則結(jié)果減去1),結(jié)果保存到Rd中。指令格式如下:應(yīng)用示例(使用SBC實(shí)現(xiàn)64位減法,結(jié)果存于R1、R0中):SUBSR0,R0,R2;低32位相減,并影響標(biāo)志位SBCR1,R1,R3;高32位相減,并減去低位借位,3.3.1ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,RSCcondSRd,Rn,operand2帶進(jìn)位逆向減法指令RSC指令用寄存器operand2減去Rn,再減去CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd中。指令格式如下:應(yīng)用示例(使用RSC指令實(shí)現(xiàn)求64位數(shù)值的負(fù)數(shù)):RSBSR2,R0,#0RSCR3,R1,#0,3.3.1ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,3.3.1數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為以下六類(lèi):數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;乘法指令。,Assemblersyntax:condSRd,Rn,Op2isOp2isRmOp2isRm,3.3.1ARM數(shù)據(jù)處理指令邏輯運(yùn)算,ANDcondSRd,Rn,operand2邏輯與操作指令A(yù)ND指令將operand2的值與寄存器Rn的值按位作邏輯“與”操作,結(jié)果保存到Rd中。指令格式如下:應(yīng)用示例:ANDSR0,R0,#0 x01;R0=R0R2=R1將R1的低4位取反EORR2,R1,R0;R2=R1R0EORSR0,R5,#0 x01;將R5和0 x01進(jìn)行邏輯異或,;結(jié)果保存到R0,并影響標(biāo)志位,3.3.1ARM數(shù)據(jù)處理指令邏輯運(yùn)算,BICcondSRd,Rn,operand2位清除指令BIC指令將寄存器Rn的值與operand2的值的反碼按位作邏輯“與”操作,結(jié)果保存到Rd中。指令格式如下:應(yīng)用示例:BICR1,R1,#0 x0F;將R1的低4位清零,其它位不變BICR1,R2,R3;將R3的反碼和R2相邏輯“與”,;結(jié)果保存到R1中,3.3.1ARM數(shù)據(jù)處理指令邏輯運(yùn)算,3.3.1數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為以下六類(lèi):數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;乘法指令。,Assemblersyntax:condRn,Op2isOp2isRmOp2isRm,3.3.1ARM數(shù)據(jù)處理指令比較指令,CMPcondRn,operand2比較指令CMP指令將寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來(lái)判斷是否執(zhí)行。指令格式如下:應(yīng)用示例:CMPR1,#10;R1與10比較,設(shè)置相關(guān)標(biāo)志位CMPR1,R2;R1與R2比較,設(shè)置相關(guān)標(biāo)志位,3.3.1ARM數(shù)據(jù)處理指令比較指令,注意:CMP指令與SUBS指令的區(qū)別在于CMP指令不保存運(yùn)算結(jié)果。在進(jìn)行兩個(gè)數(shù)據(jù)的大小判斷時(shí),常用CMP指令及相應(yīng)的條件碼來(lái)操作。省略Rd。,CMNcondRn,operand2負(fù)數(shù)比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來(lái)判斷是否執(zhí)行。指令格式如下:應(yīng)用示例:CMNR0,#1;R0+1,判斷R0是否為1的補(bǔ)碼;如果是,則設(shè)置Z標(biāo)志位,3.3.1ARM數(shù)據(jù)處理指令比較指令,注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運(yùn)算結(jié)果。CMN指令可用于負(fù)數(shù)比較,比如CMNR0,#1指令則表示R0與-1比較,若R0為-1(即1的補(bǔ)碼),則Z置位;否則Z復(fù)位。,3.3.1數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為以下六類(lèi):數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;乘法指令。,Assemblersyntax:condRn,Op2isOp2isRmOp2isRm,3.3.1ARM數(shù)據(jù)處理指令測(cè)試指令,TSTcondRn,operand2位測(cè)試指令TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。應(yīng)用示例:TSTR0,#0 x01;判斷R0的最低位是否為0TSTR1,#0 x0F;判斷R1的低4位是否為0,3.3.1ARM數(shù)據(jù)處理指令測(cè)試指令,注意:TST指令與ANDS指令的區(qū)別在于TST指令不保存運(yùn)算結(jié)果。TST指令通常與EQ、NE條件碼配合使用,當(dāng)所有測(cè)試位均為0時(shí),EQ有效,而只要有一個(gè)測(cè)試位不為0,則NE有效。,TEQcondRn,operand2相等測(cè)試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來(lái)判斷是否執(zhí)行。應(yīng)用示例:TEQR0,R1;比較R0與R1是否相等(不影響V位和C位),注意:TEQ指令與EORS指令的區(qū)別在于TEQ指令不保存運(yùn)算結(jié)果。使用TEQ進(jìn)行相等測(cè)試時(shí),常與EQ、NE條件碼配合使用。當(dāng)兩個(gè)數(shù)據(jù)相等時(shí),EQ有效;否則NE有效。,3.3.1ARM數(shù)據(jù)處理指令測(cè)試指令,分別寫(xiě)出下列指令的實(shí)例:數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;,3.3.1ARM數(shù)據(jù)處理指令課堂練習(xí),3.3.1數(shù)據(jù)處理指令,數(shù)據(jù)處理指令可分為以下六類(lèi):數(shù)據(jù)傳送指令;算術(shù)運(yùn)算指令;邏輯運(yùn)算指令;比較指令;測(cè)試指令;乘法指令。,ARM指令集乘法指令,ARM7TDMI具有三種乘法指令,分別為:3232位結(jié)果為32位的乘法指令;3232位結(jié)果為32位的乘加指令;3232位結(jié)果為64位的乘法指令;3232位結(jié)果為64位的乘加指令。,3.3.1數(shù)據(jù)處理指令,按產(chǎn)生結(jié)果的位寬一般分為兩類(lèi):一類(lèi)是兩個(gè)32位二進(jìn)制數(shù)相乘的結(jié)果是64位;另一類(lèi)是兩個(gè)32位二進(jìn)制數(shù)相乘,僅保留最低有效32位。這兩種類(lèi)型都有“乘法累加”的變形。,3.3.1ARM數(shù)據(jù)處理指令乘法指令,乘法指令編碼,指令執(zhí)行的條件碼,Opcode乘法指令操作碼,S設(shè)置條件碼,與指令中的S位對(duì)應(yīng),Rm為被乘數(shù)寄存器,Rn/RdLo為MLA指令相加的寄存器或64位乘法指令的目標(biāo)寄存器(低32位),Rd/RdHi為目標(biāo)寄存器或64位乘法指令的目標(biāo)寄存器(高32位),Rs為乘數(shù)寄存器,3.3.1ARM數(shù)據(jù)處理指令乘法指令,二進(jìn)制編碼說(shuō)明對(duì)于32位乘積結(jié)果指令,Rd為結(jié)果寄存器,Rm、Rs、Rn為操作數(shù)寄存器。對(duì)于64位乘積結(jié)果指令,RdLo、RdHi為結(jié)果寄存器,“RdHi:RdLo”是由RdHi(最高有效32位)和RdLo(最低有效32位)連接形成64位乘積結(jié)果,Rm、Rs為操作數(shù)寄存器。,3.3.1ARM數(shù)據(jù)處理指令乘法指令,乘法指令編碼,乘法指令格式,3.3.1ARM數(shù)據(jù)處理指令乘法指令,Assemblersyntax:MULcondSRd,Rm,RsMLAcondSRd,Rm,Rs,RnNotes:SsetconditioncodesifSpresentRd,Rm,RsandRnareexpressionsevaluatingtoaregisternumberotherthanR15,3.3.1ARM數(shù)據(jù)處理指令乘法指令,3.3.1ARM數(shù)據(jù)處理指令乘法指令,3.3.1ARM數(shù)據(jù)處理指令乘法指令,Assemblersyntax:MULcondSRd,Rm,RsMLAcondSRd,Rm,Rs,Rn,MULcondSRd,Rm,Rs32位乘法指令MUL指令將Rm和Rs中的值相乘,結(jié)果的低32位保存到Rd中。指令格式如下:應(yīng)用示例:MULR1,R2,R3;R1=R2R3MULSR0,R3,R7;R0=R3R7,同時(shí)影響CPSR中的N位和Z位,3.3.1ARM數(shù)據(jù)處理指令乘法指令,MLAcondSRd,Rm,Rs,Rn32位乘加指令MLA指令將Rm和Rs中的值相乘,再將乘積加上第3個(gè)操作數(shù),結(jié)果的低32位保存到Rd中。指令格式如下:應(yīng)用示例:MLAR1,R2,R3,R0;R1=R2R3+R0,3.3.1ARM數(shù)據(jù)處理指令乘法指令,UMULLcondSRdLo,RdHi,Rm,Rs64位無(wú)符號(hào)乘法指令UMULL指令將Rm和Rs中的值作無(wú)符號(hào)數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:應(yīng)用示例:UMULLR0,R1,R5,R8;(R1、R0)=R5R8,3.3.1ARM數(shù)據(jù)處理指令乘法指令,UMLALcondSRdLo,RdHi,Rm,Rs64位無(wú)符號(hào)乘加指令UMLAL指令將Rm和Rs中的值作無(wú)符號(hào)數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:應(yīng)用示例:UMLALR0,R1,R5,R8;(R1、R0)=R5R8+(R1、R0),3.3.1ARM數(shù)據(jù)處理指令乘法指令,SMULLcondSRdLo,RdHi,Rm,Rs64位有符號(hào)乘法指令SMULL指令將Rm和Rs中的值作有符號(hào)數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:應(yīng)用示例:SMULLR2,R3,R7,R6;(R3、R2)=R7R6,3.3.1ARM數(shù)據(jù)處理指令乘法指令,SMLALcondSRdLo,RdHi,Rm,Rs64位有符號(hào)乘加指令SMLAL指令將Rm和Rs中的值作有符號(hào)數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:應(yīng)用示例:SMLALR2,R3,R7,R6;(R3、R2)=R7R6+(R3、R2),3.3.1ARM數(shù)據(jù)處理指令乘法指令,課堂練習(xí)MULR1,R2,R3MULSR0,R3,R7MLAR1,R2,R3,R0UMULLR0,R1,R5,R8UMLALR0,R1,R5,R8SMULLR2,R3,R7,R6SMLALR2,R3,R7,R6,3.3.1ARM數(shù)據(jù)處理指令乘法指令,1、位操作指令舉例,MOVR0,R2,LSR#24ORRR3,R0,R3,LSL#8功能:將R2的高8位數(shù)據(jù)傳送到R3的低8位中。,3.3.1ARM數(shù)據(jù)處理指令綜合應(yīng)用,2、乘法指令舉例,MOVR0,R0,LSL#nADDR0,R0,R0,LSL#nRSBR0,R0,R0,LSL#n,3.3.1ARM數(shù)據(jù)處理指令綜合應(yīng)用,ADDSR0,R0,R2;R0等于低32位相加,并影響標(biāo)志位ADCR1,R1,R3;R1等于高32位相加,并加上低位進(jìn)位,3、ADC實(shí)現(xiàn)64位加法舉例,3.3.1ARM數(shù)據(jù)處理指令綜合應(yīng)用,R1和R0存放一個(gè)64位數(shù)據(jù),R0放低32位;R3和R2存放一個(gè)64位數(shù)據(jù),R2放低32位;結(jié)果存于R1、R0中。,4、SBC實(shí)現(xiàn)64位減法舉例,SBC實(shí)現(xiàn)64位減法,結(jié)果存于R1、R0中SUBSR0,R0,R2;低32位相減,并影響標(biāo)志位SBCR1,R1,R3;高32位相減,并減去低位借位,3.3.1ARM數(shù)據(jù)處理指令綜合應(yīng)用,5、實(shí)現(xiàn)兩個(gè)64位數(shù)據(jù)比較。,CMPR1,R3CMPEQR0,R2,3.3.1ARM數(shù)據(jù)處理指令綜合應(yīng)用,6、轉(zhuǎn)化內(nèi)存中數(shù)據(jù)存儲(chǔ)方式的指令段,執(zhí)行前R0=A,B,C,D執(zhí)行后R0=D,C,B,A,3.3.1ARM數(shù)據(jù)處理指令綜合應(yīng)用,3.3.1ARM指令數(shù)據(jù)處理指令課后作業(yè),3.3.1ARM指令數(shù)據(jù)處理指令課后作業(yè),3.3ARM指令詳細(xì)介紹,1.數(shù)據(jù)處理指令2.Load/Store指令3.程序狀態(tài)寄存器與通用寄存器之間的傳送指令4.轉(zhuǎn)移指令5.異常中斷指令6.協(xié)處理器指令,3.3.2Load/Store指令,ARM指令集存儲(chǔ)器訪(fǎng)問(wèn)指令,ARM處理器是典型的RISC處理器,對(duì)存儲(chǔ)器的訪(fǎng)問(wèn)只能使用加載和存儲(chǔ)指令實(shí)現(xiàn)。ARM處理器是馮諾依曼存儲(chǔ)結(jié)構(gòu),對(duì)外圍IO、程序、數(shù)據(jù)的訪(fǎng)問(wèn)均要通過(guò)加載/存儲(chǔ)指令進(jìn)行。ARM的數(shù)據(jù)存取指令Load/Store是唯一用于寄存器和存儲(chǔ)器之間進(jìn)行數(shù)據(jù)傳送的指令。,3.3.2Load/Store指令,ARM指令集中有三種基本的數(shù)據(jù)存取指令:?jiǎn)渭拇嫫鞯拇嫒≈噶睿↙DR,STR)多寄存器存取指令(LDM,STM)單寄存器交換指令(SWP),3.3.2Load/Store指令,ARM指令集中有三種基本的數(shù)據(jù)存取指令:?jiǎn)渭拇嫫鞯拇嫒≈噶睿↙DR,STR)多寄存器存取指令(LDM,STM)單寄存器交換指令(SWP),1.單寄存器的存取指令,單寄存器存取指令是ARM在寄存器和存儲(chǔ)器間傳送單個(gè)字節(jié)、半字和字的最靈活方式。它支持幾種尋址模式,包括立即數(shù)和寄存器偏移、自動(dòng)變址和相對(duì)PC的尋址。根據(jù)傳送數(shù)據(jù)的類(lèi)型不同,單個(gè)寄存器存取指令又可以分為以下兩類(lèi):?jiǎn)巫趾蜔o(wú)符號(hào)字節(jié)的數(shù)據(jù)傳送指令半字和有符號(hào)字節(jié)的數(shù)據(jù)傳送指令,3.3.2Load/Store指令-LDR,STR,單字和無(wú)符號(hào)字節(jié)的數(shù)據(jù)傳送指令,LDR從內(nèi)存中取32位字或8位無(wú)符號(hào)字節(jié)數(shù)據(jù)放入寄存器;STR將寄存器中的32位字或8位無(wú)符號(hào)字節(jié)數(shù)據(jù)保存到內(nèi)存中;字節(jié)傳送時(shí)是用“0”將8位的操作數(shù)擴(kuò)展到32位。,3.3.2Load/Store指令-LDR,STR,半字和有符號(hào)字節(jié)的數(shù)據(jù)傳送指令,ARM提供了專(zhuān)門(mén)的半字(帶符號(hào)和無(wú)符號(hào))、有符號(hào)字節(jié)數(shù)據(jù)傳送指令。LDR從內(nèi)存中取半字(帶符號(hào)和無(wú)符號(hào))、有符號(hào)字節(jié)數(shù)據(jù)放入寄存器;STR將寄存器中的半字(帶符號(hào)和無(wú)符號(hào))、有符號(hào)字節(jié)數(shù)據(jù)保存到內(nèi)存中。有符號(hào)字節(jié)或有符號(hào)半字傳送時(shí)是用“符號(hào)位”擴(kuò)展到32位;無(wú)符號(hào)半字的傳送是用“0”擴(kuò)展到32位。,3.3.2Load/Store指令-LDR,STR,單寄存器加載指令表,3.3.2Load/Store指令-LDR,STR,LDR/STR指令用于對(duì)內(nèi)存變量的訪(fǎng)問(wèn)、內(nèi)存緩沖區(qū)數(shù)據(jù)的訪(fǎng)問(wèn)、查表、外圍部件的控制操作等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實(shí)現(xiàn)程序跳轉(zhuǎn)功能,這樣也就實(shí)現(xiàn)了程序散轉(zhuǎn)。所有單寄存器加載/存儲(chǔ)指令可分為“字和無(wú)符號(hào)字節(jié)加載存儲(chǔ)指令”和“半字和有符號(hào)字節(jié)加載存儲(chǔ)指令。,單寄存器存儲(chǔ)指令表,3.3.2Load/Store指令-LDR,STR,思考題:5.STR比LDR少了幾條指令,為什么?,第3章思考題,指令格式如下:,LDRcondTRd,;將指定地址上的字?jǐn)?shù)據(jù)讀入RdSTRcondTRd,;將Rd中字?jǐn)?shù)據(jù)存入指定地址LDRcondBTRd,;將指定地址的字節(jié)數(shù)據(jù)讀入RdSTRcondBTRd,;將Rd中字節(jié)數(shù)據(jù)存入指定地址,其中,T為可選后綴。T在用戶(hù)模式下無(wú)效。T:ifTispresenttheWbitwillbesetinapost-indexedinstruction,forcingnon-privilegedmodeforthetransfercycle.Tisnotallowedwhenapre-indexedaddressingmodeisspecifiedorimplied.,3.3.2Load/Store指令-LDR,STR,LDR和STR字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令格式,LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個(gè)基址寄存器,可以為任一個(gè)通用寄存器;另一部分為一個(gè)地址偏移量。地址偏移量有以下3種格式:立即數(shù)。立即數(shù)可以是一個(gè)無(wú)符號(hào)的數(shù)值。這個(gè)數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,R0,#0 x12寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,R0,R2寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,R0,R2,LSL#2,3.3.2Load/Store指令-LDR,STR,LDR和STR字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令編碼,LDR和STR字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令編碼,指令執(zhí)行的條件碼,I為0時(shí),偏移量為12位立即數(shù),為1時(shí),偏移量為寄存器移位,P表示前/后變址,U表示加/減,B為1表示字節(jié)訪(fǎng)問(wèn),為0表示字訪(fǎng)問(wèn),W表示回寫(xiě),為指令的尋址方式,Rd為源/目標(biāo)寄存器,Rn為基址寄存器,L用于區(qū)別加載(L為1)或存儲(chǔ)(L為0),3.3.2Load/Store指令-LDR,STR,3.3.2ARM存儲(chǔ)器訪(fǎng)問(wèn)指令單寄存器存儲(chǔ),condBTRd,LDR:loadfrommemoryintoaregisterSTR:storefromaregisterintomemoryB:ifBispresentthenbytetransfer,otherwisewordtransferT:ifTispresenttheWbitwillbesetinapost-indexedinstruction,forcingnon-privilegedmodeforthetransfercycle.Tisnotallowedwhenapre-indexedaddressingmodeisspecifiedorimplied.Rd:isanexpressionevaluatingtoavalidregisternumber.Rn:andRmareexpressionsevaluatingtoaregisternumber.IfRnisR15thentheassemblerwillsubtract8fromtheoffsetvaluetoallowforARM7TDMIpipelining.Inthiscasebasewrite-backshouldnotbespecified.,3.3.2Load/Store指令-LDR,STR,LDR和STRWB類(lèi)指令格式,condBTRd,1Anexpressionwhichgeneratesanaddress:TheassemblerwillattempttogenerateaninstructionusingthePCasabaseandacorrectedimmediateoffsettoaddressthelocationgivenbyevaluatingtheexpression.ThiswillbeaPCrelative,pre-indexedaddress.Iftheaddressisoutofrange,anerrorwillbegenerated.2Apre-indexedaddressingspecification:Rn;offsetofzeroRn,!;offsetofbytesRn,+/-Rm,!;offsetof+/-contentsofindexregister,shiftedby3Apost-indexedaddressingspecification:Rn,;offsetofbytesRn,+/-Rm,;offsetof+/-contentsofindexregister,shiftedasby.generalshiftoperation(seedataprocessinginstructions)butyoucannotspecifytheshiftamountbyaregister.!writesbackthebaseregister(settheWbit)if!ispresent.,3.3.2Load/Store指令-LDR,STR,LDR和STRWB類(lèi)尋址模式,從尋址方式的地址計(jì)算方法分,加載/存儲(chǔ)指令有以下4種格式:零偏移。如:LDRRd,Rn前索引偏移。如:LDRRd,Rn,#0 x04!后索引偏移。如:LDRRd,Rn,#0 x04程序相對(duì)偏移。如:LDRRd,labe1注意:大多數(shù)情況下,必須保證字?jǐn)?shù)據(jù)操作的地址是32位對(duì)齊的。,3.3.2Load/Store指令-LDR,STR,LDR和STR字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令實(shí)例,課堂練習(xí):LDRR0,R1,R1;對(duì)不對(duì)?STRR1,R2,R4!;StoreR1atR2+R4(bothofwhichareregisters);andwritebackaddresstoR2.STRR1,R2,R4;StoreR1atR2andwritebackR2+R4toR2.LDRR1,R2,#16;LoadR1fromcontentsofR2+16,butdontwriteback.LDRR1,R2,R3,LSL#2;LoadR1fromcontentsofR2+R3*4.LDREQBR1,R6,#5;ConditionallyloadbyteatR6+5into;R1bits0to7,fillingbits8to31withzeros.STRR1,PLACE;GeneratePCrelativeoffsettoaddressPLACE.PLACE,3.3.2Load/Store指令-LDR,STR,LDR和STR字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令實(shí)例,這類(lèi)LDR/STR指令可加載有符號(hào)半字或字節(jié),可加載/存儲(chǔ)無(wú)符號(hào)半字。偏移量格式、尋址方式與加載/存儲(chǔ)字和無(wú)符號(hào)字節(jié)指令相同。,LDRcondSBRd,;將指定地址上的有符號(hào)字節(jié)讀入RdLDRcondSHRd,;將指定地址上的有符號(hào)半字讀入RdLDRcondHRd,;將指定地址上的半字?jǐn)?shù)據(jù)讀入RdSTRcondHRd,;將Rd中的半字?jǐn)?shù)據(jù)存入指定地址,注意:1.有符號(hào)位半字/字節(jié)加載是指用符號(hào)位加載擴(kuò)展到32位,無(wú)符號(hào)半字加載是指用零擴(kuò)展到32位;2.半字讀寫(xiě)的指定地址必須為偶數(shù),否則將產(chǎn)生不可靠的結(jié)果;,3.3.2Load/Store指令-LDR,STR,LDR和STR有符號(hào)半字和字節(jié)加載/存儲(chǔ)指令編碼,指令執(zhí)行的條件碼,I為1時(shí),偏移量為12位立即數(shù),為0時(shí),偏移量為寄存器移位,P表示前/后變址,U表示加/減,W表示回寫(xiě),為指令的尋址方式,Rd為源/目標(biāo)寄存器,Rn為基址寄存器,L用于區(qū)別加載(L為1)或存儲(chǔ)(L為0),S為1表示有符號(hào)訪(fǎng)問(wèn),為0表示無(wú)符號(hào)訪(fǎng)問(wèn),H為1表示半字訪(fǎng)問(wèn),為0表示字節(jié)訪(fǎng)問(wèn),3.3.2Load/Store指令-LDR,STR,LDR和STR有符號(hào)半字和字節(jié)加載/存儲(chǔ)指令編碼,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- EMPUCh3 指令系統(tǒng)
鏈接地址:http://m.italysoccerbets.com/p-11793269.html