第三章 ARM指令集與編程_第1頁
第三章 ARM指令集與編程_第2頁
第三章 ARM指令集與編程_第3頁
第三章 ARM指令集與編程_第4頁
第三章 ARM指令集與編程_第5頁
已閱讀5頁,還剩146頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第3章ARM指令集與編程主要內(nèi)容3.1總體介紹:指令分類,特點(diǎn),格式,條件碼3.2ARM指令尋址方式3.3數(shù)據(jù)處理指令:數(shù)據(jù)傳輸指令,算術(shù)指令,邏輯指令,比較指令,乘法指令(略),前導(dǎo)零計數(shù)(略)3.4程序狀態(tài)訪問指令3.5跳轉(zhuǎn)指令3.6單數(shù)據(jù)訪存指令3.7多數(shù)據(jù)訪存指令3.8其它指令:信號量操作指令,異常中斷產(chǎn)生指令,協(xié)處理器指令(略)3.9偽指令3.10Thumb指令集3.1總體介紹:

指令分類,特點(diǎn),格式,條件碼3.1.1指令分類

ARM指令集總體分為6類指令數(shù)據(jù)處理指令:數(shù)據(jù)傳輸指令,算術(shù)指令,邏輯指令,比較指令,乘法指令,前導(dǎo)零計數(shù)。程序狀態(tài)訪問指令:mrs和msr。跳轉(zhuǎn)指令:b和bl。訪存指令(Load/Store):單數(shù)據(jù)訪存指令,多數(shù)據(jù)訪存指令,信號量操作指令。異常中斷產(chǎn)生指令:swi和bkpt。協(xié)處理器指令。3.1.2指令特點(diǎn)所有指令都是32bit。大多數(shù)指令都在單周期內(nèi)完成。所有指令都可以條件執(zhí)行。load/store體系結(jié)構(gòu)。指令集可以通過協(xié)處理器擴(kuò)展3.1.3ARM指令的格式<Opcode>{<cond>}{s}<Rd>,<Rn>,<Operand2>Cond:指令的條件碼。Opcode:指令操作碼。S:操作是否影響cpsr。Rn:包含第一個操作數(shù)的寄存器編碼。Rd:目標(biāo)寄存器編碼。Operand2:第2操作數(shù)。Cond001OpcodeSRnRdOperand20111215161920212425272831783.1.4ARM指令的條件執(zhí)行所有的ARM指令可包含一個可選的條件碼,只有在cpsr中的條件標(biāo)志位滿足指定的條件時,指令才會被執(zhí)行。不符合條件的代碼依然占用一個時鐘周期(相當(dāng)于一個NOP指令)。//r0,r1,r2,r3,r4:a,b,c,d,ecmp r0,r1cmpeq r2,r3addeq r4,r4,#1if((a==b)&&(c==d)){ e++;}(1)ARM指令的條件域EQ/NE:等于/不等于(equal/notequal)HS/LO:無符號數(shù)高于或等于/無符號數(shù)小于(higherorsame/lower)HI/LS:無符號數(shù)高于/無符號數(shù)低于或等于(higher/lowerorsame)GE/LT:有符號數(shù)大于或等于/有符號數(shù)小于(greaterorequal/lessthan)GT/LE:有符號數(shù)大于/有符號數(shù)小于或等于(greaterthan/lessorequal)MI/PL:負(fù)/非負(fù)VS/VC:溢出/不溢出(overflowset/overflowclear)CS/CC:進(jìn)位/無進(jìn)位(carryset/carryclear)(2)ARM指令的條件碼0000EQZ置位相等/等于00001NEZ清0不等0010CS/HSC置位進(jìn)位/無符號高于或等于0011CC/LOC清0無進(jìn)位/無符號低于0100MIN置位負(fù)數(shù)0101PLN清0非負(fù)數(shù)0110VSV置位溢出0111VCV清0無溢出(2)ARM指令的條件碼(續(xù))1000HIC置位且Z清0無符號高于1001LSC清0或Z置位無符號低于或等于1010GEN等于V有符號大于或等于1011LTN不等于V有符號小于1100GTZ清0且N等于V有符號大于1101LEZ置位或N不等于V有符號小于或等于1110AL任何狀態(tài)總是(always)1111NV無從不(never)注:AL是默認(rèn)的,NV不建議使用。3.2ARM指令尋址方式3.2.1立即數(shù)方式指令中在操作碼字段后面的地址碼部分不是通常意義上的操作數(shù)地址,而是操作數(shù)本身。ADDR3,R3,#1;R3=R3+1ANDR8,R7,#0xff;R8=R7[7:0]

第2個源操作數(shù)為一個立即數(shù),以“#”為前綴,十六進(jìn)制值以在“#”后加“0x”或“&”表示。3.2.2寄存器尋址ADDR0,R1,R2;R0=R1+R2

這條指令將兩個寄存器(R1和R2)的內(nèi)容相加,結(jié)果放入第3個寄存器R0中。必須注意寫操作數(shù)的順序,第1個是結(jié)果(目標(biāo))寄存器,然后是第一操作數(shù)寄存器,最后是第二操作數(shù)寄存器。3.2.3寄存器移位尋址這種尋址方式是ARM指令集特有的。第2個寄存器操作數(shù)在與第1個操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。<Rm>,LSL#<shift_imm>;<Rm>,LSL<Rs>;ADDR3,R2,R1,LSL#3;R3=R2+8×R1寄存器R1的內(nèi)容邏輯左移3位,再與寄存器R2內(nèi)容相加,結(jié)果放入R3中。邏輯移位

LSL:邏輯左移(LogicalShiftLeft)。寄存器中字的低端空出的位補(bǔ)0?!SR:邏輯右移(LogicalShiftRight)。寄存器中字的高端空出的位補(bǔ)0?!SR:算術(shù)右移(ArithmeticShiftRight)。算術(shù)移位的對象是帶符號數(shù),在移位過程中必須保持操作數(shù)的符號不變。若源操作數(shù)為正數(shù),則字的高端空出的位補(bǔ)0。若源操作數(shù)為負(fù)數(shù),則字的高端空出的位補(bǔ)1?!OR:循環(huán)右移(RotateRight)。從字的最低端移出的位填入字的高端空出的位?!RX:擴(kuò)展為1的循環(huán)右移(RotateRightExtendedby1place)。操作數(shù)右移一位,空位(位[31])用原C標(biāo)志填充。移位操作過程在任何數(shù)據(jù)處理指令中,第二寄存器操作數(shù)可以有應(yīng)用該操作數(shù)的移位操作.邏輯移位LSL:邏輯左移字的最小位空位清零LSR:邏輯右移字的最大位空位清零.移位操作算術(shù)移位:ASR,正數(shù)的ASR=LSR循環(huán)移位:ROR,RRX移位操作指令中的地址碼給出某一通用寄存器的編號。在被指定的寄存器中存放操作數(shù)的有效地址,而操作數(shù)則存放在存儲單元中,即寄存器為地址指針。針對Load/Store指令。LDRR0,[R1];R0=[R1]STRR0,[R1];[R1]=R0

