第3章80C51单片机汇编语言概述.ppt
- 文档编号:30785371
- 上传时间:2023-09-14
- 格式:PPT
- 页数:50
- 大小:1.63MB
第3章80C51单片机汇编语言概述.ppt
《第3章80C51单片机汇编语言概述.ppt》由会员分享,可在线阅读,更多相关《第3章80C51单片机汇编语言概述.ppt(50页珍藏版)》请在冰豆网上搜索。
2023/9/14,1,第3章80C51单片机汇编语言概述,单片机可执行程序生成示例,3.1,汇编指令格式与寻址方式,3.2,汇编器的伪指令,3.3,80C51的指令系统,3.4,汇编语言程序示例,3.5,2023/9/14,2,3.1单片机可执行程序生成示例,3.1.1编辑源文件,【例3-1】编写程序,实现将30H至3FH共16个RAM单元初始化为“55H”的功能。
ORG0000HMAIN:
MOVR7,#16;R7存放单元数量16MOVR0,#30H;R0作为地址寄存器,初值为30HMOVA,#55H;数据55H放入累加器中LOOP:
MOVR0,A;累加器内容送入R0指向的单元中INCR0;调整地址指向下一单元DJNZR7,LOOP;循环直至16个单元全都完成SJMP$;踏步暂停END,2023/9/14,3,3.1.2汇编与连接,汇编连接后得到目标文件。
3.1.3可执行程序的写入,:
记录长度|起始地址|记录类型|指令代码|校验和,2023/9/14,4,3.2汇编指令格式及寻址方式,3.2.1汇编语言的指令格式,标号:
指令助记符操作数1,操作数2,操作数3,;注释,标号是指令的符号地址,以非数字字符开头;助记符是指令功能的英文缩写;操作数是指令要操作的数据或数据的地址;注释字段可以增加程序的可读性。
运算符(表3.1):
NOT、HIGH、LOW、MOD、SHL、SHR、AND、OR、XOR等。
例:
17/5结果为3、17MOD5结果为2。
2023/9/14,5,Rn(n=07)-当前工作寄存器组中的寄存器R0R7之一Ri(i=0,1)-当前工作寄存器组中的寄存器R0或R1-间址寄存器前缀#data-8位立即数/#data16-16位立即数direct-片内低128个RAM单元地址及SFR地址addr11-11位目的地址addr16-16位目的地址rel-8位地址偏移量,范围:
128127bit-片内RAM位地址、SFR的位地址()-表示地址单元或寄存器中的内容/-位操作数的取反操作前缀,3.2.2汇编指令功能描述符号,2023/9/14,6,一、寄存器寻址,寻址方式:
寻找(源)操作数或指令转移地址的方式仅介绍5种操作数寻址方式,操作数在寄存器中寻址空间:
R0R7、A、B(AB形式)和DPTR,特点:
传送和执行速度快,【例】若(R0)=30H,执行MOVA,R0后,(A)=30H,3.2.3操作数寻址方式,2023/9/14,7,二、直接寻址,操作码后接字节存放的是操作数地址寻址空间:
片内RAM低128字节SFR(符号形式),另一类直接寻址是转移目标地址的寻址。
如:
LJMPADDR16,【例】若(50H)=3AH,,执行MOVA,50H后,(A)=3AH,2023/9/14,8,三、寄存器间接寻址,寄存器中的内容是操作数的地址寻址空间:
片内RAM(Ri、SP)片外RAM(Ri、DPTR),【例】若(R0)=30H,(30H)=5AH,执行MOVA,R0后,(A)=5AH,指令助记符:
片内:
MOV片外:
MOVX,2023/9/14,9,四、立即寻址,操作数在指令编码中寻址空间:
ROM,对于MOVDPTR,#2100H指令,立即数高8位“21H”装入DPH,【例】执行MOVA,#50H,结果:
(A)=50H,2023/9/14,10,五、变址寻址,操作数地址:
基地址+偏移量寻址空间:
ROM,变址寻址还用于跳转指令,如JMPA+DPTR,【例】(A)0FH,(DPTR)=2400H,执行MOVCA,A+DPTR”后,结果:
(A)=88H,2023/9/14,11,3.3汇编器的伪指令,伪指令是汇编器能够识别并对汇编过程进行某种指示的命令。
一、状态控制伪指令,ORG、END,二、符号定义伪指令,EQU、BIT例:
LENEQU10,三、存储空间初始化伪指令,DB,DW例:
DB-1,2,四、其他伪指令,见表3.3所示。
2023/9/14,12,3.4.1数据传送类指令(29条),一般不影响标志寄存器PSW的状态。
传送类指令有两大类,3.480C51的指令系统,一般传送(MOV)特殊传送,如:
MOVCMOVXPUSH、POPXCH、XCHDSWAP,2023/9/14,13,一、一般传送指令,16位传送(仅1条),8位传送,MOVDPTR,#2100H;DPTR#2100H,以A为目的,例如:
MOVA,#55H;A#55HMOVA,55H;A(55H)MOVA,R0;A(R0)MOVA,R0;A(R0),以Rn为目的,例如:
MOVR7,A;R7(A)MOVR7,#55H;R7#55HMOVR7,55H;R7(55H),2023/9/14,14,以direct为目的,例如:
MOV30H,A;(30H)(A)MOV30H,#55H;(30H)#55HMOV30H,55H;(30H)(55H)MOV30H,R0;(30H)(R0)MOV30H,R0;(30H)(R0),以Ri为目的,例如:
MOVR0,A;(R0)AMOVR0,#55H;(R0)#55HMOVR0,55H;(R0)(55H),2023/9/14,15,二、特殊传送指令,入栈指令PUSH,堆栈操作指令PUSH和POP,堆栈是一片存储区,遵循“后进先出”原则,栈顶由SP指示。
80C51的堆栈设在片内RAM低端的128个单元,向上生长。
PUSHdirect;SP(SP)1,(SP)(direct),出栈指令POP,POPdirect;(direct)(SP),SP(SP)1,注:
堆栈用于子程序调用时保护返回地址,或者用于保护子程序调用之前的某些重要数据(即保护现场),还可以用于数据交换。
数据交换指令XCH、XCHD和SWAP,数据交换属于同时进行的双向传送,XCHA,55H;(A),XCHA,R7;(A),XCHA,R0;(A),(R0),(55H),字节交换,例如:
(R7),半字节交换,例如:
XCHDA,R0;,SWAPA;,间址操作数的低半字节与A的低半字节互换。
累加器的高低4位互换,2023/9/14,17,读片外RAM,片外RAM(或接口)传送指令MOVX,片外RAM中经常存放数据采集与处理的中间数据,MOVXA,DPTR;A(DPTR)MOVXA,Ri;A(Ri),写片外RAM,MOVXDPTR,A;(DPTR)AMOVXRi,A;(Ri)A,注意:
用Ri寻址时,高8位地址由P2口提供,以DPTR内容为基址,读ROM中常数表项指令MOVC,ROM中可以存放程序代码,还经常存放常数表,MOVCA,A+DPTR;A(A)+(DPTR),以PC内容为基址,MOVCA,A+PC;A(A)+(PC),常数表存放约束小,称为远程查表指令。
占用DPTR,常数表存放约束大,称为近程查表指令。
不占用DPTR,2023/9/14,19,3.4.2算数运算类指令(24条),算数运算结果要影响PSW中标志位,CY为1,无符号数(字节)加减发生进位或借位OV为1,有符号数(字节)加减发生溢出错误AC为1,十进制数(BCD码)加法的结果应调整P为1,存于累加器A中操作结果的“1”的个数为奇数,标志位意义,标志位与相关指令影响,2023/9/14,20,算数运算影响标志位示例,有2个参与相加的机器数,一个是84H,另一个是49H。
试分析运算过程及其对状态标志的影响。
结果:
CY为0;AC为0;OV为0;P为1,1、对于无符号数:
第一个数为132(84H),第二个数为73(49H),相加后,由于CY为0,所以结果为CDH(即205)。
运算结果分析:
2、对于有符号数:
第一个数为-124(84H),第二个数为73(49H),相加后,由于OV为0,没有溢出。
所以结果为-33H(CDH为-33H的补码)。
3、对于BCD数:
第一个数为84(84H),第二个数为49(49H),相加后,中间结果为CDH,加66H进行调整,结果:
CY=1,数值33H(即十进制的133)。
结论:
同样的两个机器数,编程人员对其不同的数据属性约定,会产生不同的运算结果解释。
所以,编程人员在程序设计的开始,就应该首先确定参与运算的数据是采用有符号数还是采用无符号数或是采用BCD数。
2023/9/14,23,一、加法,不带进位加法,ADDA,#55H;A(A)+#55HADDA,55H;A(A)+(55H)ADDA,R7;A(A)+(R7)ADDA,R0;A(A)+(R0),带进位加法(这组指令方便了多字节加法的实现),ADDCA,#55H;A(A)+#55H+(CY)ADDCA,55H;A(A)+(55H)+(CY)ADDCA,R7;A(A)+(R7)+(CY)ADDCA,R0;A(A)+(R0)+(CY),2023/9/14,24,加1,INCA;A(A)+1INC55H;(55H)(55H)+1INCR7;R7(R7)+1INCR0;(R0)(R0)+1INCDPTR;DPTR(DPTR)+1,十进制调整,DAA;调整A的内容为正确的BCD码,两个压缩的BCD码按二进制相加后,必须经过调整方能得到正确的和。
2023/9/14,25,二、减法,带借位减法,用此组指令完成不带借位的减法,只需先清CY为0即可,CY为1,表示D7位需借位AC为1,表示D3位需借位OV为1,表示“D6有借位D7无借位”或“D7有借位D6无借位”,SUBBA,#55H;A(A)-#55H-(CY)SUBBA,55H;A(A)-(55H)-(CY)SUBBA,R7;A(A)-(R7)-(CY)SUBBA,R0;A(A)-(R0)-(CY),2023/9/14,26,减1,这组指令仅DECA影响P标志。
其余指令都不影响标志位的状态。
DECA;A(A)-1DEC55H;(55H)(55H)-1DECR7;R7(R7)-1DECR0;(R0)(R0)-1,2023/9/14,27,三、乘法和除法,乘法指令:
MULAB;A与B相乘,无符号结果:
B中为积的高8位,A中为积的低8位。
CY总是被清0;OV=1表示积大于FFH,除法指令:
DIVAB;A除以B,无符号结果:
A中为商的整数部分,B中为余数CY总是被清0;OV=1表示除数为0,2023/9/14,28,3.4.3逻辑运算与循环类指令(24条),一、逻辑与,逻辑:
与、或、异或、清0和取反循环:
左、右移,带进位位左、右移,与操作常用于对某些不关心位进行“清0”,同时“保留”另一些关心位,ANL55H,#55H;(55H)(55H)#55HANL55H,A;(55H)(55H)(A)ANLA,#55H;A(A)#55HANLA,55H;A(A)(55H)ANLA,R7;A(A)(R7)ANLA,R0;A(A)(R0),2023/9/14,29,二、逻辑或,或操作常用于对某些关心位进行“置1”,不关心位保持不变,ORL55H,#55H;(55H)(55H)#55HORL55H,A;(55H)(55H)(A)ORLA,#55H;A(A)#55HORLA,55H;A(A)(55H)ORLA,R7;A(A)(R7)ORLA,R0;A(A)(R0),2023/9/14,30,三、逻辑异或,异或操作常用于对某些关心位进行“取反”,不关心位保持不变,XRL55H,#55H;(55H)(55H)#55HXRL55H,A;(55H)(55H)(A)XRLA,#55H;A(A)#55HXRLA,55H;A(A)(55H)XRLA,R7;A(A)(R7)XRLA,R0;A(A)(R0),2023/9/14,31,五、累加器循环移位,四、累加器清0和取反,CLRA;A0CPLA;A的内容取反,RRA;右循环RRCA;带进位右循环RLA;左循环RLCA;带进位左循环,2023/9/14,32,3.4.4控制转移类指令(17条),一、无条件转移,短跳转,AJMPaddr11;2k范围跳转,长跳转,LJMPaddr16;64k范围跳转,相对转移,SJMPrel;127128范围跳转,散转移,JMPA+DPTR;完成多条判跳指令的功能,2023/9/14,33,【例】功能:
当(A)=00H时,程序将转到ROUT0处执行;当(A)=02H时,程序将转到ROUT1处执行;。
MOVDPTR,#TABLEJMPA+DPTRTABLE:
AJMPROUT0AJMPROUT1AJMPROUT2AJMPROUT3,2023/9/14,34,二、条件转移,累加器判0转移,比较不等转移,JZrel;若(A)=0,则PC(PC)+2+relJNZrel;若(A)0,则PC(PC)+2+rel,CJNEA,55H,rel;CJNEA,#55H,rel;CJNER7,#55H,rel;CJNER0,#55H,rel;,减1不为0转移,DJNZR7,rel;DJNZ55H,rel;,2023/9/14,35,调用,三、调用与返回,ACALLaddr11;2k范围调用LCALLaddr16;64k范围调用,返回,RET;子程序返回RETI;中断子程序返回,RETI具有清除内部相应的中断状态触发器(以保证正确的中断逻辑)的功能。
四、空操作,NOP;PC(PC)+1,占1个周期、一个字节,2023/9/14,36,3.4.5位操作类指令(17条),位操作是以位为单位进行的各种操作。
位操作指令中的位地址有4种表示形式:
直接地址(如,0D5H);点操作符(如,0D0H.5、PSW.5等);位名称(如,F0);伪指令定义(如,MYFLAGBITF0)。
以上几种形式表示的都是PSW中的位5。
位操作指令中,位累加器要用“C”表示(注:
而CY与具体的直接位地址D7H对应)。
试比较:
A与ACC的关系?
2023/9/14,37,一、位传送,MOV20H,C;(20H)(CY)MOVC,20H;CY(20H),二、位状态设置,位清0,位置位,CLRC;CY0CLR00H;(00H)0,SETBC;CY1SETB00H;(00H)1,2023/9/14,38,三、位逻辑运算,位逻辑与,位逻辑或,位取反,ANLC,00H;CY(CY)(00H)ANLC,/00H;CY(CY)(00H)取反,ORLC,00H;CY(CY)(00H)ORLC,/00H;CY(CY)(00H)取反,CPLC;CY(CY)取反CPLC,00H;(00H)(00H)取反,2023/9/14,39,判CY转移,判bit转移,四、位判跳(条件转移),;若(CY)=1,PC(PC)+2+rel,否则顺次执行。
;若(CY)=0,PC(PC)+2+rel,否则顺次执行。
;(00H)=1,PC(PC)+3+rel,否则顺次执行。
;(00H)=1,PC(PC)+3+rel,00H0,否则顺次执行;(00H)=0,PC(PC)+3+rel,否则顺次执行,3.5汇编语言程序示例,3.5.1顺序程序,(无分支、无循环),【例3-2】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。
编写程序将该数据转换成压缩BCD码存放在20H单元。
ORG0040HSTART:
MOVA,21H;取十位ASCII码ANLA,#0FH;保留低半字节SWAPA;移至高半字节MOV20H,A;存于20H单元MOVA,22H;取个位ASCII码ANLA,#0FH;保留低半字节ORL20H,A;合并到结果单元SJMP$END,3.5.2分支程序,(单分支、双分支、多分支),【例3-3】设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:
当x大于0时,y=x;当x=0时,y=20H;当x小于0时,y=x+5。
编制程序,根据x的大小求y并送回原单元。
ORG0040HSTART:
MOVA,30H;取x至累加器JZNEXT;x=0,转NEXTANLA,#80H;否,保留符号位JZDONE;x0,转结束MOVA,#05H;x0处理ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:
MOV30H,#20H;x=0,20H送YDONE:
SJMPDONEEND,【例3-4】根据R7的内容x(转移序号)转向相应的处理程序。
设R7内容为04,对应的处理程序入口地址分别为PP0PP4。
START:
MOVR7,#3;以转移序号3为例ACALLJPNUMAJMPSTARTJPNUM:
MOVDPTR,#TAB;置分支入口地址表首址MOVA,R7ADDA,R7;乘2,调整偏移量MOVR3,AMOVCA,A+DPTR;取地址高字节,暂存于R3XCHA,R3INCAMOVCA,A+DPTR;取地址低字节MOVDPL,A;处理程序入口地址低8位送DPLMOVDPH,R3;处理程序入口地址高8位送DPHCLRAJMPA+DPTR,TAB:
DWPP0DWPP1DWPP2DWPP3DWPP4PP0:
MOV30H,#0;转移序号为0时,置功能号“0”于30H单元RETPP1:
MOV30H,#1;转移序号为1时,置功能号“1”于30H单元RETPP2:
MOV30H,#2;转移序号为2时,置功能号“2”于30H单元RETPP3:
MOV30H,#3;转移序号为3时,置功能号“3”于30H单元RETPP4:
MOV30H,#4;转移序号为4时,置功能号“4”于30H单元RET,3.5.3循环程序,(2种:
先执行,后判断;先判断,后执行),【例3-5】编写程序,将内部RAM的30H至3FH单元初始化为00H。
MAIN:
MOVR0,#30H;置初值MOVA,#00H;MOVR7,#16;LOOP:
MOVR0,A;循环处理INCR0;DJNZR7,LOOP;循环修改,判结束SJMP$;结束处理,【例3-6】将内部RAM起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域,直到发现$字符停止传送。
MAIN:
MOVR0,#60H;置初值MOVDPTR,#1000HLOOP0:
MOVA,R0;取数据CJNEA,#24H,LOOP1;循环结束?
SJMPDONE;是LOOP1:
MOVXDPTR,A;循环处理INCR0;循环修改INCDPTRSJMPLOOP0;继续循环DONE:
SJMPDONE;结束处理,【例3-7】利用子程序实现。
设a,b,c分别存于内部RAM的30H,31H,32H三个单元中。
SQR:
MOVDPTR,#TABMOVCA,A+DPTRRETTAB:
DB0,1,4,9,16,25,36,49,64,81,验证(见书64页)。
ThankYou!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 80 C51 单片机 汇编语言 概述