




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1
第三章AVR匯編指令2計算機的指令系統是一套控制計算機操作的代碼(二進制),稱之為機器語言。計算機只能識別和執行機器語言的指令。難記!易出錯!為了便于人們理解、記憶及使用,通常用匯編語言指令來描述計算機的指令系統。匯編語言指令可通過匯編器(軟件,如AVRStudio,51系列的ASM51等)翻譯成計算機能識別的機器語言。相對較易記,不易出錯3CISC結構存在指令系統不等長,指令數多,CPU利用效率低,執行速度慢等缺陷
AVR單片機指令系統是先進的RISC體系結構,采用了大型快速存取寄存器組(32個通用工作寄存器)、快速的單周期指令系統以及單級流水線等先進技術
16/32位定長指令流水線操作大型快速存取寄存器組
4(1)89條指令器件:AT90S1200,最基本指令;(2)90條指令器件:Attiny11/12/15/22;90條指令=□+89條基本指令(3)118條指令器件:AT90S2313/2323/2343/2333,/4414/4433/4434/8515/90S8534/8535;118條指令=
+90條;(4)121條指令器件:ATmega603/103;121條指令=△+118條;(5)130條指令器件ATmega8535/161等;130條指令=☆+121條567ATmega16共有131條指令,按功能可分為5大類:算術和邏輯運算指令(28條);比較和跳轉指令(36條);數據傳送指令(35條);位操作和位測試指令(28條);MCU控制指令(4條)。83.1指令格式3.1.1指令格式AVR的指令的一般格式為:
目的地址
指令的三種表示方式指令的二進制表示形式
指令的十六進制形式
指令的助記符形式又稱為指令的匯編形式或匯編語句
操作碼第1操作數或操作數地址第2操作數或操作數地址93.1.2指令集名詞1、狀態寄存器SREG:狀態寄存器C:進位標志位Z:結果為零標志位N:結果為負數標志位(結果的最高位為1)V:2的補碼溢出指示位S:N⊕V,符號測試位H:半進位標志位T:用于BLD和BST指令傳送位I:全局中斷使能/禁止標志位10SREG112、寄存器和操作數
Rd:目的(或源)寄存器,R0~R31或R16~R31
Rr:源寄存器,R0~R31
R:指令執行后的結果
K:常數項或字節數據(8位)0~255或-128~+127
k:程序計數器的常量地址數據
b:在寄存器區中或I/O寄存器中的位(3位)0~7
s:在狀態寄存器中的位(3位)0~7
X,Y,Z:地址指針寄存器(X=R27:R26,Y=R29:R28,Z=R31:R30)
P(或A):I/O口地址0~63或0~31
q:地址偏移量常數(6位)0~6312133、堆棧STACK:作為返回地址和壓棧寄存器的堆棧SP:堆棧STACK的指針
143.1.3尋址方式指令的一個重要組成部分是操作數,指令給出參與運算的數據的方式稱為尋址方式。AVR單片機指令操作數的尋址方式有以下幾種:單寄存器直接尋址、雙寄存器直接尋址、I/O寄存器直接尋址、數據存儲器直接尋址、帶位移的數據存儲器間接尋址、數據存儲器間接尋址、帶預減量的數據存儲器間接尋址、帶后增量的數據存儲器間接尋址、從程序存儲器取常數尋址、程序直接尋址、程序間接尋址、程序相對尋址151、單寄存器直接尋址INCRd;Rd←Rd+1162、雙寄存器直接尋址ADDRd,Rr;Rd←Rd+Rr173、I/O寄存器直接尋址INRd,A;Rd←A(A為64個I/O寄存器之一)184、數據存儲器直接尋址LDSRd,K;Rd←(K)地址為K的SRAM的內容送Rd195、數據存儲器間接尋址LDRd,Y;Rd←(Y)注意與數據存儲器直接尋址的區別206、帶后增量的數據存儲器間接尋址LDRd,Y+;Rd←(Y),Y=Y+1217、帶預減量的數據存儲器間接尋址LDRd,-Y;Y=Y-1,Rd←(Y)228、帶位移的數據存儲器間接尋址LDDRd,Y+q;Rd←(Y+q)0≤q≤63;Y寄存器的內容不變!239、從程序存儲器取常數尋址LPM;R0←(Z)無操作數LPMR16,Z;R16←(Z)2410、帶后增量的程序存儲器空間
取常數尋址LPMRd,Z+;R16←(Z),Z←Z+12511、程序存儲器空間寫數據尋址用于在系統自編程,如軟件升級SPM;(Z)←R1:R02612、程序存儲器空間直接尋址JMP;mega系列2713、程序存儲器空間間接尋址IJMP;PC←(Z)2814、程序存儲器空間相對尋址RJMP;PC←PC+1+k-2048≤k≤20472915、數據存儲器空間SP間接尋址PUSHR0;STACK←R0,SP←SP-1POPR1;SP←SP+1,R1←STACK303.1.4AVR指令對標志位的影響在AVR的指令中,一類指令執行后要影響到狀態寄存器中某些標志位的狀態,即不論指令執行前標志位狀態如何,指令執行后總是根據執行結果的定義形成新的狀態標志。另一類指令在執行后不會影響標志位,標志位原來什么狀態,指令執行后標志狀態還是保持不變。由于AVR的CPU響應中斷時,硬件不保護狀態寄存器,所以在編寫中斷服務處理程序時,應注意將狀態寄存器進行保護(如用PUSH指令壓入到堆棧),在中斷返回前還要恢復狀態寄存器在進入中斷前時的標志狀態(如用POP指令從堆棧中彈出)31標志(Flags)
在AVR指令集文件中,指令對SREG的標志位的影響表示如下:?:標志受指令的影響Flagaffectedbyinstruction,在指令表“標志”欄寫出相應字母0:標志被指令清零Flagclearedbyinstruction,寫出相應字母并標以下標01:標志被指令置位Flagsetbyinstruction,寫出相應字母并標以下標1-:標志不受指令影響Flagnotaffectedbyinstruction,不寫出相應字母323.2算術和邏輯指令3.2.1加法指令ADD–AddwithoutCarry33例子34Example:
;AddR1:R0toR3:R2addr2,r0;Addlowbyteadcr3,r1;AddwithcarryhighbyteADC–AddwithCarry353.字加立即數ADIW–AddImmediatetoWordAddsanimmediatevalue(0-63)toaregisterpairandplacestheresultintheregisterpair.Thisinstructionoperatesontheupperfourregisterpairs,andiswellsuitedforoperationsonthepointerregisters.寄存器對與立即數(0~63)相加,結果放到寄存器對中36ADIWRd,K;Rd+1:Rd←Rd+1:Rd+K,d∈{24,26,28,30},0≤K≤63,PC←PC+1Example:
adiwr24,1;Add1tor25:r24
adiwZL,63;Add63totheZ-pointer(r31:r30)374.增1指令INC–IncrementINCRd;Rd←Rd+10≤d≤31寄存器Rd的內容加1,結果送目的寄存器Rd中。該操作不改變SREG中的C標志,所以允許INC指令在多倍字長計算中用作循環計數當對無符號數操作時,僅BREQ(相等跳轉)和BRNE(不為零跳轉)指令有效(即跟所期望的一樣)。當對二進制補碼值操作時,所有的帶符號跳轉指令都有效384.增1指令INC–IncrementExample:
clrr22;clearr22loop:incr22;incrementr22...cpir22,$4F;Comparer22to$4fbrneloop;Branchifnotequalnop;Continue(donothing)練習1+2+3+…+1039403.2.2減法指令1.不帶進位減法SUB–SubtractwithoutCarrySUBRd,Rr;Rd←Rd–Rr,0≤d≤31,0≤r≤31,PC←PC+1Example:subr13,r12;Subtractr12fromr13brnenoteq;Branchifr12<>r13...noteq:nop;Branchdestination(donothing)412.立即數減法(字節)SUBI–SubtractImmediateSUBIRd,K;Rd←Rd–K,16≤d≤31,0≤K≤255,PC←PC+1注意:沒有立即數加法(字節)指令!Example:subir22,$11;Subtract$11fromr22brnenoteq;Branchifr22<>$11...noteq:nop;Branchdestination(donothing)423.帶進位減法SBC–SubtractwithCarrySBCRd,Rr;Rd←Rd–Rr–C,0≤d≤31,0≤r≤31,PC←PC+1Example:;Subtractr1:r0fromr3:r2subr2,r0;Subtractlowbytesbcr3,r1;Subtractwithcarryhighbyte434.帶進位立即數減法
SBCI–SubtractImmediatewithCarrySBCIRd,K;Rd←Rd–K–C,16≤d≤31,0≤K≤255,PC←PC+1注意:沒有帶進位立即數加法指令!Example:;Subtract$4F23fromr17:r16subir16,$23;Subtractlowbytesbcir17,$4F;Subtractwithcarryhighbyte445.立即數減法(字)
SBIW–SubtractImmediatefromWord寄存器對與立即數(0~63)相減,結果放到寄存器對中SBIWRd,K;Rd+1:Rd←Rd+1:Rd-K,d∈{24,26,28,30},0≤K≤63,PC←PC+1Example:sbiwr24,1;Subtract1fromr25:r24
sbiwYL,63;Subtract63fromtheY-pointer(r29:r28)456.減1指令DEC–DecrementDECRd;Rd←Rd–1,0≤d≤31,PC←PC+1寄存器Rd的內容減1,結果送目的寄存器Rd中.該操作不改變SREG中的C標志,所以允許DEC指令在多倍字長計算中用作循環計數.當對無符號值操作時,僅有BREQ(不相等跳轉)和BRNE(不為零跳轉)指令有效。當對二進制補碼值操作時,所有的帶符號跳轉指令都有效46Example:
ldir17,$10;Loadconstantinr17loop:addr1,r2;Addr2tor1decr17;Decrementr17brneloop;Branchifr17<>0nop;Continue(donothing)473.2.3取反碼指令COM–取反碼One’sComplement(1的補碼)COMRd;Rd←$FF–Rd,0≤d≤31,PC←PC+1Example:comr4;Takeone’scomplementofr4breqzero;Branchifzero...zero:nop;Branchdestination(donothing)483.2.4取補指令NEG–取補碼Two’sComplement(2的補碼)注意:值$80不改變NEGRd;Rd←$00–Rd,0≤d≤31,PC←PC+1Example:subr11,r0;Subtractr0fromr11brplpositive;Branchifresultpositivenegr11;Taketwo’scomplementofr11positive:nop;Branchdestination(donothing)493.2.5比較指令1、寄存器比較CP–CompareCPRd,Rr;Rd–Rr,0≤d≤31,0≤r≤31,PC←PC+1該指令完成兩個寄存器Rd和Rr相比較操作,而寄存器的內容不改變。該指令后能使用所有條件跳轉指令(根據SREG中的相關標志位)50Example:lp:cpr24,r19;單步執行到此行,開始時在調試窗口的對應寄存器輸入數據
;第一次操作設:(r24)=$AA,(r19)=$55;第二次操作設:(r14)=$11,(r19)=$55brshlp1;(r24)≥(r19)則轉lp1,(r24)小于(r19)順執rjmplp2;lp1:subr24,r19;(r24)相減(r19)brnelp;(r24)不為0轉,為0順執lp2:adiwr24,$11;立即數加,要求d∈{24,26,28,30},0≤K≤63rjmplp;反復測試513.2.5比較指令2、帶進位比較CPC–ComparewithCarryCPCRd,Rr;Rd–Rr–C,0≤d≤31,0≤r≤31,PC←PC+1該指令完成兩個寄存器Rd和Rr相比較操作,并考慮了前面的進位(借位)C,而寄存器的內容不改變。該指令后能使用所有條件跳轉指令(根據SREG中的相關標志位)52Example:cpr2,r0
;單步執行到此行,開始時在調試窗口的對應寄存器輸入數據
;設:(R2)=$AA,(R0)=$55lp:sec;(c)=1cpcr3,r1
;第一次操作設:(r3)=$11,(r1)=$10,
;第二次操作設:(R3)=$12,(R1)=$10,brnelp1;比較不相等跳轉,相等順執
rjmplp2;相對跳轉
lp1:incr1;+1rjmplplp2:decr1;-1rjmplp;反復測試
533.2.5比較指令3、與立即數比較CPI–ComparewithImmediateCPIRd,K;Rd–K,16≤d≤31,0≤K≤255,PC←PC+1該指令完成寄存器Rd和常數的比較操作,而寄存器的內容不改變。該指令后能使用所有條件跳轉指令(根據SREG中的相關標志位)54Example:LP:CPIR19,3
;單步執行到此行,開始時在調試窗口的對應寄存器輸入數據
;設(R19)=4BRNELP1;不相等轉,相等順執
INCR19
;(R19)+1
RJMPLP;反復測試
LP1:DECR19
;(R19)-1
RJMPLP;反復測試編程實現Ifr16>r20R16++Elseif(r16<$10)R20++;ElseR20--55563.2.6邏輯與指令1、寄存器邏輯與AND–LogicalAND
ANDRd,Rr;Rd←Rd?Rr
,0≤d≤31,0≤r≤31,PC←PC+1寄存器Rd和寄存器Rr的內容位邏輯與,結果送目的寄存器Rd。應用:清0,使某位為0,用0去與;保留,用1去邏輯與;代替硬件與門57Example:addr2,r3
;設:(R2)=0B10000000,(R3)=0B00010011LDIR16,1;(R16)=0B00000001,andr2,r16;(R2)=?583.2.6邏輯與指令2、帶立即數與ANDI–LogicalANDwithImmediateANDIRd,K;Rd←Rd?K
,16≤d≤31,0≤K≤255,PC←PC+1寄存器Rd的內容與常數邏輯與,結果送目的寄存器Rd。應用:清0,使某位為0,用0去與;保留,用1去邏輯與;代替硬件與門59Example:andir17,$0F
;設:(r17)=$F0,(R18)=$EF,(R19)=$FF,單步執行后,(R17)=andir18,$10;(R18)=andir19,$AA;(R19)=603.2.6邏輯與指令3、寄存器位清零CBR–ClearBitsinRegisterCBRRd,K;Rd←Rd?($FF-K),16≤d≤31,0≤K≤255,PC←PC+1清除寄存器Rd中的指定位。利用寄存器Rd的內容與常數表征碼(constantmask)K的補碼(反碼!)相與完成的,其結果放在寄存器Rd中。61Example:lp:cbrR16,$F0;單步執行到此行,在調試窗口的對應寄存器輸入數據
;(r16)=$FF,Clearuppernibbleofr16CBRR18,1;(r18)=$80,Clearbit0inr18RJMPlp;反復測試623.2.6邏輯與指令4、測試寄存器為零或負TST–TestforZeroorMinus
TSTRd;Rd←Rd?Rd
,0≤d≤31,PC←PC+1測試寄存器是否是零或是負。完成同一寄存器之間的邏輯與操作,而寄存器內容不改變。63Example:subr0,r2;單步執行到此行,在調試窗口的對應寄存器輸入數據
;并打開狀態寄存器SREG觀察窗口
;(r0)=$aa,(r2)=$aa
;(r0)=$77,(r2)=$80lp:tstr0;測試寄存器r0是否是零或是負,breqlp1;如果零標志(Z)位為1,則跳轉,為0順執decr0;-1rjmplp;再測試lp1:incr0;+1rjmplp;再測試643.2.7邏輯或指令1、寄存器邏輯或OR–LogicalORORRd,Rr;Rd←RdvRr
,0≤d≤31,0≤r≤31,PC←PC+1完成寄存器Rd與寄存器Rr的內容邏輯或操作,結果進目的寄存器Rd中。應用:置數,使某位為1,用1去邏輯或;保留,用0去邏輯或;代替硬件或門
65Example:orr19,r16;邏輯或,單步執行到此行,在調試窗口的對應寄存器輸入數據
;(R19)=$AA,(R16)=$44,(R18)=0B01001111=$4F
;(R18)=0B00001111=$0FLP:bstr18,6;R18中的6位內容到SREG中T標志,觀察SREG中T標志的變化brtsok;SREG中標志為1跳轉,為0順執SERR18;置位R18RJMPLP;反復測試ok:CLRR18;清零R18RJMPLP;反復測試663.2.7邏輯或指令2、帶立即數或ORI–LogicalORwithImmediateORIRd,K;Rd←RdvK
,16≤d≤31,0≤K≤255,PC←PC+1寄存器Rd的內容與常數邏輯或,結果送目的寄存器Rd。應用:置數,使某位為1,用1去或;保留,用0去邏輯或;代替硬件或門
67Example:LP:orir19,$F0
;立即數或,單步執行到此行,在調試窗口的對應寄存器輸入數據
;(R19)=$A0,(R17)=$45
;(R19)=0B01101111=$6F,(R17)=0B11110000=$F0;Sethighnibbleofr19orir17,1
;立即數或
;Setbit0ofr17RJMPLP;反復測試683.2.7邏輯或指令3、置寄存器位SBR–SetBitsinRegisterSBRRd,K;Rd←RdvK,16≤d≤31,0≤K≤255,PC←PC+1對寄存器Rd中指定位置位。完成寄存器Rd和常數表征碼K之間的邏輯直接數或(ORI),結果送目的寄存器Rd。機器碼與功能均同ORI69Example:;設:(R16)=$F0,(R17)=$80lp:sbrr16,3;對R16的(0B00000011)第1、0位置1,執行后(R16)=sbrr17,$17;對R17的(0B00010111)第4、2、1、0位置1,執行后(R17)=
RJMPlp;反復測試703.2.7邏輯或指令4、置寄存器為$FFSER–SetallBitsinRegisterSERRd;Rd←$FF,16≤d≤31,PC←PC+1直接裝入$FF到寄存器Rd。71Example:LP:CLRR16;(R16)清零serr17;(R17)置$FFout$18,r16;輸出到B口,打開I/O寄存器窗口看$18變化nop;Delay(donothing)out$18,r17;輸出到B口,打開I/O寄存器窗口看$18變化
RJMPlp;反復測試723.2.8邏輯異或指令1、寄存器邏輯異或EOR–ExclusiveOREORRd,Rr;Rd←Rd⊕Rr
,0≤d≤31,0≤r≤31,PC←PC+1完成寄存器Rd與寄存器Rr的內容邏輯異或操作,結果進目的寄存器Rd中。輸入相同輸出為0,輸入不同輸出為173Example:LP:eorr4,r4;設:(R4)=0B10100011,相同數異或為清零
eorr0,r22;設:(R0)=0B10100101設:(R22)=0B01010011RJMPLP;反復測試743.2.8邏輯異或指令2、清除寄存器CLR–ClearRegister
CLRRd;Rd←Rd⊕Rd
,0≤d≤31,PC←PC+1寄存器清零。該指令采用寄存器Rd與自己的內容相異或實現的,寄存器的所有位都被清零75Example:clrr18;clearr18loop:incr18;increaser18...cpir18,$50;Comparer18to$50brneloop763.2.9乘法指令Mega系列才有此指令(需兩個時鐘周期)1、無符號數乘法MUL–MultiplyUnsignedMULRd,Rr;R1:R0←Rd×Rr(unsigned←unsigned×unsigned),0≤d≤31,0≤r≤31,PC←PC+1該指令完成8位X8位→16位的無符號數乘法操作。被乘數Rd和乘數Rr是兩個寄存器,16位結果放在R1(高字節)和R0(低字節)中。注意:如果被乘數和乘數選擇了R0或R1,則當進行乘法后原操作數將被覆蓋77Example:
lp:ldir6,$04ldir5,#05mulr6,r5;乘法
movr6,r1;保存乘積高位
movr5,r0;保存乘積低位
rjmplp783.2.9乘法指令2、有符號數乘法MULS–MultiplySignedMULSRd,Rr;R1:R0←Rd×Rr(signed←signed×signed),16≤d≤31,0≤r≤31,PC←PC+1該指令完成8位X8位→16位的有符號數乘法操作。被乘數Rd和乘數Rr是兩個寄存器,16位結果放在R1(高字節)和R0(低字節)中。Example:
mul r5,r4 ;Multiplyunsignedr5andr4
movw r4,r0 ;Copyresultbackinr5:r4 muls r21,r20;Multiplysignedr21andr20
movw r20,r0;Copyresultbackinr21:r20793.2.9乘法指令3、有符號數與無符號數乘法MULSU–MultiplySignedwithunsignedMULSURd,Rr;R1:R0←Rd×Rr(signed←signed×unsigned),16≤d≤23,16≤r≤23,PC←PC+1該指令完成8位(Rd,有符號)X8位(Rr,無符號)→16位(有符號)的乘法操作。16位結果放在R1(高字節)和R0(低字節)中。80Example: ;******************************************************************************
;*DESCRIPTION
;*Signedmultiplyoftwo16-bitnumberswith32-bitresult.
;*USAGE
;*r19:r18:r17:r16=r23:r22*r21:r20
;******************************************************************************
muls16x16_32:
clr r2
muls r23,r21 ;(signed)ah*(signed)bh movw r19:r18,r1:r0
mul r22,r20 ;al*bl
movw r17:r16,r1:r0
mulsu r23,r20 ;(signed)ah*bl
sbc r19,r2
add r17,r0
adc r18,r1
adc r19,r2
mulsu r21,r22 ;(signed)bh*al
sbc r19,r2
add r17,r0
adc r18,r1
adc r19,r2
ret813.2.9乘法指令4、無符號定點小數乘法FMUL–FractionalMultiplyUnsignedFMULRd,Rr;R1:R0←Rd×Rr(unsigned(1.15)←unsigned(1.7)×unsigned(1.7)),16≤d≤23,16≤r≤23,PC←PC+1該指令完成8位無符號數X8位無符號數的乘法操作,并將結果左移1位后保存在R1(高字節)和R0(低字節)中。82Example: ;******************************************************************************
;*DESCRIPTION
;*Signedfractionalmultiplyoftwo16-bitnumberswith32-bitresult.
;*USAGE
;*r19:r18:r17:r16=(r23:r22*r21:r20)<<1
;******************************************************************************
fmuls16x16_32:
clr r2
fmuls r23,r21 ;((signed)ah*(signed)bh)<<1
movw r19:r18,r1:r0
fmul r22,r20 ;(al*bl)<<1
adc r18,r2
movw r17:r16,r1:r0
fmulsu r23,r20 ;((signed)ah*bl)<<1
sbc r19,r2
add r17,r0
adc r18,r1
adc r19,r2
fmulsu r21,r22 ;((signed)bh*al)<<1
sbc r19,r2
add r17,r0
adc r18,r1
adc r19,r2 ret833.2.9乘法指令5、有符號定點小數乘法FMULS–FractionalMultiplySignedFMULSRd,Rr;R1:R0←Rd×Rr(signed(1.15)←signed(1.7)×signed(1.7)),16≤d≤23,16≤r≤23,PC←PC+1該指令完成8位有符號數X8位有符號數的乘法操作,并將結果左移1位后保存在R1(高字節)和R0(低字節)中。84Example:
fmuls r23,r22
;Multiplysignedr23andr22in(1.7)format,resultin(1.15)format
movw r23:r22,r1:r0
;Copyresultbackinr23:r22853.2.9乘法指令6、有符號定點小數和無符號定點小數乘法FMULSU–FractionalMultiplySignedwithUnsignedFMULSURd,Rr;R1:R0←Rd×Rr(signed(1.15)←signed(1.7)×unsigned(1.7)),16≤d≤23,16≤r≤23,PC←PC+1該指令完成8位有符號數X8位無符號數的乘法操作,并將結果左移1位后保存在R1(高字節)和R0(低字節)中。86Example: ;******************************************************************************
;*DESCRIPTION
;*Signedfractionalmultiplyoftwo16-bitnumberswith32-bitresult.
;*USAGE
;*r19:r18:r17:r16=(r23:r22*r21:r20)<<1
;******************************************************************************
fmuls16x16_32:
clr r2
fmuls r23,r21 ;((signed)ah*(signed)bh)<<1
movw r19:r18,r1:r0
fmul r22,r20 ;(al*bl)<<1
adc r18,r2
movw r17:r16,r1:r0
fmulsu r23,r20 ;((signed)ah*bl)<<1
sbc r19,r2
add r17,r0
adc r18,r1
adc r19,r2
fmulsu r21,r22 ;((signed)bh*al)<<1
sbc r19,r2
add r17,r0
adc r18,r1
adc r19,r2 ret練習16位乘法運算中為什么需要sbc r19,r2
和adc r19,r2?請舉例說明使用匯編實現N!8788893.3跳轉指令3.3.1無條件跳轉指令1、相對跳轉RJMP–RelativeJumpRJMPk;-2K≤k<2K(負數用補碼表示),PC←PC+k+1相對跳轉到PC-2K+1和PC+2K(字)范圍內的地址。對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)90Example:cpir16,$42;Comparer16to$42brneerror;Branchifr16<>$42rjmp
ok;Unconditionalbrancherror:addr16,r17;Addr17tor16incr16;Incrementr16ok:nop;Destinationforrjmp(donothing)好處:作為子程序模塊搬家(移動)較方便,不必修改里面的跳轉指令,缺點:子程序大小限在PC←PC+k+1912、間接跳轉IJMP–IndirectJumpIJMP;無操作數,PC←Z(15~0)間接跳轉到由寄存器區中的Z(16位)指針寄存器指向的地址。Z指針寄存器是16位寬,允許在當前程序存儲器空間64K字(128K字節)內跳轉。對SREG的標志位無影響優點:跳轉范圍大。缺點:作為子程序模塊,移植時需修改跳轉地址,希望在子程序中不要使用!不要給自已帶來麻煩!
92Example:movr30,r0;Setoffsettojumptableijmp;Jumptoroutinepointedtoby(r31:r30)3、直接跳轉JMP–Jump(mega系列等)JMPk;0≤k<4M,PC←k在整個程序存儲空間4M字地址內跳轉。優點:可跳轉到程序存儲器空間4M字任何地方;缺點:不適宜子程序摸塊中使用;933.3.2條件跳轉指令條件跳轉指令是依某種特定的條件跳轉的指令。條件滿足則跳轉,條件不滿足時則順序執行下面的指令1、測試條件符合跳轉指令(1)狀態寄存器SREG中的位置位跳轉BRBS–BranchifBitinSREGisSetBRBSs,k;0≤s≤7,-64≤k≤+63IfSREG(s)=1thenPC←PC+k+1,elsePC←PC+1。對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)94Example:LP:bstr0,3;設:(R0)=0B00001000;R0中第3位到SREG中的T標志
;設:(R0)=0B01000100;R0中第3位SREG中的T標志brbs6,LP1;SREG中的6位被置位(T=1)則跳轉,若為零順執SET;置T標志為1RJMPLP;反復測試LP1:CLT;T標志清RJMPLP;反復測試95(2)狀態寄存器SREG中的位清零跳轉BRBC–BranchifBitinSREGisClearedBRBCs,k;0≤s≤7,-64≤k≤+63IfSREG(s)=0thenPC←PC+k+1,elsePC←PC+1。對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)96Example:CPIR20,5;R20中內容與立即數05比,設(R20)=6或(R20)=5LP:BRBC1,LP1;SREG中位被清零則跳轉,為1順執CLZ;Z=0RJMPLP;反復測試LP1:SEZ;Z=1RJMPLP;反復測試97(3)相等跳轉BREQ–BranchifEqualBREQk;-64≤k≤+63IfRd=Rr(Z=1)thenPC←PC+k+1,elsePC←PC+1。如果在執行CP、CPI、SUB或SUBI指令后立即執行該指令,當且僅當寄存器Rd中無符號或有符號二進制數與寄存器Rr中無符號或有符號二進制數相等時,跳轉將發生(相當于BRBS1,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)98Example:lp:cpr1,r2;設:(R1)=$AA.(R2)=$AAbreqlp1;相等跳轉,不相等順執,請同時觀察Z標志incr1;+1rjmplp;反復驗證lp1:decr1;-1RJMPLP;反復驗證99(4)不相等跳轉BRNE–BranchifNotEqualBRNEk;-64≤k≤+63IfRd≠Rr(Z=0)
thenPC←PC+k+1,elsePC←PC+1。如果在執行CP、CPI、SUB或SUBI指令后立即執行該指令,當且僅當寄存器Rd中無符號或有符號二進制數與寄存器Rr中無符號或有符號二進制數不相等時,跳轉將發生(相當于BRBC1,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)100Example:eorr27,r27;Clearr27loop:incr27;Increaser27...cpir27,5;Comparer27to5brneloop;Branchifr27<>5nop;Loopexit(donothing)101(5)進位標志位C置位跳轉BRCS–BranchifCarrySetBRCSk;-64≤k≤+63IfC=1
thenPC←PC+k+1,elsePC←PC+1。(相當于BRBS0,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)102Example:SEC;C=1,請同時觀察C標志LP:BRCSLP1;C=1轉,C=0順執
SEC;C=1RJMPLP;重復試驗LP1:CLC;C=0RJMPLP;重復試驗103(6)進位標志位C清除跳轉BRCC–BranchifCarryClearedBRCCk;-64≤k≤+63IfC=0
thenPC←PC+k+1,elsePC←PC+1。(相當于BRBC0,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)104Example:addr22,r23;Addr23tor22brccnocarry;Branchifcarrycleared...nocarry:nop;Branchdestination(donothing)105(7)大于或等于跳轉(無符號數)BRSH–BranchifSameorHigher(Unsigned)BRSHk;-64≤k≤+63IfRd≥Rr(C=0)
thenPC←PC+k+1,elsePC←PC+1。如果在執行CP、CPI、SUB或SUBI指令后立即執行該指令,當且僅當在寄存器Rd中無符號二進制數大于或等于寄存器Rr中無符號二進制數時,跳轉將發生(相當于BRBC0,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)106Example:subir19,4;Subtract4fromr19brshhighsm;Branchifr19>=4(unsigned)...highsm:nop;Branchdestination(donothing)107(8)小于跳轉(無符號數)BRLO–BranchifLower(Unsigned)BRLOk;-64≤k≤+63IfRd<Rr(C=1)
thenPC←PC+k+1,elsePC←PC+1。如果在執行CP、CPI、SUB或SUBI指令后立即執行該指令,當且僅當在寄存器Rd中無符號二進制數小于寄存器Rr中無符號二進制數時,跳轉將發生(相當于BRBS0,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)108Example:eorr19,r19;Clearr19loop:incr19;Increaser19...cpir19,$10;Comparer19with$10brloloop;Branchifr19<$10(unsigned)nop;Exitfromloop(donothing)109(9)結果為負跳轉BRMI–BranchifMinusBRMIk;-64≤k≤+63IfN=1
thenPC←PC+k+1,elsePC←PC+1。測試負號標志N,如果N被置位,則跳轉(相當于BRBS2,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)110Example:subir18,4;Subtract4fromr18brminegative;Branchifresultnegative...negative:nop;Branchdestination(donothing)111(10)結果為正跳轉BRPL–BranchifPlusBRPLk;-64≤k≤+63IfN=0
thenPC←PC+k+1,elsePC←PC+1。測試負號標志N,如果N被清零,則跳轉(相當于BRBC2,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)112Example:subir26,$50;Subtract$50fromr26brplpositive;Branchifr26positive...positive:nop;Branchdestination(donothing)113(11)大于或等于跳轉(符號數)BRGE–BranchifGreaterorEqual(Signed)BRGEk;-64≤k≤+63IfRd≥Rr(N⊕V=0)
thenPC←PC+k+1,elsePC←PC+1。(注:S=N⊕V)如果在執行CP、CPI、SUB或SUBI指令后立即執行該指令,當且僅當在寄存器Rd中符號二進制數大于或等于寄存器Rr中符號二進制數時,跳轉將發生(相當于BRBC4,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)114Example:cpr11,r12
;Compareregistersr11andr12brgegreateq;Branchifr11≥r12(signed)...greateq:nop
;Branchdestination(donothing)115(12)小于跳轉(符號數)BRLT–BranchifLessThan(Signed)BRLTk;-64≤k≤+63IfRd<Rr(N⊕V=1)
thenPC←PC+k+1,elsePC←PC+1。(注:S=N⊕V)如果在執行CP、CPI、SUB或SUBI指令后立即執行該指令,當且僅當在寄存器Rd中符號二進制數小于寄存器Rr中符號二進制數時,跳轉將發生(相當于BRBS4,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)116Example:cpr11,r12
;Compareregistersr11andr12brltless;Branchifr11≥r12(signed)...less:nop
;Branchdestination(donothing)117(13)半進位標志H置位跳轉BRHS–BranchifHalfCarryFlagisSetBRHSk;-64≤k≤+63IfH=1
thenPC←PC+k+1,elsePC←PC+1。測試半進位標志H,如果H被置位,則跳轉(相當于BRBS5,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)118Example:lp:addr10,r11;加法設:(r10)=5,(r11)=5,(r12)=5brhslp1;半進位標志(H)=1跳轉
;(H)=0順序執行decr10;(R10)-1decr10rjmplp;反復實驗lp1:addr10,r12;加法rjmplp;反復實驗119(14)半進位標志H清零跳轉BRHC–BranchifHalfCarryFlagisClearedBRHCk;-64≤k≤+63IfH=0
thenPC←PC+k+1,elsePC←PC+1。測試半進位標志H,如果H被清零,則跳轉(相當于BRBC5,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)120Example:lp:addr10,r11;加法設:(r10)=5,(r11)=5,(r12)=5brhclp1;半進位標志(H)=0跳轉
;(H)=1順序執行decr10;(R10)-1decr10rjmplp;反復實驗lp1:addr10,r12;加法rjmplp;反復實驗121(15)標志T置位跳轉BRTS–BranchiftheTFlagisSetBRTSk;-64≤k≤+63IfT=1
thenPC←PC+k+1,elsePC←PC+1。測試標志T,如果T被置位,則跳轉(相當于BRBS6,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)122Example:bstr3,5;Storebit5ofr3inTFlagbrtstset;Branchifthisbitwasset...tset:nop;Branchdestination(donothing)123(16)標志T清零跳轉BRTC–BranchiftheTFlagisClearedBRTCk;-64≤k≤+63IfT=0
thenPC←PC+k+1,elsePC←PC+1。測試標志T,如果T被清零,則跳轉(相當于BRBC6,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)124Example:bstr3,5;Storebit5ofr3inTFlagbrtctclear;Branchifthisbitwascleared...tclear:nop;Branchdestination(donothing)125(17)溢出標志V置位跳轉BRVS–BranchifOverflowSetBRVSk;-64≤k≤+63IfV=1
thenPC←PC+k+1,elsePC←PC+1。測試溢出標志V,如果V被置位,則跳轉(相當于BRBS3,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)126Example:addr3,r4;Addr4tor3
brvsoverfl;Branchifoverflow
...overfl:nop;Branchdestination(donothing)127(18)溢出標志V清零跳轉BRVC–BranchifOverflowClearedBRVCk;-64≤k≤+63IfV=0
thenPC←PC+k+1,elsePC←PC+1。測試溢出標志V,如果V被清零,則跳轉(相當于BRBC3,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)128Example:addr3,r4;Addr4tor3
brvcnoover;Branchifnooverflow
...noover:nop;Branchdestination(donothing)129(19)全局中斷使能跳轉BRIE–BranchifGlobalInterruptisEnabledBRIEk;-64≤k≤+63IfI=1
thenPC←PC+k+1,elsePC←PC+1。測試全局中斷標志I,如果I被置位,則跳轉(相當于BRBS7,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)130Example:LP:BRIELP1;全局中斷標志(I)=1跳轉,
;(I)=0順執
SEI;(I)=1RJMPLP;反復測試LP1:CLI;(I)=0RJMPLP;反復測試
131(20)全局中斷禁止跳轉BRID–BranchifGlobalInterruptisDisabledBRIDk;-64≤k≤+63IfI=0
thenPC←PC+k+1,elsePC←PC+1。測試全局中斷標志I,如果I被清零,則跳轉(相當于BRBC7,k)對SREG的標志位無影響在匯編程序中,用目標地址的標號替代跳轉字數k(即由匯編器幫我們計算k)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 手術室護士長培訓總結匯報
- 碳酸飲料行業的企業戰略與發展規劃考核試卷
- 助動車執行器故障診斷考核試卷
- 英語人教版 (PEP)Unit 2 My favourite season Part A教學設計及反思
- 榨汁機刀片更換考核試卷
- 水產養殖病害診斷與防治考核試卷
- 電梯乘客信息安全保護的技術發展趨勢與法規更新考核試卷
- 社會中的城市化與城市發展考核試卷
- 森林生態系統服務評估考核試卷
- 供電局禮儀培訓大綱
- 2025陜煤集團榆林化學有限責任公司招聘(137人)筆試參考題庫附帶答案詳解
- 小學生三減三健課件
- 2024-2025學年浙江省杭州市建德市壽昌中學高二下學期第二次檢測數學試卷(含答案)
- 總包單位與分包單位臨時用電管理協議書
- 2025屆浙江省溫州市高三二模數學試題及答案
- GB/T 15180-2025重交通道路石油瀝青
- 四川成都農業科技中心招聘考試真題2024
- 淄博藝術中考試題及答案
- 2025年江蘇省文科大學生自然科學知識競賽題庫及答案(1-1077題)
- 中國農業銀行筆試真題含解析
- 2025新人教版七年級英語下冊期中測試卷(含答案)
評論
0/150
提交評論