寄存器間接尋址使用一個寄存器(基址寄存器)的值作為存儲器的地址。3.2.4寄存器間接尋址Cond01IPU0W1RnRdAddress_mode3128272625242322212019161512110Cond0101UB0LRnRdOffset_123128272625242322212019161512110Cond0101UB0LRnRd00000000Rm3128272625242322212019161512110Cond0101UB0LRnRdShift_immshift0Rm3128272625242322212019161512110343467LDR指令的基本格式[<Rn>,#+/-<offset_12>][<Rn>,+/-<Rm>][<Rn>,+/-<Rm>,<shift>#<shift_imm>]3.2.5變址尋址變址尋址就是將基址寄存器的內(nèi)容與指令中給出的位移量相加,形成操作數(shù)有效地址。變址尋址用于訪問基址附近的存儲單元,包括:

基址加偏移[<Rn>,#+/-<offset_12>]基址加索引尋址[<Rn>,+/-<Rm>]寄存器間接尋址是偏移量為0的基址加偏移尋址?;芳悠茖ぶ分械幕芳拇嫫靼刂?,需加(或減)(最大4KB)的偏移來計算訪問的地址。LDRR0,[R1,#4];R0=[R1+4]這是前索引尋址方式。帶自動索引的前索引尋址。LDRR0,[R1,#4]!;R0=[R1+4];R1=R1+4“!”符號表明指令在完成數(shù)據(jù)傳送后應(yīng)該更新基址寄存器后索引尋址?;凡粠谱鳛閭魉偷牡刂?,傳送后自動索引。

LDRR0,[R1],#4;R0=[R1];R1=R1+4基址加索引尋址有時指令指定一個基址寄存器,再指定另一個寄存器(索引),其值作為偏移加到基址上形成存儲器地址。例如指令:

LDRR0,[R1,R2];R0=[R1+R2]3.2.6塊拷貝尋址

ARM支持兩種不同角度的塊尋址機(jī)制,兩者都映射到相同的基本指令——多寄存器傳送指令。多寄存器傳送指令可以用于把一塊數(shù)據(jù)從存儲器的某一位置拷貝到另一位置;基于數(shù)據(jù)是存儲在基址寄存器的地址之上還是之下,地址是在存儲第1個值之前還是之后增加還是減少。

下圖說明了4種不同情況的多字節(jié)傳送指令傳送前后的內(nèi)存變化,以及使用自動尋址時如何修改基址寄存器。指令執(zhí)行前的基寄存器是R9,指令執(zhí)行后的基寄存器是R9’。STMIAR9!,{R0,R1,R5}STMIBR9!,{R0,R1,R5}STMDAR9!,{R0,R1,R5}STMDBR9!,{R0,R1,R5}3.2.7堆棧尋址堆棧是一種按特定順序進(jìn)行存取的存儲區(qū)?!昂筮M(jìn)先出”(LIFO)。棧指針?biāo)付ǖ拇鎯卧褪嵌褩5臈m?。存儲器堆??煞譃閮煞N:向上生長:即向高地址方向生長,稱為遞增堆棧(ascendingstack)。向下生長:即向低地址方向生長,稱為遞減堆棧(descendingstack)。堆棧指針指向最后壓入堆棧的有效數(shù)據(jù)項(xiàng),稱為滿堆棧(fullstack)。堆棧指針指向下一個數(shù)據(jù)項(xiàng)放入的空位置,稱為空堆棧(emptystack)。

ARM對堆棧的使用一般用多寄存器傳送指令,是一種有效的保存處理器狀態(tài)和多字節(jié)傳送的有效方式。ARM硬件中的堆棧分為以下四種類型:①滿向上生長型(FA):堆棧按高地址方向生長,當(dāng)前堆棧指針指向最高有效值;②空向上生長型(EA):堆棧按高地址方向生長,當(dāng)前堆棧指針指向第一個空值;③滿向下生長型(FD):堆棧按低地址方向生長,當(dāng)前堆棧指針指向最低有效值;④空向下生長型(ED):堆棧按低地址方向生長,當(dāng)前堆棧指針指向第一個空值。

若R3~R9保存的是有用的值,就應(yīng)該把它們壓進(jìn)堆棧進(jìn)行保存。即STMFDR13!,{R3-R9};

存儲寄存器到堆棧。。。。。。LDMFDR13!,{R3-R9};

從堆?;謴?fù)其中第一條和最后一條指令的“FD”表明是滿遞減堆棧尋址方式。

堆棧和塊拷貝角度的多寄存器加載和存儲指令映射堆棧用一般數(shù)據(jù)存取L位存取P位前變址/后變址U位加/減空向下生長型(之前增量)LDMEDLDMIB111滿向下生長型(之后增量)LDMFDLDMIA101空向上生長型(之前增量)LDMEALDMDB110滿向上生長型(之后增量)LDMFALDMDA100滿向上生長型(之前增量)STMFASTMIB011空向上生長型(之后增量)STMEASTMIA001空向下生長型(之前增量)STMFDSTMDB010滿向下生長型(之后增量)STMEDSTMDA0003.2.8相對尋址相對尋址是變址尋址的一種變通,由程序計數(shù)器PC提供基地址。指令中的地址碼字段作為位移量。BLSUBR;轉(zhuǎn)移到SUBR……;返回到此……SUBR…;子程序入口地址MOVPC,R14;返回3.3ARM數(shù)據(jù)處理指令3.3數(shù)據(jù)處理指令數(shù)據(jù)傳輸指令:mov和mvn算數(shù)指令:add、adc、sub、sbc,rsb和rsc邏輯指令:and、orr、eor和bic比較指令:cmp、cmn、tst和teq3.3.1數(shù)據(jù)處理指令的特點(diǎn)所有的操作數(shù)要么來自寄存器,要么來自立即數(shù),不會來自內(nèi)存。如果有結(jié)果,則結(jié)果一定是為32位寬,并且放在一個寄存器中,不會寫入內(nèi)存。(有一個例外:長乘法指令產(chǎn)生64位結(jié)果)每一個操作數(shù)寄存器和結(jié)果寄存器都在指令中獨(dú)立指出,即:ARM指令采用3地址模式:<Operation>Rd,Rn,Rm3.3.2四種尋址方式和s后綴addr0,r1,r2addr0,r1,#0xffaddr0,r1,r1,LSLr2CondSRnRd第2操作數(shù)078111215161920opcode212400X25272831#immed_8#rot0781100000000Rm03411方式1:#immed方式2:Rm0000Rm03411Rs78方式3:RmLSLRsshiftRm03411#immed_567方式4:RmLSL#immed_5(#immed_5取值范圍0-31)addr0,r1,r1,LSL#31(1)四種尋址方式的硬件支持寄存器,可能需要移位。如需移位,移位值可為:5bit的無符號整數(shù)(0-31)在指令的最低字節(jié)指定的另一寄存器立即數(shù)

