第四章 汇编语言程序设计基础.docx
- 文档编号:23852152
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:44
- 大小:46.19KB
第四章 汇编语言程序设计基础.docx
《第四章 汇编语言程序设计基础.docx》由会员分享,可在线阅读,更多相关《第四章 汇编语言程序设计基础.docx(44页珍藏版)》请在冰豆网上搜索。
第四章汇编语言程序设计基础
第四章汇编语言程序设计基础
4.1单片机指令速记:
英文还原法
汇编指令是采用助记符的形式构成的指令系统,很多指令的均是对应功能的英文单词的缩写,下面还原了一些指令的英文单词来源,便于加深对于指令的记忆和功能的理解。
DEC(Decrement):
减1
INC(Increment):
加1
ADD:
加
SUBB(Subtract):
减
DIV(Divide):
除
MUL(Multiply):
乘
CLR(Clear):
清零
ANL(AndLogic):
逻辑与
RL(RecursionLeft)循环左移
RR(RecursionRight)循环右移
XCH(Exchange):
字节交换
SWAP:
高低四位互换
JMP(Jump):
跳
LJMP(LongJump):
长跳转
SJMP(ShortJump):
短跳转
AJMP(AbsoluteJump):
绝对跳转
CALL:
调用
ACALL(absolutecall):
绝对调用
LCALL(longcall):
长调用
JZ(JumpZero):
累加器A为0跳转
JNZ(JumpNotZero):
累加器A不为0跳转
CJNE(CompareJumpNotEqual):
比较不相等跳转
DJNZ(DecJumpNotZero):
减1不为0跳转
4.2MCS-51单片机汇编指令速查表
MCS 51汇编指令速查表
类别
指令格式
功能简述
字节数
周期
数
据
传
送
类
指
令
期
MOV A,Rn
寄存器送累加器
1
1
MOV Rn,A
累加器送寄存器
1
1
MOV A,@Ri
内部RAM单元送累加器
1
1
MOV @Ri,A
累加器送内部RAM单元
1
1
MOV A,#data
立即数送累加器
2
1
MOV A,direct
直接寻址单元送累加器
2
1
MOV direct,A
累加器送直接寻址单元
2
1
MOV Rn,#data
立即数送寄存器
2
1
MOV direct,#data
立即数送直接寻址单元
3
2
MOV @Ri,#data
立即数送内部RAM单元
2
1
MOV direct,Rn
寄存器送直接寻址单元
2
2
MOV Rn,direct
直接寻址单元送寄存器
2
2
MOV direct,@Ri
内部RAM单元送直接寻址单元
2
2
MOV @Ri,direct
直接寻址单元送内部RAM单元
2
2
MOV direct2,direct1
直接寻址单元送直接寻址单元
3
2
MOV DPTR,#data16
16位立即数送数据指针
3
2
MOVX A,@Ri
外部RAM单元送累加器(8位地址)
1
2
MOVX @Ri,A
累加器送外部RAM单元(8位地址)
1
2
MOVX A,@DPTR
外部RAM单元送累加器(16位地址)
1
2
MOVX @DPTR,A
累加器送外部RAM单元(16位地址)
1
2
MOVC A,@A+DPTR
查表数据送累加器(DPTR为基址)
1
2
MOVC A,@A+PC
查表数据送累加器(PC为基址)
1
2
算
术
运
算
类
指
令
XCH A,Rn
累加器与寄存器交换
1
1
XCH A,@Ri
累加器与内部RAM单元交换
1
1
XCHD A,direct
累加器与直接寻址单元交换
2
1
XCHD A,@Ri
累加器与内部RAM单元低4位交换
1
1
SWAP A
累加器高4位与低4位交换
1
1
POP direct
栈顶弹出指令直接寻址单元
2
2
PUSH direct
直接寻址单元压入栈顶
2
2
ADD A,Rn
累加器加寄存器
1
1
ADD A,@Ri
累加器加内部RAM单元
1
1
ADD A,direct
累加器加直接寻址单元
2
1
ADD A,#data
累加器加立即数
2
1
ADDC A,Rn
累加器加寄存器和进位标志
1
1
ADDC A,@Ri
累加器加内部RAM单元和进位标志
1
1
ADDC A,#data
累加器加立即数和进位标志
2
1
ADDC A,direct
累加器加直接寻址单元和进位标志
2
1
INC A
累加器加1
1
1
INC Rn
寄存器加1
1
1
INC direct
直接寻址单元加1
2
1
INC @Ri
内部RAM单元加1
1
1
INC DPTR
数据指针加1
1
2
DA A
十进制调整
1
1
SUBB A,Rn
累加器减寄存器和进位标志
1
1
SUBB A,@Ri
累加器减内部RAM单元和进位标志
1
1
SUBB A,#data
累加器减立即数和进位标志
2
1
SUBB A,direct
累加器减直接寻址单元和进位标志
2
1
DEC A
累加器减1
1
1
DEC Rn
寄存器减1
1
1
DEC @Ri
内部RAM单元减1
1
1
DEC direct
直接寻址单元减1
2
1
MUL AB
累加器乘寄存器B
1
4
DIV AB
累加器除以寄存器B
1
4
逻
辑
运
算
类
指
令
ANL A,Rn
累加器与寄存器
1
1
ANL A,@Ri
累加器与内部RAM单元
1
1
ANL A,#data
累加器与立即数
2
1
ANL A,direct
累加器与直接寻址单元
2
1
ANL direct,A
直接寻址单元与累加器
2
1
ANL direct,#data
直接寻址单元与立即数
3
1
ORL A,Rn
累加器或寄存器
1
1
ORL A,@Ri
累加器或内部RAM单元
1
1
ORL A,#data
累加器或立即数
2
1
ORL A,direct
累加器或直接寻址单元
2
1
ORL direct,A
直接寻址单元或累加器
2
1
ORL direct,#data
直接寻址单元或立即数
3
1
XRL A,Rn
累加器异或寄存器
1
1
XRL A,@Ri
累加器异或内部RAM单元
1
1
XRL A,#data
累加器异或立即数
2
1
XRL A,direct
累加器异或直接寻址单元
2
1
XRL direct,A
直接寻址单元异或累加器
2
1
XRL direct,#data
直接寻址单元异或立即数
3
2
RL A
累加器左循环移位
1
1
RLC A
累加器连进位标志左循环移位
1
1
RR A
累加器右循环移位
1
1
RRC A
累加器连进位标志右循环移位
1
1
CPL A
累加器取反
1
1
CLR A
累加器清零
1
1
控
制
转
移
类
指
令
ACCALLaddr11
2KB范围内绝对调用
2
2
AJMP addr11
2KB范围内绝对转移
2
2
LCALL addr16
2KB范围内长调用
3
2
LJMP addr16
2KB范围内长转移
3
2
SJMP rel
相对短转移
2
2
JMP @A+DPTR
相对长转移
1
2
RET
子程序返回
1
2
RET1
中断返回
1
2
JZ rel
累加器为零转移
2
2
JNZ rel
累加器非零转移
2
2
CJNE A,#data,rel
累加器与立即数不等转移
3
2
CJNE A,direct,rel
累加器与直接寻址单元不等转移
3
2
CJNE Rn,#data,rel
寄存器与立即数不等转移
3
2
CJNE @Ri,#data,rel
RAM单元与立即数不等转移
3
2
DJNZ Rn,rel
寄存器减1不为零转移
2
2
DJNZ direct ,rel
直接寻址单元减1不为零转移
3
2
布
尔
操
作
类
指
令
NOP
空操作
1
1
MOV C,bit
直接寻址位送C
2
1
MOV bit,C
C送直接寻址位
2
1
CLR C
C清零
1
1
CLR bit
直接寻址位清零
2
1
CPL C
C取反
1
1
CPL bit
直接寻址位取反
2
1
SETB C
C置位
1
1
SETB bit
直接寻址位置位
2
1
ANL C,bit
C逻辑与直接寻址位
2
2
ANL C,/bit
C逻辑与直接寻址位的反
2
2
ORL C,bit
C逻辑或直接寻址位
2
2
ORL C,/bit
C逻辑或直接寻址位的反
2
2
JC rel
C为1转移
2
2
JNC rel
C为零转移
2
2
JB bit,rel
直接寻址位为1转移
3
2
JNB bit,rel
直接寻址为0转移
3
2
JBC bit,rel
直接寻址位为1转移并清该位
3
2
4.3单片机的寻址方式
1、立即寻址
操作数以立即数的形式出现在指令中,操作数前要加“#”
MOVA,#3AH
MOVDPTR,#0DFFFH
2、直接寻址
指令中的操作数地址直接给出,可以寻址的空间有三种:
(1)内部数据存储器的低128个字节单元(00H~7FH)
(2)特殊功能寄存器(只能用直接寻址方式访问)
(3)位地址空间
MOVA,30H;
MOVIE,#82H;
SETB07H
3、寄存器寻址
操作数存放在寄存器中;寄存器包括:
R0~R7、A、B、DPTR、C
INCR1
MOVA,R0
4、寄存器间接寻址
寄存器中的内容是操作数的地址。
间址寄存器只能是R0、R1、DPTR;访问内部RAM时,用R0、R1;访问外部RAM时,三个都可以使用;在使用时,间址寄存器前要加@。
MOVA,@R0
MOVXA,@DPTR
5、基址寄存器加变址寄存器寻址
操作数的地址是两种寄存器内容的和;这种寻址方式用于访问程序存储器中的数据表格。
基址寄存器:
PC、DPTR
变址寄存器:
A
MOVCA,@DPTR+A
MOVCA,@PC+A
JMP@A+DPTR
6、相对寻址
在相对转移指令中,以PC中的内容为基本地址,加上指令中给出的偏移量,作为操作数的转移地址。
JZLOOP;
DJNZSTART
7、位寻址
操作数在内部RAM中的某一位中,位寻址时必须用位指令。
MOVbit,C
CLRC;
CLR00H
4.4指令系统
单片机的指令系统包括数据传送指令,算术运算指令,逻辑运算指令,位操作指令,控制转移指令
4.4.1数据传送类指令
数据传送类指令共有29条,8个助记符:
MOV、MOVX、MOVC、XCH、XCHD、PUSH、POP、SWAP;源操作数可以是立即、寄存器、直接、寄存器间接、基址加变址5种寻址方式;目的操作数可以用寄存器、寄存器间接、直接3种寻址方式。
除了堆栈操作可以影响标志位外,其他的指令都不能改变标志位。
指令执行后源操作数不变,目的操作数修改为源操作数。
1、数据传送到累加器A的指令
MOVA,R0
MOVA,direct
MOVA,@Ri
MOVA,#data
2、数据传送到工作寄存器Rn的指令
MOVRn,A
MOVRn,direct
MOVRn,#data
3、数据传送到内部RAM或SFR的指令
MOVdirect,A
MOVdirect,Rn
MOVdirect,direct
MOVdirect,@Ri
MOVdirect,#data
MOV@Ri,A
MOV@Ri,#data
MOVDPTR,#data
片内RAM数据传送指令实例
补例分析下列程序运行后R0,R1,40H,41H单元中为何值?
MOV30H,#40H
MOV41H,#11H
MOVA,30H
MOVR1,A
MOVA,#00H
MOV@R1,A
MOVR0,41H
MOV50H,#22H
MOV41H,50H
答案(R0)=11H,(R1)=40H
(40)=00H,(41H)=22H
4.累加器A与外部数据存储器的传送指令
MOVXA,@DPTR
MOVXA,@RI
MOVX@DPTR,A
MOVX@RI,A
注:
片外8位地址使用Ri,16位地址采用DPTR;必须通过累加器进行数据传输;只能用寄存器间接寻址方式。
片外RAM数据传递举例
(1)
例4-1有一输入设备,其端口地址位2040H,该端口数据为41H,将其存入到片内RAM的20H单元。
MOVDPTR,#2040H
MOVXA,@DPTR
MOV20H,A
例4-2有一输出设备,其端口地址为2041H,将片内RAM的20H单元的数据传送至该输出设备
MOVDPTR,#2041H
MOVA,20H
MOVX@DPTR,A
片外RAM数据传递举例
(2)
例4-3将片外RAM的2000H单元的数61H取出,送至片外RAM的3FFFH断源中。
MOVDPTR,#2000H
MOVXA,@DPTR
MOVDPTR,#3FFFH
MOVX@DPTR,A
5、累加器A与程序存储器之间的传送指令
①MOVCA,@A+PCA←((A)+(PC+1))
②MOVCA,@A+DPTRA←((A)+(DPTR))
说明:
这两条指令用于查找存放在程序存储器中的常数表格。
第①条指令是以PC为基地址寄存器,A中的内容是无符号数,二者之和作为物理地址进行寻址。
在实际应用时,通常要计算偏移量(即A中的值),计算方法如下:
偏移量=表首地址-(PC+1)
注意:
由于A的值为无符号数,而且PC的值不能人为的改变,所以表格只能放在当前指令的下面。
第②条指令是以DPTR作为基地址寄存器,由于DPTR的值可以改变,所以用这种指令指令时,表格可以随便放。
但有一点要注意的是由于DPTR使用的频率比较高,所以每次使用前最好入栈保护
ROM数据传送举例1
例4-4从LED代码表中查询3的代码送至片外RAM的1200H单元。
源程序MOVA,#0AH
MOVCA,@A+PC
MOVDPTR,#1200H;3字节
MOVX@DPTR,A;1字节
NOP;1字节
NOP;1字节
RET;1字节
TAB:
DB0C0H
DB0F9H
DB0A4H
DB0B0H;”3”代码
DB99H
ROM数据传送举例2
例4-54000HROM单元的内容送到片内RAM60H单元
MOVDPTR,#4000H
MOVA,#00H
MOVCA,@A+DPTR
MOV60H,A
例4-64000H的ROM单元内容传送到片外RAM的60H单元
MOVDPTR,#4000H
MOVA,#00H
MOVCA,@A+DPTR
MOVR0,#60H
MOVX@R0,A
6.字节交换指令
XCHA,Rn
XCHA,@Ri
XCHA,direct
XCHDA,@Ri
SWAPA
例4-7A=3FH,R0=20H,(20H)=46H,执行指令:
XCHA,@R0
结果:
A=46H,(20H)=3FH
若执行的指令是XCHDA,@R0,则结果为:
A=36H,(20H)=4FH
例4-8已知外部RAM的20H单元的内容为38H,内部RAM的20H单元的内容为08H,将这两个单元的内容互换。
MOVR0,#20H
MOVXA,@R0
XCHA,@R1
MOVX@R1,A
7.堆栈操作指令
PUSHdirect
POPdirect
入栈操作:
先将SP+1,然后将直接给出的地址的内容送入SP所指定的RAM单元;
出栈操作:
先将SP所指定的RAM单元中的内容弹出到直接给出的地址中去;
例:
进入中断服务程序时,把PSW、A、DPTR进行入栈保护。
设当前栈底为(SP)=60H
PUSHPSW;(SP)=61H
PUSHACC;(SP)=62H
PUSHDPL;(SP)=63H
PUSHDPH;(SP)=64H
出栈时,操作如下:
POPDPH
POPDPL
POPACC
POPPSW
例4-9设堆栈栈顶为30H,将A,DPTR的内容压入堆栈,已知A=12H,DPTR=3456H.
MOVSP,#30H
PUSHACC
PUSHDPL
PUSHDPH
执行完指令后,SP=33H,片内RAM的内容:
(31H)=12H,(32H)=56H,(33H)=34H
在上面基础上继续执行指令
POPDPH
POPDPL
POPACC
执行完后SP=30H,A=12H,DPTR=3456H
4.4.2算术运算类指令
MCS-51指令系统具有较强的加、减、乘、除四则运算指令,但只有8位数据运算指令,没有16位数据运算指令。
八种指令助记符:
ADD,ADDC,SUBB,INC,DEC,DA,MUL,DIV.
1.加法类指令
(1)加法指令
ADDA,Rn;(A)←(A)+(Rn)
ADDA,direct;(A)←(A)+(direct)
ADDA,@Ri;(A)←(A)+((Ri))
ADDA,#data;(A)←(A)+#data
上述指令的功能是将累加器A中的内容与源操作数相加,结果存于A中。
当相加结果的第3位和第7位有进位时,分别将AC和CY置1,否则清0。
无符号数相加后,若CY=1,表示溢出;CY=0,表示无溢出。
对于带符号数相加结果的溢出,取决于第7位和第6位。
若第7位有进位而第6位没进位,或第7位没进位而第6位有进位,则OV=1;若第7位和第6位都有进位,或都没进位,则OV=0。
OV=1表示两个正数相加而和变为负数,或两个负数相加而和变为正数的错误结果。
(2)带进位加法指令
ADDCA,Rn
ADDCA,direct
ADDCA,@Ri
ADDCA,#data
累加器A中的内容与源操作数及进位标志位CY相加,结果送A中,此类指令多用于多字节加法运算中。
(3)加1指令
INCA
INCRn
INCdirect
INC@Ri
INCDPTR
操作数制定的单元或寄存器加1.
(4)二-十进制调整指令
DAA
这是一条专用指令,用于对BCD码十进制加法运算的结果进行修正。
MCS-51指令系列系统中没有十进制(BCD)的加法指令,只能借助于二进制加法指令。
然而,二进制数的加法用于十进制加法运算时,有时会产生错误结果。
例如:
1)6+3=92)8+7=153)8+9=17
011010001000
+)0011+)0111+)1001
1001111110001
其中:
1)的运算是正确的,因为9的BCD码就是1001;
2)的运算结果是不正确的,因为BCD码没有1111;
3)的运算结果也是错误的,因为运算结果是11,而不是17。
出错的原因在于,BCD码是4位的二进制编码,而4位二进制编码共有16个编码,但BCD码只用了其中的10个,剩下的6个没有用。
通常把这6个没有用的编码(1010,1011,1100,1101,1110,1111)称为无效码。
在BCD码的加法运算中,凡是结果已进入或跳过无效编码区时,其结果都是错误的。
相加的结果大于9,说明已进入无效编码区;相加的结果有进位,说明已跳过无效编码区。
但不管是哪一种出错情况,相加结果都比正确值小6。
出错是由6个无效编码造成的。
为此,对BCD码运算结果进行“加6”调整,才能得到正确的结果。
“加6”的条件是:
1)(A)3~0>9或(AC)=1;
2)(A)7~4>9或(CY)=1。
十进制调整指令不影响溢出标志。
例4-10设一个加数存于40H和41H单元,另一个加数存于42H和43H单元,和存于40H
和41H单元。
4位BCD码的加法程序如下(假定相加的结果仍为4位BCD码):
MOVR0,#40H;R0指向加数低字节
MOVA,42H
ADDA,@R0
DAA
MOV40H,A
INCR0
MOVA,43H
ADDCA,@R0
DAA
2.减法类指令
(1)带进位减法指令
SUBBA,Rn
SUBBA,direct
SUBBA,@Ri
SUBBA,#data
功能:
将累加器A的内容与第二操作数及进位标志相减,结果送到累加器A中。
(2)减1指令
DECA
DECRn
DECdirecr
DEC@Ri
若A=00H,减一后变为FFH,同时CY=1
3.乘除类指令
(1)乘法指令
MULAB
功能:
完成单字节的乘法,将A中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四章 汇编语言程序设计基础 第四 汇编语言 程序设计 基础