【文档说明】单片机原理与应用基于汇编C51及混合编程第4章51内核单片机汇编语言程序设计课件.ppt,共(140)页,1.886 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2486.html
以下为本文档部分文字说明:
1第4章51内核单片机汇编语言程序设计4.1、汇编指令格式4.2、寻址方式4.3、指令系统4.4、汇编程序常用伪指令4.5、汇编语言程序设计2一、基本概念•指令——使单片机完成基本操作的命令。•程序——完成某项特定任务的指令的集合。高级语言:汇编语言:机器语言:Ø程序设计语言:用
二进制代码表示指令和数据。用助记符表示指令操作功能,用标号表示操作对象。独立于机器,面向过程,接近自然语言和数学表达式。第四章51内核单片机汇编语言程序设计3Ø汇编程序功能源程序(汇编指令程序)汇编目标程序(机器语言程序)汇编指令与机器
码指令有一一对应的关系。汇编程序是一种翻译程序,将源程序翻译成目标程序。(翻译)•手工汇编•机器汇编(常用)Ø汇编的两种方式4关于机器汇编的说明两次扫描过程。第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地
址或数)。第二次扫描:在第一次扫描基础上,将符号地址转换成地址(代真);利用操作码表将助记符转换成相应的目标码。5源程序目标程序地址ORG1000HSTART:MOVR0,2FHMOVR2,#00HMOVA,@R0MOVR3,AINCR3SJMPNEXT
LOOP:INCR0CJNE@R0,#44H,NEXTINCR2NEXT:DJNZR3,LOOPMOV2AH,R2SJMP$END第一次汇编第二次汇编1000A82F10027A001004E61005FB10060B100780NEXT100908100AB644NEXT
100D0A100EDBLOOP10108A2A101280FEA82F7A00E6FB0B800508B644010ADBF98A2A80FE6•时间属性:指一条指令执行完毕所需要的时间•空间属性:指一条指令存储于程序存储器中所占的字节数•功能属性:指一条指
令所对应的一个特定的操作功能Ø指令的三种属性STC系列单片机采用了80C51内核,其指令集与MCS—51系列单片机完全相同,本章介绍的指令系统可适用于所有51内核的单片机。7Ø指令的构成指令=操作码+操作数操作码——表示该指令所能执行的操作功能。操作数——表示参加操作的数的本身或操作数所在的
地址。Ø汇编语言指令基本格式[标号:]操作码助记符[目的操作数][,源操作数][;注释]4.1汇编指令格式8Ø描述符号:Rn——工作寄存器R0~R7Ri——间接寻址寄存器R0、R1Direct——直接地址,包括内部128BRAM单元地址、所有SFR地址。#data——8
位立即数#data16——16位立即数addr16——16位目的地址addr11——11位目的地址rel——用补码表示的8位相对偏移量bit——可直接位寻址的位9/bit——指定位求反,再参与逻辑操作,但取反后不影响该位的原值(x)——x中的内容((x)
)——x中的地址中的内容→——表示操作流程,将箭尾一方内容送入箭头所指一方的单元中去$——当前指令地址104.2寻址方式•寻址方式——寻找操作数或寻找操作数所在存储单元地址的方式•共七种寻址方式:寄存器寻址直接寻址立即
数寻址寄存器间接寻址变址寻址相对寻址位寻址必须掌握11•操作数以常数的形式直接出现在指令中,用“#”作前缀;•该常数与操作码一起存放在ROM中,可以立即得到并执行。•例如:MOVA,#52H74HA立即数操作码程序存储器PC+1PC52H4.2.1立即(数)寻址52H12•例如:MOVD
PTR,#5678HDPTR由两个特殊功能寄存器DPH和DPL组成90H56H78H56H78HPCPC+1PC+2操作码低位立即数高位立即数程序存储器SFRDPLDPH注意:1.只有源操作数能使用立即寻址方式。2.立即数长度必须小于或等于目的操作数的长度。13•操作数存放在R0
~R7、A或DPTR中;•B寄存器在乘、除法指令中是寄存器寻址,在数据传送指令中是直接寻址。•其他SFR的寻址方式不属于寄存器寻址。•例如:MOVA,R54.2.2寄存器寻址101PC操作码程序存储器内部RAMR5AXXXXR6R7
1110114•指令中直接给出操作数的地址,数据存放在该地址对应的存储单元中。•直接寻址方式可以访问的范围:4.2.3直接寻址ü片内RAM低128B单元(00H——7FH)üSFR(既可用单元地址形式给出,也可
用寄存器符号的形式给出)注意:直接寻址方式是访问特殊功能寄存器的唯一方法。15•MOVP0,A(P0代表符号地址,是直接寻址方式)•例如:MOVA,63H4.2.3直接寻址74H63HPCPC+1操作码直接地址程序存储器内部RAM63HAXXMOV80H,AXX16
•可用作地址指针的工作寄存器是R0、R1,以及DPTR•例如:MOVA,@R1;A←((R1))PC操作码程序存储器内部RAMA11100114.2.4寄存器间接寻址•指令中寄存器的内容作为操作数存放的地址•间接寻址寄存器前用“@”表示前缀1R130H30H58H58H17使用该方
式访问数据存储器时注意:Ø访问片内RAM只能用R0和R1作指针;Ø若片内扩展RAM或片外RAM仅有256B单元时,既可以用R0或R1作指针间接访问,也可用DPTR作指针间接访问;大于256B时只能以DPTR作指针间接访问。18•操作数地址=变地址
+基地址•基地址寄存器:DPTR或PC;变址寄存器:A•该寻址方式常用于访问程序存储器,查表。•例如:MOVCA,@A+DPTRPC操作码程序存储器SFR32HALUA5H4.2.5变址寻址10010011DPHDPL32A5H32A5HA23H+23H=32C8H32C8H2FH2FH设
DPTR=32A5H,A=23H19•用于相对转移指令中•以当前PC值作为基地址,与指令中给定的相对偏移量rel相加,以所得之和作为目的位置的地址•当前PC值=源地址+转移指令所占的字节数(实际上是转移指令的下一条指令的地址)•
rel:以补码表示的有符号单字节数(-128~127),负数表示从当前地址向下转移,正数表示从当前地址向上转移。4.2.6相对寻址20PC操作码程序存储器PCALU2050HPC+12051HPC+2偏移量rel=08H•例如:JZ08H;rel
为正数,从当前地址向上转移当A=0时,PC←PC+2+rel//转移当A≠0时,PC←PC+2//程序顺序执行2052H205AH2052H08H+08H=205AHPC205AHXX2052H60H21PC操作码程序存储器PCALU2050HPC+12051HPC+2偏移量rel=F4H
•例如:JZF4H;rel为负数,从当前地址向下转移当A=0时,PC←PC+2+rel//转移当A≠0时,PC←PC+2//程序顺序执行2052H2046H2052HF4H+FFF4H=2046HPC2046HXX2052
H60H22•操作数是二进制位•在指令中直接给出位地址,利用位处理器对某一位进行数据传送、逻辑运算等操作•例如:MOVC,07H;C←(07H)PC操作码程序存储器C20H00PC+1PSWSFRX4.2.7位寻址07H07XA2H23Ø两种位寻址区:(1)内部
RAM中的位寻址区:字节地址为20H~2FH;(2)SFR的可寻址位。Ø位地址的几种表示方法:1)直接使用位地址;如:PSW的位6可表示为0D6H2)字节地址带位号;或0D0H.63)SFR名带位号;或PSW.64)位符号地址表示;或AC24数据传送指令共29条,包括:普通传送指令、数据
交换指令和堆栈操作指令程序存储器ROM特殊功能寄存器SFR片内RAM128字节扩展数据存储器RAMMOVCMOVXMOVPUSHPOPXCHXCHD4.3指令系统4.3.1数据传送指令注意:该类指令只有以A为目的操作
数的指令影响PSW中的P标志位,其它数据传送指令对各标志位无影响。25回忆操作数描述符:direct,Rn,@Ri,#data,DPTR等。1)以A为目的操作数的传送指令MOVA,#dataMOVA,directMOVA,RnMOVA,@RiMOVRn,#dataMOVRn,d
irectMOVRn,A1、普通传送指令Ø片内RAM传送指令MOV;A←(Rn);A←data;A←(direct);A←((Ri))2)以Rn为目的操作数的传送指令;Rn←A;Rn←data;Rn←(direct)26MOVdirect,
RnMOVdirect,@Ri4)以@Ri为目的操作数的传送指令MOV@Ri,#data;(Ri)←dataMOV@Ri,direct;(Ri)←(direct)MOV@Ri,A;(Ri)←(A)MOVDPTR,#data16;唯一的16
位数据传送指令。(direct)←(A)MOVdirect,A;3)以direct为目的操作数的传送指令MOVdirect,#data(direct)←dataMOVdirect,direct(direct)←(direct)(direct)←(Rn)(
direct)←((Ri))5)以DPTR为目的操作数的传送指令27MOVRn,RnMOV@Ri,@RiMOVRn,@RiMOV#data,A××××注意:1)在数据传送指令中目的操作数和源操作数中不能同时出现工作寄存器。2)SFR只能用直接寻址方式
访问。3)片内RAM高128B(80H-FFH)只能用寄存器间接寻址方式访问。【例4-1】写出将R0的内容送到R5中的程序段。MOVA,R0MOVR5,A28Ø扩展数据存储器传送指令对片内扩展RAM或片外扩展RAM及外部接口电路进行数据传送的相关指令:MOVXA,@RiMOVXA,@DP
TRMOVX@Ri,AMOVX@DPTR,A执行过程中会使/WR、/RD有效。;A←((Ri));A←((DPTR));((Ri))←A;((DPTR))←A(读)(读)(写)(写)注意:1)通过DPTR间接寻址,可以对整
个64KB片外RAM访问。2)通过@Ri间接寻址,只能对扩展RAM的低256字节访问,如果地址范围大于256B时,应谨防地址冲突。29【例4-2】试编写一程序段,实现将片外RAM地址为01E0H开始的16个单元中的内容传送到
片内扩展RAM地址为04FFH开始的单元中。参考程序为:MOVR2,#10HMOVP2,#01HMOVR0,#0E0HMOVDPTR,#04FFHLOOP:ORLAUXR,#00000010BMOVXA,@R0ANLAUXR,#11111101BMOVX@DP
TR,AINCR0INCDPTRDJNZR2,LOOPD7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSEXTRAM=1时,访问片外扩展RAM30Ø程序存储器传送指令MOVC(查表指令)MOVCA,@
A+DPTRMOVCA,@A+PCMOVC含义是传送常数。(A)+(DPTR)或PC当前值=一个16位的地址,将该ROM地址中的内容传送给A。ü以DPTR为基地址的指令,可在ROM的64KB范围内查表;(常用)ü以PC为基地址的
指令只能在(PC)+1为基点的256B范围内查表;(不推荐)ü使用第一条指令前,需事先将表首地址存入DPTR中,相对于表首偏移量存入A寄存器中。31例如:(A)=30H,当前地址1000HMOVCA,@A+PC;A←(????H)例如:ORG8000
HMOVA,#30HMOVCA,@A+PC;A←(????H)……ORG8030HDB41H,42H,43H,44H,45H例如:(DPTR)=8100H,(A)=40HMOVCA,@A+DPTR;A←(????H)80331031阅读以下三个程序段,
并回答????的内容。814032【例4-3】将ROM02FFH单元的内容送片内RAM的50H单元中。参考程序如下:MOVA,#0MOVDPTR,#02FFHMOVCA,@A+DPTRMOV50H,A33【例4-4】设data
是一个BCD码常数,试用查表法获得其相应的ASCII码。将0-9的ASCII码组成一个表依次存放于程序存储器中以TAB为首地址的各单元中。参考程序如下:MOVA,#dataMOVDPTR,#TABMOVCA,@A+DPTR……
TAB:DB30H,31H,32HDB33H,34H,35H,36H,37H,38H,39H342、数据交换指令普通传送指令数据传送是单向的,传送后只有目的操作数变化。数据交换指令是双向传送,交换后两个
操作数都变。Ø整字节交换指令XCHA,Rn(A)←→(Rn)XCHA,direct(A)←→(direct)XCHA,@Ri(A)←→((Ri))Ø半字节交换指令XCHDA,@Ri(A3-0)←→((Ri)3-0)ØA寄存器高低半字节交换指令SWAPA(
A3-0)←→(A7-4)35【例4-5】已知(R0)=30H,(A)=65H,(30H)=8FH,分析执行如下指令后A与30H单元中数据的变化。XCHA,@R0XCHDA,@R0SWAPA;交换后,(A
)=8FH,(30H)=65H;交换后,(A)=85H,(30H)=6FH;交换后(A)=58H36【例4-6】将片内RAM30H和31H单元中的ASCII码转换成压缩式BCD码存入20H单元。其中30H单元中的数值为低位,31H单元中的数值为高位。分析:0-9的ASCII码的低4位
即是所对应的BCD码。参考程序如下:MOVR0,#30HMOVR1,#31HXCHDA,@R1SWAPAXCHDA,@R0XCHA,20H37(2)(SP)←(direct)3、堆栈操作指令PUSHdirectPO
PdirectPUSHdirect指令执行中,机器自动进行两步操作:(1)SP←(SP)+1POPdirect指令执行中,机器也自动进行两步操作:(1)direct←((SP))(2)SP←(SP)-1不
影响任何标志位堆栈:按后进先出原则读写的特殊RAM区。在用户初始化程序中要先给堆栈指针赋初值,确定栈底位置。使用指令:MOVSP,#DATA384FH50H51H52HSP80HPSW=80H例:“PUSHPSW”
指令的执行过程执行前:SP=4FH执行后:SP=50H394FH50H51H52HSPSP80HPSW=××H例:“POPPSW”指令的执行过程80H执行前:SP=50H执行后:SP=4FH40【例4-7】在程序存储器中从标号为TAB1的
单元开始依次存放0-9的平方值,R7中存有0-9中的某个数,用查表指令取出R7中数据所对应的平方值并存入R7中,要求执行后DPTR中的内容不改变。参考程序如下:PUSHDPHPUSHDPLMOVA,R7MOVDPTR,#TAB1MOVCA,@A+DP
TRMOVR7,APOPDPLPOPDPH……TAB1:DB00H,01H,04H,09H,……41包括:加、减、乘、除;增量、减量;十进制的BCD码调整。1、加法指令Ø不带进位位加法指令ADDA,#data
;A←(A)+dataADDA,direct;A←(A)+(direct)ADDA,Rn;A←(A)+(Rn)ADDA,@Ri;A←(A)+((Ri))无符号数相加时:若C=1,(其值>255)。有符号数相加时:若OV=1,说明有溢出。3.3.2算
术运算类指令42Ø带进位位加法指令ADDCA,#data;A←(A)+data+(CY)ADDCA,direct;A←(A)+(direct)+(CY)ADDCA,Rn;A←(A)+(Rn)+(CY)ADDCA,@Ri
;A←(A)+((Ri))+(CY)üADD和ADDC指令的目的操作数均是A寄存器。üADD和ADDC指令在执行时要影响CY、AC、OV和P标志位。üOV仅用来判断有符号数运算是否正确。ü常用ADD和ADDC指令配合实
现多字节加法运算。对于加法指令的说明43【例4-8】设(A)=28H,(R1)=7CH,分析执行指令ADDA,R1后的结果。00101000+0111110010100100结果为:A=0A4H,CY=0
,AC=1,P=1,OV=144【例4-9】设双字节数X存在片内RAM40H、41H单元,Y存在42H、43H单元,编程求Z=X+Y,并存入片内RAM44H、45H、46H单元。(所有数据按高字节存于低地址单元
的规则存放)参考程序如下:MOVA,41HADDA,43HMOV46H,AMOVA,40HADDCA,42HMOV45H,AMOVA,#00HADDCA,#00HMOV44H,A452、减法指令SUBBA,#data;A←(A)-data
-(CY)SUBBA,direct;A←(A)-(direct)-(CY)SUBBA,Rn;A←(A)-(Rn)-(CY)SUBBA,@Ri;A←(A)-((Ri))-(CY)ü51指令系统只有带借位的减法指令,当需要执行不带借位的减法运算时,可先通过“CLRC”指令,将进位标志CY清
零。üSUBB指令在执行时要影响CY、AC、OV和P标志位。üOV仅用来判断有符号数运算是否正确。对于减法指令的说明46【例4-10】设(A)=52H,(R0)=0B4H,分析执行指令CLRCSUBBA,R0后的结果。01010010-1011010010011110结果
为:A=9EH,CY=1,AC=1,P=1,OV=147【例4-11】两个双字节无符号数分别存放于寄存器R0R1及R2R3中,试编程计算它们的差,结果存于寄存器R4R5中。其中R0和R1中分别存放被减数的高8位和低8位。R2和R3中
分别存放减数的高8位和低8位。差的高、低8位分别存于寄存器R4和R5中。参考程序如下:MOVA,R1CLRCSUBBA,R3MOVR5,AMOVA,R0SUBBA,R2MOVR4,A483、加1指令INCA;(A)←(A)+1,以下类同。INCRnIN
CdirectINC@RiINCDPTRINC指令除了INCA要影响P标志位外,对其它标志位都没有影响。【例4-12】设(R0)=7EH,片内RAM(7EH)=0FFH,(7FH)=40H(DPTR)=21FEH,分析逐条执
行下列指令后各单元的内容。INC@R0INCR0INC@R0INCDPTRINCDPTR;使7EH单元的内容由0FFH变为00H;使R0的内容由7EH变为7FH;使7FH单元的内容由40H变为41H;使DPL为FFH,DPH不变;使DPL为00H,DPH变为22H494、
减1指令DECA;(A)←(A)-1,以下类同。DECRnDECdirectDEC@RiüDEC指令除了DECA要影响P标志位外,对其它标志位都没有影响。ü在51内核单片指令系统中,没有“DECDPTR”指令。
对于减1指令的说明505、乘、除法指令Ø乘法指令MULAB;(A)×(B),积的低8位在A中,积的高8位在;B中,CY总为0。当积大于255时(即B中不为0);则置位OV标志。ü51内核单片机乘、除法指令只针对无符号数
运算。ü这两条指令影响CY、OV和P,其它标志位不受影响。Ø除法指令DIVAB;(A)÷(B),商在A中,余数在B中。;(CY)总是0。;若除数(B)=0,则(OV)=1,否则(OV)=0。51【例4-13】试将A寄存器中的二进制数转换为BCD码,结果的百位数存放于31H单元,十位数和个位
数压缩后存于30H单元。参考程序如下:MOVB,#100DIVABMOV31H,AMOVA,#10XCHA,BDIVABSWAPAADDA,BMOV30H,A52DAA;二——十进制调整指令。(A3~0)>9时或(AC)=1时,(A3~0)(A3
~0)+6(A7~4)>9或(C)=1时,(A7~4)(A7~4)+6Ø选择修正值的规则:6、十进制调整指令执行过程中,CPU能根据加法运算后,A中的值和PSW中的AC及CY标志位的状况自动选择一个修正值(00H、06H、60H、66H)与原运算结果相加,进行二——十进制调整。
üDAA指令只能跟在加法指令后面使用。ü参加运算的两数是BCD码才有必要调整。53【例4-14】设A寄存器内存有BCD码56H,寄存器R3内存有BCD码67H,执行ADDA,R3指令后,结果应该是123,但实际结果为:0
101011056+011001116710111101BDH需再执行指令DAA,对上面的结果进行调整,因高4位及低4位数都大于9,故需加66H。10111101+01100110加66H调整10010001112354
ØBCD码减法方法:减法可以转换为加法运算,将减数转换为十进制补码,然后相加,再用DAA指令进行调整。例如:80-30=80+[-30]补=80+(100-30)=150结果中百位数字1在CY中,A寄存器中的50H即80-30的BCD码。在实际运算时,不能用一
个字节表示十进制数100,可用99+1表示,即10011001B+1=10011010B=9AH,因为9AH经过十进制调整后就是100。55十进制无符号数的减法运算可按以下步骤进行:第一步:求减数的十进制补码(9AH-减数)
;第二步:被减数与减数的十进制补码相加;第三步:经DAA指令调整后就得到所求的十进制减法运算结果。【例4-15】设M1、M2、M3分别为十进制的被减数、减数和差的符号地址,编写减法运算程序。CLRC;CY清0MOVA,#9AH;A←#9AHSUBBA,M2;
求-M2的十进制补码ADDA,M1;M1与-M2的十进制补码相加DAA;十进制调整MOVM3,A;差存入M3564.3.3逻辑运算指令该类指令除了带进位循环及A为第一操作数的指令影响CY和P外,其它指令不影响PSW中的标志位。1.逻
辑与指令ANLA,#data;A←(A)∧data,以下类同ANLA,RnANLA,directANLA,@RiANLdirect,#dataANLdirect,A【例4-16】设当前P1口输出35H,使其高4位输出0,低4位
不变。解;ANLP1,#0FH此做法称为“屏蔽”位。注意:跟“0”相与可将该位清0跟“1”相与该位保持不变572.逻辑或指令ORLA,#data;A←(A)∨data,以下类同ORLA,RnORLA,directORLA,@RiORLd
irect,#dataORLdirect,A注意:跟“1”相或可将该位置1跟“0”相或该位保持不变【例4-17】将A中的低3位送入片内RAM30H单元低3位,并且保持30H单元的高5位不变。解;ANLA,
#07HANL30H,#0F8HORL30H,A这称为“数位组合”。583.逻辑异或指令XRLA,#data;A←(A)⊕data,以下类同XRLA,RnXRLA,directXRLA,@RiXRLdirect,#dataXRLdirect,A注意:跟“1”异或可取反跟“0”异或保持不变【例4-
18】设(A)=0B5H=10110101B,执行下列操作:XRLA,#0FH;则A的低4位取反,高4位保持不变,(A)=10111010B这称为“指定位求反”。594.A寄存器的清零和求反指令Ø清零指令:CLRA;A←0Ø求反指令:CPLA;【
例4-18】双字节数求补码。一个16位正数X存于R3(高8位)R2(低8位)中,求-X的补码,并将结果仍存于R3、R2。参考程序如下:MOVA,R2CPLAADDA,#01HMOVR2,AMOVA,R3CPLAADDCA,#00HMOVR
3,AA()A605.移位指令Ø循环左移:RLAØ循环右移:RRAØ带进位位的循环左移:RLCAØ带进位位的循环右移:RRCAA.0A.7A.0A.7A.0A.7CYA.0A.7CYü循环移位只能对A寄存器进行,每次只能移动一位ü对于某些数左移一位相当于乘
以2,右移一位相当于除以2。614.3.4控制转移类指令作用:改变程序计数器PC的值,从而改变程序执行方向。分为四大类:无条件转移指令;条件转移指令;子程序调用指令;返回指令。1、无条件转移指令LJMPaddr16AJMPaddr11SJ
MPrelJMP@A+DPTR62Ø长转移指令LJMPaddr16;转移目的地址PC←addr16,0000H~FFFFH,64KB长转移指令:LJMPAAAAH;AAAAHPCPC=0000HPC=AAAAH0000H0001H······AAA9HAAAAH0002H假
设执行该指令前,PC的值为0000H。注意:该指令可以转移到64KB程序存储器中的任意位置。63Ø绝对转移指令PC高5位(保持不变)PC低11位A10A9A800001A7A6A5A4A3A2A1A0操作码(第一字节)操作数(第二字节)程序计数器PCAJMPaddr11;PC+2PC,
addr11PC.10~PC.0转移目的地址与(PC)+2在同一个2KB范围内。64【例4-20】分析AJMP指令地址为2300H,或AJMP指令地址为2FFFH两种情况下,执行指令:AJMP0FFH后,程
序转移的目标位置?(1)若AJMP指令的地址为2300H:当执行该指令时,PC=2302H,完成该指令后,PC15-11=00100B保持不变,PC10-0←00011111111B即转移目的地址为PC=20FFH。(2)
若AJMP指令的地址PC=2FFFH:执行该指令时PC=3001H,指令执行后PC15-11=00110B保持不变,PC10-0←00011111111B,转移目的地址PC=30FFH。可见,虽然addr11相同,指令机器码相同,但转移的目的地址却可能不同。65Ø相对短转移指令SJMPr
el;PC←(PC)+2+rel实际使用中常写成SJMPaddr16,汇编时会自动转换成rel。该指令的转移范围是:相对PC当前值向上127字节,向下128字节。注意:在单片机程序设计中,通常用到一条SJ
MP指令:SJMP$;功能:原地踏步,动态停机。调试程序时通常用它,使程序不再向后执行。66【例4-21】计算转移指令的目标地址。1)835AH:SJMP35H2)835AH:SJMP0E7H解:1)rel=35H=001101
01B为正数,因此程序向上转移。目标地址=当前PC+rel=(835AH+02H)+35H=8391H2)rel=0E7H=11100111B为负数,因此程序向下转移。目标地址=835AH+02H+0FFE7H=8343HØ相对长转移指令JMP@A+DPTR;间接转移,散转移指令。转移目的
地址=(A)+(DPTR)本指令不影响标志位,不改变A寄存器及DPTR中的内容。常用于多分支程序结构中,可在程序运行过程中动态地决定程序分支走向。在64KB范围内无条件转移67【例4-22】R1中存有从00H-0FH中的某一个数,编写程序,根据R1中的数值,转移
至不同处理程序入口。参考程序如下:MOVA,R1RLAADDA,R1MOVDPTR,#TABLEJMP@A+DPTRTABLE:LJMPTAB0LJMPTAB1LJMPTAB2……TAB0:……TAB1:……TAB2:……LJMP是三字节指令,
跳转前A寄存器中内容需是3的倍数。68比较LJMP、AJMP、SJMP、JMP转移的起点和范围:LJMPLJMPPC64KAJMPAJMPPC+2SJMPSJMPPC+2127-128JMPJMP@A+D
PTRPCA+DPTR2K64K69实现按照一定条件决定转移的方向,分三类:A寄存器判零条件转移比较条件转移减1不为零转移JZrel:若(A)=0,则转移,否则顺序执行。JNZrel:若(A)≠0,则转移,否则顺序执行。转移目的地址=(P
C)+2+rel不影响任何标志位。ØA寄存器判零条件转移指令2、条件转移指令指令的实际编写形式:“JZ/JNZ目标地址标号”。70【例4-23】编写程序,将从片外RAM地址2000H单元开始的数据连续传送到片内地址从30H单元开始的RAM中,直到出现0为止
。参考程序如下:ORLAUXR,#00000010BMOVDPTR,#2000HMOVR0,#30HLOOP:MOVXA,@DPTRMOV@R0,AINCR0INCDPTRJNZLOOPD7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS
2SMODBRTx12EXTRAMS1BRSEXTRAM=1时,访问片外扩展RAM71Ø比较转移指令功能:比较两个字节中的值,若不等,则转移。CJNEA,#data,relCJNERn,#data,relCJNE@Ri,#data,relCJNEA,dir
ect,rel•用第一操作数内容减去第二操作数内容,但差值不回存。•转移目的地址=(PC)+3+rel•若前者小于后者,则(CY)=1,否则(CY)=0。72【例4-24】设P1口的P1.1和P1.2两
引脚作为单片机与外部设备通信联络信号输入端,当P1.1为高且P1.2为低时,单片机执行与外设的通信任务,否则等待。参考程序如下:WAIT:MOVA,P1ANLA,#06HCJNEA,#02H,WAIT……73该类指令可产生三分支程序:即,相等分支;大于分支;小于分支。
A=B吗?出口YNA>B吗?入口YN12374Ø减1不为零转移指令功能:本指令为双功能指令,即减1操作和判断转移操作。第一操作数内容减1后,若差值不为零,则转移;否则顺序执行。DJNZdirect,rel;direct←(direct)
-1,若(direct)≠0,则PC←(PC)+3+rel,否则顺序执行DJNZRn,rel;Rn←(Rn)-1,若(Rn)≠0,则PC←(PC)+2+rel,否则顺序执行指令的实际编写形式:“DJNZRn/d
irect,目标地址标号”。75【例4-25】统计片内扩展RAM中从地址为0700H单元开始的20个字节数据中0的个数,并存于R7中。参考程序如下:ANLAUXR,#0FDHMOVDPTR,#0700HMOVR2,#20MOVR7,#0LOOP:MOVXA,@DPTRCJNEA,#0,N
EXTINCR7NEXT:INCDPTRDJNZR2,LOOP76子程序调用指令和普通转移指令相似,但二者有本质区别:执行普通转移指令跳转后不再返回,而执行子程序调用指令跳转执行子程序后,再返回主程序继
续执行。3、子程序调用及返回指令执行该类指令不影响任何标志位。为了实现返回:执行子程序调用指令时,硬件电路自动将PC中的断点地址压入堆栈保存,然后再转向子程序入口地址,执行子程序。在子程序的最后安排一条返回指令(RET),将断
点地址从堆栈中弹出到PC,即返回主程序继续执行。77LCALLaddr16;3字节指令Ø长调用指令;转移范围64KB,执行中自动完成如下过程:(PC)←(PC)+3SP←(SP)+1(SP)←(PC7~0),保护断点地址低字节;SP←(SP)+1(
SP)←(PC15~8),保存断点地址高字节;PC←addr16,目的地址送PC,转子程序。78转移范围与(PC)+2在同一个2KB内。执行中机器自动完成下列过程:(PC)←(PC)+2SP←(SP)+1(SP)←(PC7~0)SP←(SP)+1(SP)←(PC15~8)PC10~0
←addr10~0Ø绝对调用指令ACALLaddr11;2字节指令在大程序中推荐使用LCALL指令。79RET执行过程:PC15~8←(SP)SP←(SP)-1PC7~0←(SP)SP←(SP)-1Ø子程序返回指令【例4-26】利
用DJNZ指令设计STC12C5A60S2系列单片机的循环延时子程序,已知时钟频率fosc=12MHz。分析:因为fosc=12MHz,故该单片机的机器周期T为1/12µs。801)采用单循环方式延时10µs调用该子程序的指令ACALLDELAY_10µs或LCALLDELAY_10µs
需要6T时间。△t=[6+(2+4×27+4)]/12=10µs参考子程序如下:DELAY_10µs:MOVR7,#27;2TDJNZR7,$;4TRET;4T812)采用双重循环方式延时1ms分析:12×(250×4)/12
=1000µs=1ms开始R7←#12R6←#250R6-1≠0?R7-1≠0?返回YYNN程序流程图:82参考子程序如下:DELAY_1ms:MOVR7,#12;2TDL:MOVR6,#250;2TDJNZR6,$;4TDJNZR7,DL;4TRET;
4T△t=[6+2+(2+4×250+4)×12+4]/12=1007µs≈1ms833)采用三重循环方式延时1s分析:100×120×(250×4)/12=1000000µs=1s程序流程图:开始R7←#100R6←#120R5←#250R5-1≠0?R6-1≠0
?R7-1≠0?返回YYYNNN84参考子程序如下:DELAY_1s:MOVR7,#100;2TDL2:MOVR6,#120;2TDL1:MOVR5,#250;2TDJNZR5,$;4TDJNZR6,DL1;4TDJNZR7,DL2;4TRET;4T△t={6+2+[2+(2+4×250
+4)×120+4]×100+4}/12=1006051µs≈1s85【例4-27】设计一款节日灯,通过单片机的P1.0-P1.7控制8路由发光二极管组成的灯,输出高电平点亮。先亮1灯(P1.0控制),每隔2秒闪烁1次,共闪烁10次,然后2灯闪10次,如此循环。A←#
01HR2←#10P1←AR2-1≠0?YN延时1秒P1←#00H延时1秒A循环左移一位初始化开始程序流程图:分析:P1.0引脚输出高电平时1灯亮,输出低电平时1灯灭,一亮一灭即为闪烁一次。亮的时间和灭的时间各持续1秒,共闪烁10次。其它灯同样控制。86参考子程序如下:ORG0MOVSP,#4FH
MOVA,#01HLOOP1:MOVR2,#10LOOP2:MOVP1,ALCALLDELAY_1sMOVP1,#00HLCALLDELAY_1sDJNZR2,LOOP2RLALJMPLOOP1DELAY_1s:……;1秒延时子程序(略)RETEND87RETI执行过程:PC15~8←(SP)SP
←(SP)-1PC7~0←(SP)SP←(SP)-1Ø中断返回指令;中断服务子程序的最后一条指令。功能:返回主程序中断的断点位置,继续执行断点位置后面的指令。RETI指令的执行过程与RET基本相同,只是RETI在执行时,不仅要恢复断点地址,还要清除中断响应时
所置位的优先级触发器,使得已申请的同级或低级中断申请可以响应。而RET指令只能恢复返回地址。88;这是一条单字节单时钟周期指令。;执行时,不作任何操作,仅将PC的内容加1,使CPU指向下一条指令继续执行程序。;使用这
条指令的目的仅仅是消耗这条指令执行所需要的一个机器周期的时间。一般用于设计延时程序、拼凑精确延时时间及程序等待等场合。4.空操作指令NOP;PC←(PC)+1894.3.5位操作指令包括:位传送指令、位控制转移指令、位运算指令。位操作由单片机内布
尔处理器来完成。除了使用进位位CY的位指令外,均不影响其他标志位。复习:位地址的四种表示:1)使用直接位地址表示;如20H、30H、33H等;2)使用位寄存器名来表示;如C、OV、F0等;3)用字节寄存器名后加位数来表示;如PSW.4、P0.5、ACC.3等;4)字节地址加位数来表示;如
20H.0、24H.4、2AH.7等。901.位传送指令MOVC,bit;CY←(bit);MOVbit,C;bit←(CY)注意:该类指令在使用时必须有进位位CY参与,不能直接实现两个一般位之间的传送。【
例4-28】将片内RAM中20H单元的第2位(位地址为02H)的状态,通过P1口的P1.3引脚输出。程序如下:MOVC,02H;CY←(02H)MOVP1.3,C;P1.3←(CY)912.位逻辑操作指令Ø位清0CLRC;CY←0CLRbit;bit←0Ø位置1S
ETBC;CY←1SETBbit;bit←1Ø位取反CPLC;CY←(/CY)CPLbit;bit←(/bit)Ø位与ANLC,bit;CY←(CY)∧(bit)ANLC,/bit;CY←(CY)∧(/bit),92Ø位或ORLC,bit;CY←(CY
)∨(bit)ORLC,/bit;CY←(CY)∨(/bit),参考程序如下:EXCL_OR:MOVC,XANLC,/YMOVZ,CMOVC,YANLC,/XORLC,ZMOVZ,CRET【例4-29】写出Z=X⊕Y的逻辑运算程序,其
中的X、Y、Z表示位变量。分析:异或逻辑运算可表示为:。YXYXZ+=93【例4-30】写出实现如图所示逻辑关系的运算程序。分析:上图所示电路所表示的逻辑关系为0.12.11.13.1PPPP+=参考程序如下:MOVC,P1.
1ORLC,P1.2CPLCANLC,P1.0MOVP1.3,C943.位转移指令Ø以进位位CY为条件的位转移指令JCrel;(CY)=1,则转移,否则顺序执行。JNCrel;(CY)=0,则转移,否则顺序执行。转移目标地
址:PC←(PC)+2+rel上述两条指令不影响标志位,不改变CY的状态。Ø以直接寻址位bit为条件的位转移指令JBbit,rel;(bit)=1,则转移,否则顺序执行。JNBbit,rel;(bit)=0,则转移,否则顺
序执行。JBCbit,rel;(bit)=1,则转移,转移前将该位清0;否则顺序执行。转移目标地址:PC←(PC)+3+rel95【例4-31】比较片内RAM的30H和40H单元中二个无符号数的大小,将较大的数存入20H单元,较小的数存入21H单元,若两数相等,则将PSW寄存器中
的F0位置1。参考程序如下:MOVA,30HCJNEA,40H,LOOP1SETBF0SJMPCONTINUELOOP1:JCLOOP2MOV20H,AMOV21H,40HSJMPCONTINUELOOP2:MOV20H,40HMOV21H,ACONTINUE:……96【例
4-32】试判断片内RAM30H单元中数的正负,若为正数,将P1.1置1,驱动绿灯亮,P1.0清0,红灯灭;若为负数,则将P1.1清0,绿灯灭,P1.0置1,红灯亮。参考程序如下:MOVA,30HJBACC.7,LOOP1SETBP1.1CLRP1
.0SJMPLOOP2LOOP1:CLRP1.1SETBP1.0LOOP2:………974.4汇编程序常用伪指令一、复习汇编程序功能:源程序(汇编指令程序)翻译(汇编)汇编指令与机器码指令有一一对应的关系。汇编编译器(计算机系统软件)完成汇编工作,将源程
序翻译成目标程序。目标程序(机器码指令程序)伪指令是告诉编译器如何汇编源程序的指令。伪指令既不控制机器的操作,也不能被汇编成机器代码,只向编译器提供相应的编译信息。二、伪指令98三、常用伪指令1.定义起始地址伪指令ORGORGaddr16通常放在一段源程序(主程序
、子程序)或数据块的前面,用于规定目标程序段或数据块的起始地址。例如:ORG3000HSTART:MOVA,30H……该伪指令规定MOVA,30H指令从地址3000H单元开始存放,即标号START所代表的地址为3000H。在一个汇
编语言源程序中,可以使用多个ORG伪指令,以规定不同程序段的起始位置。但所规定的地址应从小到大,不允许重叠。992、定义汇编结束伪指令END告诉汇编程序,对源程序的汇编到此结束。一个程序中只出现一次,在末尾。3、定义字节伪指令DB告诉汇编程序从指定的地址单元
开始,定义若干字节存储单元并赋初值。格式:[标号:]DB字节表定义多个字节时,两两之间用逗号间隔,定义的多个字节在存储器中是连续存放的。定义的字节可以是一般常数,也可以是字符或字符串,字符和字符串以引号括起来,字符数据在存储器
中以ASCII码形式存放。定义的标号在程序中是字节表起始单元的地址。100例如:ORG3000HTAB1:DB12H,34HDB‘5’,‘A’,‘abc’,-1FFH63H62H61H41H35H34H12H3007H
3006H3005H3004H3003H3002H3001H3000H汇编后,各个数据在存储单元中的存放情况如下:补码ASCII码‘’该指令只能为程序存储器赋初值,不能为其他存储器赋初值,尤其不能为内部数据存储器赋初值。1014、定义字伪
指令DW格式:[标号:]DW字表从指定地址开始,定义若干个16位数据,高八位存入低地址;低八位存入高地址。例如:ORG3000HTAB2:DW12H,3456H汇编后,各个数据在存储单元中的存放情况如下:56H34H12H00H3003H3
002H3001H3000H1025、预留存储区伪指令DS从指定地址开始,保留由表达式指定的若干字节空间作为备用空间。格式:[标号:]DS表达式例如:ORG3000HTAB1:DB12H,34HDS4HDB'5'汇编后,存储单元中的分配情况如右:注:DB、DW、DS只能用于程序
存储器;而不能用于数据存储器。35H----34H12H3006H3005H3004H3003H3002H3001H3000H1036、赋值伪指令EQU格式:字符名称EQU数值或汇编符号功能:使指令中的字符名称等价于给定的数值或汇编符号。先定义后使用
,放在程序开头。例如:TAB1EQU1000HTAB2EQU2000H汇编后TAB1、TAB2分别等于1000H、2000H。程序后面使用1000H、2000H的地方就可以用符号TAB1、TAB2替换。用EQU伪指令对某字符名称赋值后,该字符名称的值在整个程序中不能再改变。104要求符
号以字母开头,例如:TIMELDATA60HT1ADDRDATA7EFFH……MOVDPTR,#T1ADDRMOVA,TIMELMOVX@DPTR,A汇编后,片内RAM的60H单元地址用TIMEL表示,后面程序用到片内RAM中60H单元的地方就
可以用TIMEL代替。7、数据地址赋值伪指令DATA格式:字符名称DATA直接地址功能:将片内RAM的数据地址赋予规定的字符名称。赋值后可以用该符号代替DATA后面的地址。105EQU伪指令与DATA伪指令的功能相似,其主要区别是:1)EQU伪指令可以将一个汇
编符号赋值给字符名称,而DATA伪指令只能将数据或地址赋值给字符名称。2)EQU定义的字符名称只能是先定义后使用;DATA定义的字符名称可以先使用后定义,可以放在程序的开头也可以放在结尾处。8、位地址赋值伪指
令BIT格式:字符名称BIT位地址功能:将位地址赋予规定的字符名称。例如:X1BITP1.2相当于X1EQU92H1064.5汇编语言程序设计4.5.151内核单片机的汇编程序总体结构汇编语言源程序一般由主程序、完成特定任务的子程序
及相应功能的中断服务程序等部分组成,结构如下:;--程序头(即定义数据、地址等变量的等值符号)--SCLBITP1.2;定义SCL位变量SIBITP1.3;定义SI位变量C1_ByteEQU30H;定义字节变量C1_ByteConEQU12;常数Con定义为12
……;---------主程序入口地址----------ORG0000H;定义主程序入口地址。107LJMPMain;主程序一般不能存放在这一存储区,不能占用中断服务程序的入口地址。“Main”是主程序入口地址标号。;-
--------中断入口地址----------ORG0003H;0003H是外部中断0的程序入口地址。LJMPINT_0;8个字节用于存放中断服务程序往往不够用,故这里通常放一条长转移指令,转移到后面的中断服务程序处执行ORG000B
H;000BH是定时器T0的中断程序入口地址LJMPINT_T0;转移到后面的中断服务程序处执行。108;----------主程序-------------ORG0100H;定义主程序代码存储区首地址Main:MOVSP,#0BFH;初始化堆栈指针SP及其他特殊;功能寄存器初值。……
;主程序实体,具体指令由程序功能决定LCALLSUB1;调用子程序,其中SUB1为子程序名称……;---------子程序结构-------------ORGxxxxH;定义子程序代码存放区的首地址,;可以不用ORG伪指令,汇编时将代码连续存放,SUB1:;SUB1是子
程序的名称,也是入口地址的标号PUSHPSW……POPPSWRET109;----------中断服务程序结构---------ORGyyyyH;可以省去这条伪指令,使程序代码连续存放。INT_T0:PUSHPSW;即保护现场PUSHAc
cSETBRS0;切换工作寄存器组区CLRRS1……;中断服务程序实体,POPACC;恢复现场POPPSWRETI;清除中断优先级触发器,返回主程序断点END1104.5.2汇编程序设计示例1.算术与逻辑处理程序【
例4-33】设X>Y,试编程实现S=(X-Y)×Z式的算术运算,其中X、Y、Z分别代表片内RAM30H、31H、32H单元内的数据,计算结果S存入片内RAM34H(高字节)、35H(低字节)单元中。分析:由于X>Y,所以X-
Y>0,不需要借位;(X-Y)×Z的结果最多占用两个字节。开始A←XA←A-Y,B←ZB、A←A×B(34H)←B(35H)←A结束111完成该任务的程序段如下:XEQU30HYEQU31HZEQU32HSTART:MOVA,X;A←XCLRCSUBBA,Y;A←A-YMOVB,Z;B←ZM
ULABMOV34H,B;(34H)←A×B(S)的高字节MOV35H,A;(35H)←A×B(S)的低字节112【例4-34】多字节无符号数加法。设从片内RAM30H单元和40H单元开始有两个4字节数,把它们相加,结果存放于30H单元开始的位置
处。(假设低地址存放高字节)参考程序如下:SUB_BIN:MOVR0,#33HMOVR1,#43HMOVR2,#4CLRCLOOP:MOVA,@R0ADDCA,@R1MOV@R0,ADECR0DECR1DJNZR2,LOOP113【例4-35】从片内扩展RAM中0200H单元开始存有100个有符
号字节数据,统计其中正数、0和负数的个数,分别存入R5、R6、R7中。分析:依次从地址中取出数据与0比较,找出等于0的数,并把相应计数器R6加1,再根据符号位是否为1区分出正数和负数,是正数则把R5加1,是负数把R7加1。
参考程序如下:ANLAUXR,#0FDHMOVR2,#100MOVDPTR,#0200HMOVR5,#0MOVR6,#0MOVR7,#0114LOOP:MOVXA,@DPTRCJNEA,#0,NEXT1INCR6
;数据等于0,R6加1SJMPNEXT3NEXT1:JBACC.7,NEXT2INCR5;符号位为0,正数R5加1SJMPNEXT3NEXT2:INCR7;数据是负数,R7加1NEXT3:;三路分支的汇合点INCDPTRDJNZR2,
LOOP115【例4-36】设在STC12C5A60S2系列单片机片内扩展RAM中从0030H地址开始连续存放一个长度不超过100字节的字符串,该字符串以回车符CR(‘CR’=0DH)作为结束标志,要求统计此字符串的长度并存入片内RAM的
2FH单元。参考程序如下:STRADDRDATA0030HSTRLENDATA2FHORG0100HMAIN:ANLAUXR,#0FDHMOVDPTR,#STRADDRMOVSTRLEN,#0FFHLOOP:MOVXA,@DPTRINCDPTRINCSTRLE
NCJNEA,#0DH,LOOP116【例4-37】试编写一程序段实现24位×16位运算。设24位被乘数存放在片内RAM45H、46H、47H单元中,乘数存放在48H、49H单元中,40位乘积保存在40H、41H、42H、43H、44H单元
中。(所有数据按照低地址存放高字节的规律存放)分析:由于51内核单片机只有一条单字节无符号数乘法指令MULAB,因而24位×16位无符号数乘法需要执行六次乘法指令来实现,乘得的结果需按如图4-13所示关系加起来。11745H46H47H×
48H49H[47H×49H]H[46H×49H]L[46H×49H]H[45H×49H]L[45H×49H]H[47H×48H]L[47H×48H]H[46H×48H]L[46H×48H]H[45H×48H]L+[45H×48H]H[][][][][]b39
-b32b31-b24b23-b16b15-b8b7-b0图4-1324位×16位运算关系图[47H×49H]L118MUL2416:CLRA;将用于保存乘积的40H~44H单元清0MOV40H,AMOV41H,AMOV42H,AMOV43H,AMOV44H,A
参考子程序如下:11945H46H47H×48H49H[47H×49H]H[46H×49H]L[46H×49H]H[45H×49H]L[45H×49H]H[47H×48H]L[47H×48H]H[46H×48H]L[46H
×48H]H[45H×48H]L+[45H×48H]H[][][][][]b39-b32b31-b24b23-b16b15-b8b7-b0图4-1324位×16位运算关系图[47H×49H]L120;乘数低8位49H乘被乘数低8位47HMOVA,49H;乘数低8位MOVB,47H;
取被乘数低8位MULABMOV44H,A;保存乘积低8位(b7-b0)MOV43H,B;保存乘积高8位(b15-b8)12145H46H47H×48H49H[47H×49H]H[46H×49H]L[46H×49H]H[45H×49H]L[45H×49H]H[47H×48H]L[47H×4
8H]H[46H×48H]L[46H×48H]H[45H×48H]L+[45H×48H]H[][][][][]b39-b32b31-b24b23-b16b15-b8b7-b0图4-1324位×16位运算关系图[47H×49H]L122;乘数低
8位49H乘被乘数次高8位46HMOVA,49H;取乘数低8位MOVB,46H;取被乘数次高8位MULABADDA,43H;乘积低8位+(b15-b8)MOV43H,A;保存b15-b8CLRAADDCA,B;乘积高8位+CyMOV
42H,A;保存b23-b16;两个最大字节数据相乘0FFH×0FFH=0FE01H,再加1也不会;有进位,即在此不必考虑进位情况12345H46H47H×48H49H[47H×49H]H[46H×49H]L[46H
×49H]H[45H×49H]L[45H×49H]H[47H×48H]L[47H×48H]H[46H×48H]L[46H×48H]H[45H×48H]L+[45H×48H]H[][][][][]b39-b32b31-b24b23-b16b15-b8b7-b0图4-1324位×16位运算关系
图[47H×49H]L124;乘数低8位49H乘被乘数最高8位45HMOVA,49H;取乘数低8位MOVB,45H;取被乘数最高8位MULABADDA,42H;加b23-b16MOV42H,A;保存结果b23-b16CLRAADDCA,
B;加进位标志CyMOV41H,A;保存b31-b2412545H46H47H×48H49H[47H×49H]H[46H×49H]L[46H×49H]H[45H×49H]L[45H×49H]H[47H×48H]L[47H×48H]H[4
6H×48H]L[46H×48H]H[45H×48H]L+[45H×48H]H[][][][][]b39-b32b31-b24b23-b16b15-b8b7-b0图4-1324位×16位运算关系图[4
7H×49H]L126;乘数高8位48H乘被乘数低8位47HMOVA,48H;取乘数高8位MOVB,47H;取被乘数低8位MULABADDA,43H;乘积低8位+(b15-b8)MOV43H,A;保存b15-b8MOVA,42H;取b23-b16
ADDCA,B;乘积高8位+(b23-b16)+CyMOV42H,A;保存b23-b16CLRAADDCA,41H;Cy+(b31-b24)MOV41H,A;保存b31-b24CLRAADDCA,#0;Cy+0MOV40H,A;保存b39-b3212745H46H4
7H×48H49H[47H×49H]H[46H×49H]L[46H×49H]H[45H×49H]L[45H×49H]H[47H×48H]L[47H×48H]H[46H×48H]L[46H×48H]H[45H×48H]L+[45H×
48H]H[][][][][]b39-b32b31-b24b23-b16b15-b8b7-b0图4-1324位×16位运算关系图[47H×49H]L128;乘数高8位48H乘被乘数次高8位46HMOVA,48H;取乘数高8位MOVB,46H;
取被乘数次高8位MULABADDA,42H;乘积低8位+(b23-b16)MOV42H,A;保存b23-b16MOVA,41H;取b31-b24ADDCA,B;乘积高8位+(b31-b24)MOV41H,A;保
存b31-b24CLRAADDCA,40H;Cy+(b39-b32)MOV40H,A;保存b39-b3212945H46H47H×48H49H[47H×49H]H[46H×49H]L[46H×49H]H[45H×49H]L[
45H×49H]H[47H×48H]L[47H×48H]H[46H×48H]L[46H×48H]H[45H×48H]L+[45H×48H]H[][][][][]b39-b32b31-b24b23-b16b15-b8b7-b0图4-1324位×16位
运算关系图[47H×49H]L130;乘数高8位48H乘被乘数最高8位45HMOVA,48H;取乘数高8位MOVB,45H;取被乘数最高8位MULABADDA,41H;乘积低8位+(b31-b24)MOV41H,A
;保存b31-b24MOVA,40H;取b39-b32ADDCA,B;乘积高8位+(b39-b32)+CyMOV40H,A;保存b39-b32RET1312.数制转换程序【例4-38】将一位十六进制数转换成ASC1I码。设十六进制数
存于片内RAM30H单元,转换的结果存于片内RAM40H单元。分析:0-9的ASCII码为30H-39H,A-F的ASCII码为41H-46H,转换时,将0-9之间的数加30H,A-F之间的数加37H(加07H后再加30H),就可得到ASCII码。参考程序如下:MOV
A,30HCJNEA,#0AH,EXCH1EXCH1:JCEXCH2ADDA,#07HEXCH2:ADDA,#30HMOV40H,A132【例4-39】将存放在R2中的压缩形式的BCD码转换为二进制数,结果送回R2。分析:R2中的高4位(a1)×10加R2中的低4位(a0)即为结果。参考子
程序如下:B_BCD_BI:MOVA,R2ANLA,#0F0HSWAPAMOVB,#10MULABMOVB,AMOVA,R2ANLA,#0FHADDA,BMOVR2,ARET133【例4-40】将存放在R3、R2中压
缩形式的BCD码转换为二进制数,结果回送到R3、R2中。分析:a3×103+a2×102+a1×10+a0=(a3×10+a2)×100+(a1×10+a0),直接引用上题子程序完成本题运算。参考子程序如下:W_BCD_BI:LCALLB_
BCD_BIMOVR4,AMOVA,R3MOVR2,ALCALLB_BCD_BIMOVB,#100MULABADDA,R4MOVR2,AMOVA,BADDCA,#0MOVR3,ARET134【例4-41】试编写一段程序:把存放在R3、R2中不超过270FH(十进制数
9999)的十六进制数转换为压缩BCD码,结果存放在R7、R6中。分析:本题需要分别求出该数的个位、十位、百位和千位,以压缩BCD码的形式存放在R7、R6中。只要将该数除以1000即可得到千位数字,再将余数除以100即可得到百位数字,以此类推可得十位数字和个位数字。但51内核单片机只
有8位除法指令,没有16位除法指令,故这里不能用除法指令运算。1000=3E8H,100=64H。求千位、百位时,可通过多字节减法指令实现,用该数减去1000,记录减的次数直到出现借位为止,该次数就是千位数字,百位数字也可依据此法得到;而十位及个位不
超过99,可通过单字节除法指令实现。135参考子程序如下:W_BI_BCD:;求千位码MOVB,#0CLRCLOOP1:MOVA,R2SUBBA,#0E8HMOVR4,AMOVA,R3SUBBA,#03HJCNEXT1MOVR3,AMOVA,R4MOVR2,AINCBS
JMPLOOP1NEXT1:MOVA,BSWAPAMOVR7,A;求百位码MOVB,#0CLRCLOOP2:MOVA,R2SUBBA,#100MOVR4,AMOVA,R3136SUBBA,#00HJCNEXT2MOVR3,AMOVA,R4MOVR2,AINCBSJMPLOO
P2NEXT2:MOVA,R7ORLA,BMOVR7,AMOVA,R2MOVB,#10DIVABSWAPAORLA,BMOVR6,ARET1373.多分支散转程序Ø使用转移指令表的散转程序这种散转程序的设计方法是:依据指令码通过把多分支转移指令组成一个
指令表,用一条无条件转移指令实现转向某一分支程序。用控制转移指令可以很方便地构造两分支的程序,在实际应用中,如执行键盘指令,还要求多分支转移,称为散转程序。用多分支转移指令JMP@A+DPTR可以方便地实现散转。138【例4
-42】现有128路分支,分支号分别为0~127,要求根据R2中的指令码转向各个分支的程序。即当(R2)=0,转向OPR0;(R2)=1,转向OPR1;…(R2)=127,转向OPR127。参考程序如下:MOVA,R2RLAMOVDPTR,#TABJMP@A+DPTRTAB:AJMPOPR0
AJMPOPR1……AJMPOPR127AJMP指令的转移目的地址与AJMP指令应属于同一2KB范围,在大程序中,最好应用LJMP(指令长度为3字节)。139参考程序如下:MOVDPTR,#TABMOVA,R2MOVB,#3MULABXCHA,BADDA,DPHMOVDPH,
AXCHA,BJMP@A+DPTRTAB:LJMPOPR0LJMPOPR1LJMPOPR2……LJMPOPR127以上例题也适合于分支数大于128,小于256的情况。140Ø使用位检测指令的散转程序【例4-43】根据P1口各引脚的输入状态(低电平有效)散转到
不同的处理程序处执行。分析:若P1.0为0,转PRG0处执行,P1.1为0则转PRG1处执行。参考程序如下:BIT_JMP:JNBP1.0,LP0JNBP1.1,LP1JNBP1.2,LP2JNBP1.3,LP3JNBP1.4,LP4JNBP1.5,LP5JNBP1.6,LP6JNBP1.
7,LP7LJMP……;P1口各引脚;都不为低,转移LP0:LJMPPRG0LP1:LJMPPRG1LP7:LJMPPRG7