8比特數(shù)8比特數(shù)循環(huán)右移偶數(shù)位右移位數(shù)由匯編器自動計算(2)立即數(shù)方式ARM指令中的立即數(shù),由一個8bit的常數(shù)循環(huán)右移偶數(shù)位得到:立即數(shù)=(0->255)循環(huán)右移

2N位例子:合法立即數(shù):0x3fc,0x0,0xf0000000,0xf0000001非法立即數(shù):0x1fe,0xffff,0x1010,0xf0000010(2)立即數(shù)方式(續(xù))同一個立即數(shù)可能有多個表示方法。如:0x3f0=0x3f循環(huán)右移28位0x3f0=0xfc循環(huán)右移30位對立即數(shù)的編碼規(guī)則:如果立即數(shù)在0–0xff之間,移位數(shù)為0。否則,就取決于編譯器了。指令“movr0,#0x3f0”在ADS1.2中被編譯為0xe3a00ffc,在arm-elf-gcc-2.95.3中被編譯為0xe3a00e3f。(2)立即數(shù)方式(續(xù))對于有互補(bǔ)操作的指令,編譯器可以做智能的轉(zhuǎn)換,比如:mvnr1,0xffffff00 -> movr1,0xffaddr1,r1,#0xffffff00 -> subr1,r1,#0x100adcr1,r1,#0xffffff00 -> sbcr1,r1,#0xffandr1,r1,#0xffffff00 -> bicr1,r1,#0xff

這樣,一些原本非法的立即數(shù)也可以正常編譯通過。如果一個立即數(shù),經(jīng)過上述轉(zhuǎn)換后是合法的,那么它也可以用在數(shù)據(jù)操作指令中。(3)寄存器移位尋址ASR 算術(shù)右移LSL 邏輯左移LSR 邏輯右移

ROR循環(huán)右移RRX 擴(kuò)展的循環(huán)右移(3)寄存器移位尋址(續(xù))如果移位的位數(shù)由立即數(shù)(5bit,取值范圍0-31)給出,就叫作immediatespecifiedshift;如果由Rs的低5位決定,就叫做registerspecifiedshift。Registerspecifiedshift的兩點(diǎn)問題:不能使用pc:如果將pc寄存器用在Rn,Rd,Rm和Rs的位置上時,會產(chǎn)生不可預(yù)知的結(jié)果。額外代價(overhead):需要更多的周期才能完成指令,因?yàn)锳RM沒有能力一次讀取3個寄存器。Immediatespecifiedshift沒有上述問題。(3)寄存器移位尋址(續(xù))在registerspecifiedshift尋址方式下使用pc寄存器,編譯器提示如下警告:在ADS1.2種編譯產(chǎn)生如下警告之一:WarningA1477W:ThisregistercombinationresultsinUNPREDICTABLEbehaviorWarning:A1320E:Undefinedeffect(usingPCasRnorRminregisterspecifiedshift)Warning:A1319E:Undefinedeffect(usingPCasRs)但是在arm-elf-gcc-2.95.3中沒有報告錯誤。(4)后綴s數(shù)據(jù)處理指令可以選擇s后綴,以影響狀態(tài)標(biāo)志。但是比較指令(cmp、cmn、tst和teq)不需要后綴s,它們總會直接影響cpsr中的狀態(tài)標(biāo)志。在數(shù)據(jù)操作指令中,除了比較指令以外,其它的指令如果帶有s后綴,同時又以pc為目標(biāo)寄存器進(jìn)行操作,則操作的同時從spsr恢復(fù)cpsr。比如:movspc,#0xff /*cpsr=spsr;pc=0xff*/addspc,r1,#0xffffff00/*cpsr=spsr;pc=r1+0xffffff00*/andspc,r1,r2 /*cpsr=spsr;pc=r1&r2;*/如果在user或者system模式下使用帶有s后綴的數(shù)據(jù)操作指令,同時以pc為目標(biāo)寄存器,那么會產(chǎn)生不可預(yù)料的結(jié)果。因?yàn)閡ser和system模式下沒有spsr。3.3.3數(shù)據(jù)傳輸指令語法<Operation>{<cond>}{s}<Rd>,#<immed><Operation>{<cond>}{s}<Rd>,<Rm><Operation>{<cond>}{s}<Rd>,<Rm>,LSL#<immed_5><Operation>{<cond>}{s}<Rd>,<Rm>,LSL<Rs>偽代碼

ifConditionPassed(cond)then Rd=第2操作數(shù)

ifs==1andRd==pcthen

cpsr==spsr elseifs==1then setNZCVflagsincpsr3.3.3數(shù)據(jù)傳輸指令(續(xù))舉例mov r0,r1 /*r0=r1,不修改cpsr*/mov r0,#0x0 /*r0=0,不修改cpsr*/movs r0,#0x0 /*r0=0,同時設(shè)置cpsr的Z位*/movs r0,#-10 /*r0=0xfffffff6,同時設(shè)置cpsr的N位*/mvn r0,r2 /*r0=NOTr2,不修改cpsr*/mvn r0,0xffffffff /*r0=0x0,不修改cpsr*/mvns r0,0xffffffff /*r0=0x0,同時設(shè)置cpsr的Z位*/mov r0,r1,LSL#1 /*r0=r1<<1*/mov r0,r1,LSRr2

/*r0=r1>>r2*/3.3.3數(shù)據(jù)傳輸指令(續(xù))說明mvn意為“取反傳輸”,它把源寄存器的每一位取反,將得到的結(jié)果寫入結(jié)果寄存器。movs和mvns指令對pc寄存器賦值時有特殊含義,表示要求在賦值的同時從spsr中恢復(fù)cpsr。對于mov和mvn指令,編譯器會進(jìn)行智能的轉(zhuǎn)化。比如指令“movr1,0xffffff00”中的立即數(shù)是非法的。在編譯時,編譯器將其轉(zhuǎn)化為“mvnr1,0xff”,這樣就不違背立即數(shù)的要求。所以對于mov和mvn指令,可以認(rèn)為:合法的立即數(shù)反碼也是合法的立即數(shù)。3.3.4算術(shù)指令語法<Operation>{<cond>}{s}<Rd>,<Rn>,#<immed><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm>,LSL#<immed_5><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm>,LSL<Rs>偽代碼(以加法add為例)

