第3章汇编语言_第1页
第3章汇编语言_第2页
第3章汇编语言_第3页
第3章汇编语言_第4页
第3章汇编语言_第5页
已阅读5页,还剩231页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论