ifConditionPassed(cond)then Rd=Rn+第2操作數(shù)

ifs==1andRd==pcthen

cpsr=spsr elseifs==1then setNZCVflagsincpsr3.3.4算術(shù)指令(續(xù))舉例add r0,r1,r2 /*r0=r1+r2*/adc r0,r1,r2 /*r0=r1+r2+carry*/sub r0,r1,r2 /*r0=r1–r2*/sbc r0,r1,r2 /*r0=r1–r2+carry-1*/rsb r0,r1,r2 /*r0=r2–r1*/rsc r0,r1,r2 /*r0=r2–r1+carry–1*/add r0,r1,r1,LSL#31 /*r0=r1+r1<<31*/add r0,r1,r1,LSLr2 /*r0=r1+r1<<r2*/說明adds和adcs在進(jìn)位時將cpsr的C標(biāo)志置1;否則置0。subs和sbcs在產(chǎn)生借位時將cpsr的C標(biāo)志置0;否則置1。3.3.5邏輯指令語法<Operation>{<cond>}{s}<Rd>,<Rn>,#<immed><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm>LSL#<immed_5><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm>LSL<Rs>偽代碼(以and為例)

IfConditionPassed(cond)then Rd=RnAND第2操作數(shù)

ifs==1andRd==pcthen

cpsr=spsr elseifs==1then setNZCVflagsincpsr3.3.5邏輯指令(續(xù))舉例and r0,r1,r2 /*r0=r1ANDr2*/and r1,r1,#0xffffff00/*r1=r1AND0xffffff00*/orr r0,r1,r2 /*r0=r1ORr2*/eor r0,r1,r2/*r0=r1XORr2*/bic r0,r1,r2 /*r0=r1ANDNOTr2*/bic r1,r1,#0x0f /*清空r1的低4位*/and r0,r1,r1,LSL#31 /*r0=r1AND(r1<<31)*/and r0,r1,r1,LSRr2 /*r0=r1AND(r1>>r2)*/3.3.6比較指令語法<Operation>{<cond>}<Rn>,#<immed><Operation>{<cond>}<Rn>,<Rm><Operation>{<cond>}<Rn>,<Rm>,LSL#<immed_5><Operation>{<cond>}<Rn>,<Rm>,LSL<Rs>偽代碼(以cmp為例)

IfConditionPassed(cond)then

alu_out=Rn–第2操作數(shù)

setNZCVflagsincpsr3.3.6比較指令(續(xù))舉例cmp r1,r2/*根據(jù)r1–r2的結(jié)果設(shè)置cpsr,結(jié)果不寫回*/cmn r1,r2/*根據(jù)r1+r2的結(jié)果設(shè)置cpsr,結(jié)果不寫回*/tst r1,r2/*根據(jù)r1ANDr2的結(jié)果設(shè)置cpsr,結(jié)果不寫回*/teq r1,r2/*根據(jù)r1XORr2的結(jié)果設(shè)置cpsr,結(jié)果不寫回*/cmp r2,#5/*根據(jù)r2–5的結(jié)果設(shè)置cpsr,結(jié)果不寫回*/cmp r1,r2,LSL#5 /*根據(jù)r1–(r2<<5)設(shè)置cpsr*/cmp r1,r2,LSLr3 /*根據(jù)r1–(r2<<r3)設(shè)置cpsr*/

說明如果不考慮結(jié)果的寫回,cmp、cmn、tst和teq分別等價于subs、adds、ands和eors。3.3.7乘法指令MUL32位乘法MLA32位帶加數(shù)的乘法指令SMULL64位有符號數(shù)乘法指令SMLAL64位帶加數(shù)的有符號數(shù)乘法指令UMULL64位無符號數(shù)乘法指令UMLAL64位帶加數(shù)的無符號數(shù)乘法指令MUL{<cond>}{s}<Rd>,<Rm>,<Rs>MLA{<cond>}{s}<Rd>,<Rm>,<Rs>,<Rn>SMULL{<cond>}{s}<RdLo>,<RdHi>,<Rm>,<Rs>SMLAL{<cond>}{s}<RdLo>,<RdHi>,<Rm>,<Rs>UMULL{<cond>}{s}<RdLo>,<RdHi>,<Rm>,<Rs>UMLAL{<cond>}{s}<RdLo>,<RdHi>,<Rm>,<Rs>MULR0,R1,R2;R0=R1*R2MLAR0,R1,R2,R3;R0=R1*R2+R3SMULLR1,R2,R3,R4;R1=R3*R4(低32位);R2=R3*R4(高32位)SMLALR1,R2,R3,R4;R2R1=R3*R4+R2R1UMULLR1,R2,R3,R4;R2R1=R3*R4UMLALR1,R2,R3,R4;R2R1=R3*R4+R2R13.3.7雜類的算術(shù)指令CLZ前導(dǎo)0個數(shù)計算指令,用于計算操作數(shù)最高端0的個數(shù)。計算操作數(shù)規(guī)范化時需要左移的位數(shù)。確定一個優(yōu)先級掩碼中最高優(yōu)先級。CLZ{<cond>}<Rd>,<Rm>3.4程序狀態(tài)訪問指令3.4程序狀態(tài)訪問指令當(dāng)需要修改cpsr/spsr的內(nèi)容時,首先要讀取它的值到一個通用寄存器,然后修改某些位,最后將數(shù)據(jù)寫回到狀態(tài)寄存器。cpsr/spsr不是通用寄存器,不能使用mov指令來讀寫。在ARM處理器中,只有mrs指令可以讀取cpsr/spsr;只有msr可以寫cpsr/spsr。程序狀態(tài)寄存器

條件標(biāo)識位N=

結(jié)果為負(fù)Z=結(jié)果為零C=進(jìn)位V=溢出Q標(biāo)識位只在5TE/J系列中有效指示stickyoverflow的發(fā)生J標(biāo)識位僅在5TEJ系列中有效J=1:處理器處于Jazelle狀態(tài)中斷使能位I=1:禁止IRQ.F=1:禁止FIQ.T標(biāo)識位只在xT

系列內(nèi)核中有效T=0:處理器處于ARM狀態(tài)T=1:處理器處于Thumb狀態(tài)模式位指示當(dāng)前處理器模式2731NZCVQ2867IFTmode162381554024fsxc

UndefinedJ3.4.1讀指令mrs語法mrs{<cond>}<Rd>,cpsr|spsr偽代碼

ifConditionPassed(cond)then ifR==1then Rd=spsr else Rd=cpsr3.4.1讀指令mrs(續(xù))舉例mrs r0,cpsr /*讀取cpsr到r0*/mrs r3,spsr /*讀取spsr到r3*/說明user和system模式?jīng)]有spsr,因此這些模式下不能讀取spsr。3.4.2寫指令msr的二進(jìn)制格式0condR10fsxc1111操作數(shù)01112151619202122102324#25002627283118位立即數(shù)#rot0781100000000Rm03411cpsr/spsr域屏蔽立即數(shù)對準(zhǔn)操作數(shù)寄存器(1)寫指令msr的語法msr{<cond>}<psr>_<fields>,#<immed>msr{<cond>}<psr>_<fields>,<Rm><immed>表示合法的立即數(shù):8bit循環(huán)右移偶數(shù)位<psr>代表cpsr或spsr<fields>指定傳送的區(qū)域,可進(jìn)一步細(xì)分(只能小寫)c 控制域字節(jié)(psr[7:0])x 擴(kuò)展域字節(jié)(psr[15:8]) s 狀態(tài)域字節(jié)(psr[23:16])f 標(biāo)志域字節(jié)(psr[31:24]) (2)寫指令msr的偽代碼偽代碼ifConditionPassed(cond)then ifopcode[25]==1 operand=8立即數(shù)Rotate_Right(#rot*2) else/*opcode[25]==0*/operand=Rm ifR==0then iffield_mask[0]==1andInAPrivilegeMode()thencpsr[7:0]=operand[7:0] iffield_mask[1]==1andInAPrivilegeMode()thencpsr[15:8]==operand[15:8] iffield_mask[2]==1andInAPrivilegeMode()thencpsr[23:16]==operand[23:16] iffield_mask[3]==1thencpsr[31:24]=operand[31:24] else/*R==1*/ iffield_mask[0]==1andCurrentModeHasSPSR()thenspsr[7:0]=operand[7:0] iffield_mask[1]==1andCurrentModeHasSPSR()thenspsr[15:8]==operand[15:8] iffield_mask[2]==1andCurrentModeHasSPSR()thenspsr[23:16]==operand[23:16] iffield_mask[3]==1andCurrentModeHasSPSR()thenspsr[31:24]=operand[31:24](3)msr舉例和說明舉例msr

cpsr_c,#0xd3 /*切換到SVC模式*/msr

cpsr_cxsf,r3 /*cpsr=r3*/說明user和system模式?jīng)]有spsr,因此這些模式下不能對spsr操作。由于權(quán)限問題,在user模式下對cpsr[23:0]修改無效。如果使用立即數(shù),要使用合法的立即數(shù)。程序不能同過“msr修改cpsr的T位”來完成ARM/Thumb態(tài)的切換。必須使用bx指令,因?yàn)閎x屬于分支指令,它會打斷流水線,實(shí)現(xiàn)處理器狀態(tài)切換。如果要修改讀出的值,僅修改必要的位,其它位保持不變,這樣保持了最大兼容性。

mrsr14,CPSR;gettheprocessorstatus

bicr14,r14,#CPSR_Mode_Mask

orrr14,r14,#(CPSR_Mode_SVC:OR:CPSR_Int_Mask)

msrcpsr_cf,r14;SVC32modewithinterruptsdisabled3.5跳轉(zhuǎn)指令3.5跳轉(zhuǎn)指令語法b{<cond>}labelbl{<cond>}label說明尋址范圍+32MB3.5跳轉(zhuǎn)指令(續(xù))當(dāng)轉(zhuǎn)移指令執(zhí)行時,處理器將指令中的offset(24bit)左移2bit,變成26bit,表示+32M的范圍。pc從新的地址執(zhí)行,流水線重新填充。如果是“bl”指令,將返回地址寫入lr寄存器。子程序返回時只需要用lr恢復(fù)pc就可以:movpc,lr“b”指令不影響lr寄存器

ENTRY;;Exceptionvectors;VectortablebReset_Handler

Exceptions

ldrpc,Undefined_Handler_addr

ldrpc,SWI_Handler_addr

ldrpc,Prefetch_Handler_addr

ldrpc,Abort_Handler_addr

nop

ldrpc,IRQ_Handler_addr

ldrpc,FIQ_Handler_addrVectortableEnd

VectorTableVectortablecanbeat

0xFFFF0000onARM720T

andonARM9/10familydevicesFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset0x1C0x180x140x100x0C0x080x040x00異常處理3.6單數(shù)據(jù)訪存指令3.6單數(shù)據(jù)訪存指令第一類:讀寫字: ldr/str讀寫無符號字節(jié): ldrb/strb第二類:讀寫無符號半字: ldrh/strh讀有符號半字: ldrsh讀有符號字節(jié): ldrsb3.6.1第一類指令的指令格式0000000000Rm03411方式2:Rm例子:ldrr0,[r1,+r2]011#immed_12方式1:#immed_12(取值范圍0–0xfff)例子:ldrr0,[r1,#+0xfff]shiftRm03411#immed_567方式3:RmLSL#immed_5(取值范圍0-31)例子:ldrr0,[r1,r2LSL#31]050/1:str/ldr0/1:無/有(!)0/1:后變址/前變址0/1:字/無符號字節(jié)condRnRd第2操作數(shù)07811121516192022012728312324UBWL2126PI250/1:加/減(第2操作數(shù))0/1:立即數(shù)(方式1)/寄存器(方式2,3)3.6.2第一類指令的語法語法ldr|str{<cond>}<Rd>,[<Rn>,#+<immed_12]{!}ldr|str{<cond>}<Rd>,[<Rn>,+<Rm>]{!}ldr|str{<cond>}<Rd>,[<Rn>,+<Rm>,<shift>#<immed_5>]{!}ldr|str{<cond>}<Rd>,[<Rn>],#+<immed_12ldr|str{<cond>}<Rd>,[<Rn>],+<Rm>ldr|str{<cond>}<Rd>,[<Rn>],+<Rm>,<shift>#<immed_5>舉例ldrbr0,[r1,#+0xfff]/*把r1+0xfff地址的字節(jié)讀入r0*/ldrr0,[r1,+r2]! /*把r1+r2地址的32比特數(shù)讀入r0,然后r1=r1+r2*/strr0,[r1,+r2,LSL#31] /*把r0(32bit)寫到地址r1+(r2<<31)*/ldrr0,[r1],#+0xfff /*把r1地址的數(shù)讀入r0,然后r1=r1+0xfff*/ldrr0,[r1],+r2 /*把r1地址的數(shù)讀入r0,然后r1=r1+r2*/ldrr0,[r1],+r2,LSL#31/*把r1地址的數(shù)讀入r0,然后r1=r1+(r2<<31)*/3.6.2第一類指令說明說明ldr/str

讀/寫一個32bit字到/從一個32bit的寄存器,要求讀/寫地址字對齊。ldrb:讀一個8bit字節(jié)到一個32bit的寄存器,不要求地址對齊,寄存器的高24位清零。strb:將寄存器的低8位,寫入內(nèi)存的某個地址。不要求地址對齊。3.6.3第二類指令語法同第一類指令說明ldrh:讀取16bit半字到一個32bit寄存器,要求地址半字對齊,目標(biāo)寄存的高16bit清零。strh:將寄存器的低16bit存放到內(nèi)存中,要求地址半字對齊。ldrsh:將內(nèi)存中的一個16bit半字讀到一個32bit寄存器中,要求地址半字對齊。寄存器高16bit根據(jù)符號位擴(kuò)展。ldrsb:將內(nèi)存中的一個8bit字節(jié)讀到一個32bit寄存器中,寄存器高24bit根據(jù)符號位擴(kuò)展。不要求地址對齊。3.6.4前/后變址0000000000Rm03411方式2:Rm例子:ldrr0,[r1,+r2]011#immed_12方式1:#immed_12(取值范圍0–0xfff)例子:ldrr0,[r1,#+0xfff]shiftRm03411#immed_567方式3:RmLSL#immed_5(取值范圍0-31)例子:ldrr0,[r1,r2LSL#31]050/1:str/ldr0/1:無/有(!)0/1:后變址/前變址0/1:字/無符號字節(jié)condRnRd第2操作數(shù)07811121516192022012728312324UBWL2126PI250/1:加/減(第2操作數(shù))0/1:立即數(shù)(方式1)/寄存器(方式2,3)(1)簡單的基址尋址基址寄存器數(shù)據(jù)訪問strr0,[r1]ldrr2,[r1](2)前變址尋址strr0,[r1,#12];/*{!}mem32[r1+12]=r0;r1=r1;/*{r1=r1+12;}(3)后變址尋址數(shù)據(jù)訪問strr0,[r1],#12mem32[r1]=r0;r1=r1+12;3.6.5

三種尋址方式(第一類)0000000000Rm03411方式2:Rm例子:ldrr0,[r1,+r2]011#immed_12方式1:#immed_12(取值范圍0–0xfff)例子:ldrr0,[r1,#+0xfff]shiftRm03411#immed_567方式3:RmLSL#immed_5(取值范圍0-31)例子:ldrr0,[r1,r2LSL#31]050/1:str/ldr0/1:無/有(!)0/1:后變址/前變址0/1:字/無符號字節(jié)condRnRd第2操作數(shù)07811121516192022012728312324UBWL2126PI250/1:加/減(第2操作數(shù))0/1:立即數(shù)(方式1)/寄存器(方式2,3)3.6.5尋址方式1—立即數(shù)變址尋址ldr|str{<cond>}<Rd>,[<Rn>,#+<immed_12>]{!}ldr|str{<cond>}<Rd>,[<Rn>],#+<immed_12>說明:無嘆號的前變址,當(dāng)pc作為Rn時,內(nèi)存基地址為當(dāng)前指令地址加8字節(jié)偏移;后變址或有嘆號的前變址,當(dāng)pc作為Rn時,會產(chǎn)生不可預(yù)知的結(jié)果在ADS1.2中,提示錯誤Error:A1324EUndefinedeffect(PC+writeback)在arm-elf-gcc-2.95.3中,沒有提示后變址或有嘆號的前變址,如果Rn和Rd是同一個寄存器,編譯出錯在ADS1.2中,提示錯誤Error:A1325E:Undefinedeffect(destinationsameaswritten-backbase)在arm-elf-gcc-2.95.3中,提示W(wǎng)arning:destinationregistersameaswrite-backbase如果immed_12超過0xfff,編譯會出錯在ADS1.2中,提示錯誤Error:A1174E:Datatransferoffsetoutofrange在arm-elf-gcc-2.95.3中,提示Error:addressoffsettoolarge3.6.5尋址方式2—寄存器變址尋址ldr|str{<cond>}{B}<Rd>,[<Rn>,+<Rm>]{!}ldr|str{<cond>}{B}<Rd>,[<Rn>],+<Rm>說明:無論如何,pc都不能作Rm。無嘆號的前變址,當(dāng)pc作為Rn時,內(nèi)存基地址為當(dāng)前指令地址加8字節(jié)偏移;后變址或有嘆號的前變址,當(dāng)pc作為Rn時,會產(chǎn)生不可預(yù)知的結(jié)果。后變址或有嘆號的前變址,如果Rn和Rd是同一個寄存器,會出現(xiàn)不可預(yù)知的結(jié)果。3.6.5尋址方式3-寄存器移位變址尋址ldr|str{<cond>}{B}<Rd>,[<Rn>,+<Rm>,<shift>#<immed_5>]{!}ldr|str{<cond>}{B}<Rd>,[<Rn>],+<Rm>,<shift>#<immed_5>說明:無論如何,pc都不能作Rm。無嘆號的前變址,當(dāng)pc作為Rn時,內(nèi)存基地址為當(dāng)前指令地址加8字節(jié)偏移;后變址或有嘆號的前變址,當(dāng)pc作為Rn時,會產(chǎn)生不可預(yù)知的結(jié)果。后變址或有嘆號的前變址,如果Rn和Rd是同一個寄存器,會出現(xiàn)不可預(yù)知的結(jié)果。如果immed_5超過31,編譯器報錯。3.7多數(shù)據(jù)訪存指令3.7多數(shù)據(jù)訪存指令批量訪存指令可以實(shí)現(xiàn)一組(1-16)寄存器和一塊(4-64字節(jié))連續(xù)內(nèi)存單元之間的數(shù)據(jù)傳輸。3.7.1指令格式3.7.2ldm/stm指令的語法語法ldm|stm{<cond>}<addressing_mode><Rn>{!},<registers>{^}<addressing_mode>有4種:IA(IncrementAfter) 事后遞增IB(IncrementBefore) 事先遞增DA(DecrementAfter) 事后遞減DB(DecrementBefore) 事先遞減例子ldmiar0,{r5-r8} /*將內(nèi)存中(r0)到(r0+12)4個字讀取到r5~r8的4個寄存器中*/ldmibr0,{r5-r8}/*將內(nèi)存中(r0+4)到(r0+16)4個字讀取到r5~r8的4個寄存器中*/ldmdar0,{r5-r8}/*將內(nèi)存中(r0-12)到(r0)4個字讀取到r5~r8的4個寄存器中*/ldmdbr0,{r5-r8}/*將內(nèi)存中(r0-16)到(r0)4個字讀取到r5~r8的4個寄存器中*/3.7.2ldm/stm指令的語法(續(xù))說明遞增方式和遞減方式處理寄存器列表和內(nèi)存地址對應(yīng)關(guān)系時采用不同的順序,見前面的例子??梢钥偨Y(jié)為:編號低的寄存器對應(yīng)低內(nèi)存地址。pc不能作為stm指令的<Rn>,否則結(jié)果不可預(yù)知。感嘆號“!”表示執(zhí)行后將更新<Rn>?!癪”不能在usr和system模式下使用,否則結(jié)果不可預(yù)知。在其它模式下使用時,含義和寄存器列表是否包含pc有關(guān)。3.7.3ldm指令的三種用法編號!^pcldm指令不同的功能用法1是是是同(5),但是更新<Rn>32是是否編譯警告(ADS1.2):Warning:A1329W:Unsafeinstruction(forcedusermodexferwithwrite-backtobase)23是否是同(7),但是更新<Rn>14是否否同(8),但是更新<Rn>,且<Rn>不能出現(xiàn)在<registers>中15否是是數(shù)據(jù)讀取的同時,拷貝spsr到cpsr36否是否<registers>采用user模態(tài)下的寄存器27否否是同(8),可用于程序跳轉(zhuǎn)。18否否否正常讀取13.7.4stm指令的兩種用法編號!^ldm指令不同的功能用法1是是同(3),但是更新<Rn>22是否同(4),但是更新<Rn>。當(dāng)<Rn>是<registers>中編號最小的寄存器時,指令將<Rn>的初值保存;否則結(jié)果不可預(yù)測。13否是<registers>采用user模態(tài)下的寄存器24否否正常寫入13.7.5多數(shù)據(jù)訪存的程序例子/*r12指向源數(shù)據(jù)起點(diǎn)*//*r14指向源數(shù)據(jù)終點(diǎn)*//*r13指向目標(biāo)地址*/loop:

ldmiar12!,{r0-r11} /*讀48字節(jié)*/

stmiar13!,{r0-r11} /*寫48字節(jié)*/

cmpr12,r14 /*是否到末尾*/

bneloop /*重復(fù)循環(huán)*/3.7.6模擬棧ARM指令集中沒有用于棧的操作指令,但是可以用多數(shù)據(jù)訪存指令來模擬。(1)棧的分類棧的分類(按指針):棧指針指向最后一個被占用的地址

(FullStack)在push前需要先將棧指針減小棧指針指向下一個被占用的地址

(EmptyStack)在push之后需要將棧指針減小棧的分類(按方向):上升的棧(AscendingStack)向高地址擴(kuò)展下降的棧(DescendingStack)向低地址擴(kuò)展(2)模擬壓棧操作塊數(shù)據(jù)訪問指令棧訪問指令說明stmdastmed下降型空棧stmiastmea上升型空棧stmdbstmfd下降型滿棧stmibstmfa上升型滿棧(3)模擬退棧操作塊數(shù)據(jù)訪問指令棧訪問指令說明ldmdaldmfa上升型滿棧ldmialdmfd下降型滿棧ldmdbldmea上升型空棧ldmibldmed下降型空棧(4)模擬棧操作模擬stack的訪問stmfd/ldmfd :FullDescendingStackstmfa/ldmfa :FullAscendingStack.stmed/ldmed :EmptyDescendingStackstmea/ldmea :EmptyAscendingStack常見的情況stmfdsp!,{r0-r12,lr}//保存所有有寄存器(包括返回地址)……ldmfdsp!,{r0-r12,pc}//恢復(fù)所有寄存器(包括pc)(5)棧操作圖示3.8其它指令3.8其它指令信號量操作指令:用于進(jìn)程間的同步和互斥,提供對信號量的原子操作。異常中斷產(chǎn)生指令:用于系統(tǒng)調(diào)用和調(diào)試。3.8.1信號量操作指令語法swp|swpb{<cond>}<Rd>,<Rm>,[<Rn>]例子swpr1,r2,[r3] /*將內(nèi)存單元(r3)中的字讀取到r1,同時將r2中的數(shù)據(jù)寫入內(nèi)存單元(r3)中*/swpr1,r1,[r2] /*將r1寄存器內(nèi)容和內(nèi)存單元(r2)的內(nèi)容互換*/說明swpb讀取8bit數(shù)據(jù)到寄存器后會對高24位清零,寫到內(nèi)存的8bit數(shù)來自寄存器低8位3.8.1信號量操作指令(續(xù))3.8.2異常產(chǎn)生指令指令格式語法swi{<cond>}<immed_24>說明利用這種機(jī)制實(shí)現(xiàn)用戶模式對操作系統(tǒng)特權(quán)模式的程序調(diào)用,主要用于用戶程序調(diào)用操作系統(tǒng)的API。參數(shù)傳遞通常有兩種方法:指令中的24bit立即數(shù)指定API號,參數(shù)通過寄存器傳遞。忽略指令中的24bit立即數(shù),r0指定API號,其它參數(shù)通過其它寄存器傳遞。condImmed_240231111272831243.8.3中斷產(chǎn)生指令語法bkpt<immed_16>說明用于產(chǎn)生軟件斷點(diǎn)中斷。主要用于調(diào)試。ARMv5及以上版本支持。3.8.4協(xié)處理器指令A(yù)RM支持16個協(xié)處理器。ARM協(xié)處理器指令包含3類:用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作;用于ARM處理器寄存器和ARM協(xié)處理器寄存器之間的數(shù)據(jù)傳送操作;用于在ARM協(xié)處理器的寄存器和內(nèi)存單元之間傳送數(shù)據(jù)。CDP協(xié)處理器數(shù)據(jù)操作指令LDC協(xié)處理器數(shù)據(jù)讀取指令STC協(xié)處理器數(shù)據(jù)寫入指令MCRARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令MRC協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳輸指令3.9偽指令3.9偽指令在ARM匯編語言源程序中有些特殊助記符,它們沒有相對應(yīng)的操作碼或者機(jī)器碼,通常稱為偽指令,它們所完成的操作稱為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作的,由匯編程序在源程序的匯編期間進(jìn)行處理,僅在匯編過程中起作用。符號定義偽指令數(shù)據(jù)定義偽指令匯編控制偽指令信息報告?zhèn)沃噶詈曛噶钜约捌渌麄沃噶睢?.9.1符號定義偽指令Ⅰ用于定義ARM匯編程序中的變量、對變量賦值以及定義寄存器的別名等。用于定義局部變量的LCLA、LCLL、LCLS;

用于定義全局變量的GBLA、GBLL、GBLS

;用于對變量賦值的SETA、SETL、SETS

;為通用寄存器列表定義名稱的RLIST。

3.9.1符號定義偽指令Ⅱ

1.

LCLA、LCLL、LCLS格式:LCLA/LCLL/LCLS 局部變量名說明:LCLA、LCLL、LCLS偽指令用于定義一個匯編程序中的局部變量,并初始化,其中:LCLA定義一個局部的數(shù)字變量,初始化為0;LCLL定義一個局部的邏輯變量,初始化為F;LCLS定義一個局部的字符串變量,初始化為空串;這三條偽指令用于聲明局部變量,在其局部作用范圍內(nèi)變量名必須唯一。3.9.1符號定義偽指令Ⅲ

2.

GBLA、GBLL、GBLS格式:GBLA/GBLL/GBLS 變量名說明:GBLA、GBLL、GBLS偽操作定義一個匯編程序中的全局變量,并初始化,其中:GBLA定義一個全局?jǐn)?shù)字變量,并初始化為0;GBLL定義一個全局邏輯變量,并初始化為“F”;GBLS定義一個全局字符串變量,并初始化為空串;

這三條偽指令用于定義全局變量,因此在整個程序范圍內(nèi)變量名必須唯一。

3.9.1符號定義偽指令Ⅳ

3.SETA、SETL、SETS格式:變量名 SETA/SETL/SETS 表達(dá)式說明:SETA:給一個數(shù)字變量賦值;SETL:給一個邏輯變量賦值;SETS:給一個字符串變Ⅳ量賦值;格式中的變量名必須為已經(jīng)定義過的全局或局部變量,表達(dá)式為將要賦給變量的值。

3.9.1符號定義偽指令Ⅴ4.RLIST格式:名稱 RLIST {寄存器列表}說明:RLIST可用于對一個通用寄存器列表定義名稱,該名稱可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器為根據(jù)寄存器的編號由低到高訪問次序,與列表中的寄存器排列次序無關(guān)。

3.9.2數(shù)據(jù)定義偽指令Ⅰ用于為數(shù)據(jù)分配存儲單元,同時也可完成已分配存儲單元的初始化。

DCB DCW/DCWUDCD/DCDUDCQ/DCQUDCFS/DCFSUDCFD/DCFDUSPACEFIELDMAP 3.9.2數(shù)據(jù)定義偽指令Ⅱ1.

DCB:

標(biāo)號DCB表達(dá)式

說明:DCB用于分配一塊字節(jié)單元并用偽指令中指定的表達(dá)式進(jìn)行初始化。其中,表達(dá)式可以為使用雙引號的字符串或0——255的數(shù)字,DCB可用“=”代替。

2.

DCW/DCWU:

標(biāo)號DCW/DCWU表達(dá)式說明:DCW分配一段半字存儲單元并用表達(dá)式值初始化,它定義的存儲空間是半字對齊的。3.9.2數(shù)據(jù)定義偽指令Ⅲ3.

DCD/DCDU:

標(biāo)號 DCD/DCDU表達(dá)式說明:DCD偽指令用于分配一塊字存儲單元并用偽指令中指定的表達(dá)式初始化,它定義的存儲空間是字對齊的。DCD也可用“&”代替。

4.

DCQ/DCQU:標(biāo)號DCQ/DCQU表達(dá)式說明:DCQ用于分配一塊以8個字節(jié)為單位的存儲區(qū)域并用偽指令中指定的表達(dá)式初始化,它定義的存儲空間是字對齊的。DCQU功能跟DCQ類似,只是分配的存儲單元不嚴(yán)格字對齊。

3.9.2數(shù)據(jù)定義偽指令Ⅳ5.

DCFD/DCFDU:

標(biāo)號 DCFD/DCFDU 表達(dá)式說明:DCFD用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲單元并用偽指令中指定的表達(dá)式初始化,它定義的存儲空間是字對齊的,每個雙精度的浮點(diǎn)數(shù)占據(jù)兩個字單元。DCFDU功能跟DCFD類似,只是分配的存儲單元不嚴(yán)格字對齊。6.

DCFS/DCFSU:

標(biāo)號 DCFS/DCFSU 表達(dá)式說明:DCFS用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲單元并用表達(dá)式初始化,它定義的存儲空間是字對齊的,每個單精度浮點(diǎn)數(shù)使用一個字單元.DCFSU功能跟DCFS類似,只是分配的存儲單元不嚴(yán)格字對齊。

3.9.2數(shù)據(jù)定義偽指令Ⅴ7.

SPACE:

標(biāo)號 SPACE 表達(dá)式說明:SPACE用于分配一片連續(xù)的存儲區(qū)域并初始化為0,表達(dá)式為要分配的字節(jié)數(shù),SPACE也可用“%”代替。

8.

MAP:MAP 表達(dá)式[,基址寄存器]

說明:MAP定義一個結(jié)構(gòu)化的內(nèi)存表的首地址,“^”可以用來代替MAP。9.

FILED:

標(biāo)號 FIELD 字節(jié)數(shù)說明:FIELD用于定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域,“#”可用來代替FILED。

3.9.3匯編控制偽指令Ⅰ匯編控制偽操作用于指引匯編程序的執(zhí)行流程:

MACRO、MEND

IF、ELSE、ENDIF

WHILE、WEND

MEXIT3.9.3匯編控制偽指令Ⅱ1.

MACRO、MENDMACRO[$標(biāo)號] 宏名 [$參數(shù)1,$參數(shù)2,……]

指令序列

MEND

說明:MACRO表明一個宏定義的開始,MEND則表示一個宏的結(jié)束,MACRO、MEND前呼后應(yīng)可以將一段代碼定義為一個整體,又稱宏,然后就可以在程序中通過宏的名稱及參數(shù)調(diào)用該段代碼。

MACRO和MEND之間的代碼稱為宏定義體,在宏定義體的第一行聲明宏的原型,宏的原型包含宏名、所需的參數(shù)。在源程序被編譯時,匯編器將宏調(diào)用展開,用宏定義中的指令序列替換程序中的宏調(diào)用,并將實(shí)際參數(shù)的值傳遞給宏定義中的參數(shù)。注意宏操作可以嵌套使用,并可以在編譯時用選項(xiàng)加以控制。

3.9.3匯編控制偽指令Ⅲ2.IF、ELSE、ENDIFIF 邏輯表達(dá)式 代碼段1ELSE

代碼段2ENDIF說明:IF、ELSE、ENDIF偽操作能根據(jù)邏輯表達(dá)式的成立與否決定是否在編譯時加入某個指令序列。IF、ELSE、ENDIF可以分別用“[”、“|”、“]”代替。IF、ELSE、ENDIF偽指令可以嵌套使用。

3.9.3匯編控制偽

溫馨提示

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

評論

0/150

提交評論