C51单片机汇编语言程序设计Word文档下载推荐.docx
《C51单片机汇编语言程序设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C51单片机汇编语言程序设计Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
D
0110
6
1110
E
0111
7
1111
F
3、二进制数转换为十六进制数
转换方法为:
从右向左每4位二进制数转化为1位十六进制数,不足4位部分用0补齐。
例:
将(1010000110110001111)2转化为十六进制数
解:
把1010000110110001111从右向左每4位分为1组,再写出对应的十六进制数即可。
01010000110110001111
50D8F
答案:
(1010000110110001111)2=(50D8F)16
将1001101B转化为十六进制数
把10011110B从右向左每4位分为1组,再写出对应的十六进制数即可。
10011110
9E
10011110B=9EH
4、十六进制数转换为二进制数
将每1位十六进制数转换为4位二进制数。
将(8A)16转化为二进制数
将每位十六进制数写成4位二进制数即可。
8A
10001010
(8A)16=(10001010)2
将6BH转化为二进制数
6B
01101011
6BH=01101011B
二、计算机中常用的基本术语
1、位(bit)
计算机中最小的数据单位。
由于计算机采用二进制数,所以1位二进制数称作1bit,例如110110B为6bit。
2、字节(Byte,简写为B)
8位的二进制数称为一个字节,1B=8bit
3、字(Word)和字长
两个字节构成一个字,2B=1Word。
字长是指单片机一次能处理的二进制数的位数。
如AT89S51是8位机,就是指它的字长是8位,每次参与运算的二进制数的位数为8位。
8位可以表示256个状态,每位二进制有0和1两种状态,8位就是2的8次方个状态。
这256个状态可以表示0~255这256个无符号整数,也可以表示-128到+127这256个有符号整数,还可以表示小数等,这些表示方法叫做数据类型。
8位机能表达数的范围是0~255,这意味着参与运算的各个数据不能超过255,并且运算结果和中间结果也不能超过255,否则就会出错。
在实际问题中往往有超过255的情况,比如用到1000这个数,这时就需要用两个字节组合起来表示这样的数。
16位机能表达数的范围是0~65535。
三、寄储器
51单片机的寄存器分为工作寄存器和特殊功能寄存器两大类。
工作寄存器在内部RAM的00H~1FH地址区,共有32个。
特殊功能寄存器在内部RAM的80H~0FFH地址区,51单片机共有21个,52单片机共有26个。
特殊功能寄存器主要有累加器A,寄存器B,程序状态字PSW,P0~P3I/O口寄存器,定时/计数器及串行通信控制、中断控制等特殊功能寄存器。
1、工作寄存器(R0~R7)
工作寄存器是一个8位寄存器,分为4组(0~3组),每组8个,共有32个,每组的8个寄存器都用R0~R7表示。
工作寄存器是以组为单位来使用的,任何时刻只有一组有效。
可用PSW寄存器中的RS0、RS1两位来设置当前要使用的工作寄存器组。
2、累加器A
累加器A是一个8位寄存器,它和算术逻辑部件ALU一起完成各种算术逻辑运算,既可以存放运算前的原始数据,又可以存放运算的结果。
3、寄存器B
寄存器B是一个8位寄存器,用于乘除法运算。
4、程序状态字(PSW)寄存器
程序状态字PSW(也称为标志寄存器)是一个重要的8位寄存器,用来保存指令执行结果供程序查询和判别。
四、寻址方式
单片机工作时,在程序指令的控制下,要对数据进行各种操作,所以必须要先找到操作的数据。
数据存放在存储器中,只有找到要操作数据的存储地址,才能对该存储地址中的数据进行操作。
寻找要操作数据的存储地址的过程称为寻址。
单片机常用寻址的方式有七种:
立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。
1、立即寻址
立即寻址是在指令的操作码后直接给出要操作的数据(不是数据的存放地址),这个数据称为立即数,为了表明该数值是一个数据而不是地址,要在该数值前加个“#”号。
例如:
MOVA,#0FFH;
将数据0FFH(11111111B)送到累加器A中。
MOVA,#6BH;
将数据6BH(01101011B)送到累加器A中。
2、直接寻址
直接寻址是在指令的操作码后给出数据的存放地址,指令可以操作该地址存放的数据。
MOVA,58H
该指令的含义是:
将58H单元中的数据送到累加器A中。
如果58H单元中的数据为11010101,执行该指令后,58H单元中的数据会送到累加器A中,累加器A中的数据也为11010101,累加器A中之前存放的数据被冲掉。
直接寻址方式可以访问存储器的30H~7FH单元(数据缓冲区)、位地址单元和特殊功能寄存器(SFR),而且特殊功能寄存器只能用直接寻址方式访问。
3、寄存器寻址
寄存器寻址是在指令的操作码后给出寄存器,指令可以操作寄存器中的数据。
MOVA,R7
将寄存器R7中的数据送到累加器A中。
如果寄存器R7中的数据为11010101,执行该指令后,R7中的数据会送到累加器A中,累加器A中的数据也为11010101,累加器A中之前存放的数据被冲掉。
五、汇编语言的指令系统
汇编语言的指令格式如下:
[标号:
]操作码(空格)[操作数1][,操作数2][,操作数3][;
注释]
下面是一条汇编语言的指令:
MAIN:
MOVP3,#0FFH;
将数据11111111送到P3口
标号:
用来标注指令的地址,一般由1~8个字母和数字组合而成,但必须以字母开头,以冒号“:
”结束。
上面的汇编语言指令中,标号是“MAIN:
”。
操作码:
用来规定指令的操作功能,一般由2~5个字母(英文单词或单词的缩写)组成。
上面的汇编语言指令中,操作码是“MOV”。
操作数:
它是操作码的操作对象,操作数和操作码之间用一个空格隔开。
在一条指令中可以有0~3个操作数,操作数之间用逗号“,”隔开。
上面的汇编语言指令中,操作数是“P3,#0FFH”。
注释:
它是编程者对指令的说明,通常用来描述程序的功能。
注释以分号“;
”开头。
注意:
编写汇编语言的指令时,指令中的“:
”、“,”、“;
”等为半角符号,应将输入法设为英文状态。
MCS-51系列单片机的指令共有111条,根据功能可将其分为以下几类:
数据传送类指令(29条)、算术运算类指令(24条)、逻辑运算类指令(24条)、控制转移类指令(17条)、位操作类指令(17条)。
根据指令转化为机器代码占用的存储空间可分为:
单字节指令(49条)、双字节指令(45条)、三字节指令(17条)。
根据指令执行需要的时间可分为:
单周期机器指令(64条)、双周期机器指令(45条)、四周期机器指令(2条)。
六、数据传送类指令(29条)
数据传送类指令的功能是将源操作数中的内容送到目的操作数中。
它可以分为五种:
内部RAM的数据传送指令、外部RAM与累加器A的数据传送指令、ROM与累加器A的数据传送指令、数据交换指令和堆栈操作指令。
1、内部RAM的数据传送指令(16条)
内部RAM数据传送指令的操作码助记符是“MOV”
指令格式:
MOV目的操作数,源操作数
指令的功能是:
将源操作数中的内容送到目的操作数中。
执行指令后,源操作数内容不变,目的操作数的内容与源操作数一致。
内部RAM的数据传送指令又可分为五种:
(1)以累加器A为目的操作数的传送指令
以累加器A为目的操作数的传送指令有4条,各条指令的格式和功能如下:
以累加器A为目的操作数的传送指令
指令格式
指令功能表示
指令功能说明
指令功能举例说明
MOVA,#data
(A)←data
将数据data送到累加器A中
MOVA,#36H
指令功能:
将数据36H送到累加器A中,指令执行后,A中的数据为36H。
MOVA,Rn
(A)←(Rn)
将寄存器Rn中的数据送到累加器A中
MOVA,R6
将寄存器R6中的数据送到累加器A中,如果R6中的数据为2EH,指令执行后,A中的数据为2EH。
其中,#data表示8位数据(立即数),Rn表示工作寄存器组中的8个寄存器R0~R7。
(2)以寄存器Rn为目的操作数的传送指令
以寄存器Rn为目的操作数的传送指令有3条,各条指令的格式和功能如下:
以寄存器Rn为目的操作数的传送指令
MOVRn,#data
(Rn)←data
将数据data送到寄存器Rn中
MOVR5,#36H
将数据36H送到寄存器R5中,指令执行后,R5中的数据为36H。
MOVRn,A
将累加器A中的数据送到寄存器Rn中
MOVR6,A
将累加器A中的数据送到寄存器R6中,如果A中的数据为2EH,指令执行后,R6中的数据为2EH。
七、位操作类指令(17条)
位操作类指令的功能是对单片机内部存储器的位单元进行操作,位操作类指令有数据位传送指令、位变量修改指令、位变量逻辑指令和位控制转移指叙。
1、位变量修改指令(6条)
位变量修改指令有6条,它们分别为清0、取反和置1。
各条指令的格式和功能如下:
位变量修改指令
清0指令
CLRbit
(bit)←(0)
将某位单元中的数据清0
置1指令
SETBbit
(bit)←1
将某位单元中的数据置1
八、逻辑运算类指令(24条)
逻辑运算类指令的功能是进行与、或、非、异或逻辑运算和对数据进行清0、移位。
它包括逻辑与、逻辑或、逻辑非、逻辑异或、清0、和移位指令。
1、清0指令
清0指令的格式和功能如下:
CLRA
(A)←(0)
将累加器A中的内容清0。
2、移位指令(4条)
移位指令又分不带进位的左环移指令、带进位的左环移指令、不带进位的右环移指令和带进位的右环移指令。
移位指令
指令格式
RLA
将累加器A中的各位数据共同左移一位,(即A0位数据移至A1位,A1位数据移至A2位,以此类推),A7位数据环移至A0位。
RRA
将累加器A中的各位数据共同右移一位,(即A7位数据移至A6位,A6位数据移至A5位,以此类推),A0位数据环移至A7位。
九、程序控制类指令(17条)
程序控制类指令具体分为无条件控制转移指令、有条件控制转移指令和子程序调用及返回指令。
1、无条件控制转移指令(4条)
无条件控制转移指令在使用时无须规定程序转移的条件,它分为短转移指令、长转移指令、相对转移指令和散转指令。
(1)长转移指令
长转移指令比短转移指令的跳转范围更大,指令的格式和功能如下:
长转移指令
LJMPaddr16
(PC)←addr16
将16位的地址送给PC,PC则指向该地址,并执行该地址处的指令。
2、有条件控制转移指令(4条)
有条件控制转移指令在某种条件满足时执行转移,不满足则不执行转移。
它包括累加器判0转移、位控制转移指令、比较不相等转移指令和减1不为0转移指令。
(1)减1不为0转移指令
减1不为0转移指令有2条,各条指令的格式和功能如下:
减1不为0转移指令
DJNZRn,rel
双周期机器指令
(Rn)←(Rn)-1
若(Rn)≠0
则(PC)←(PC)+2+rel
若(Rn)=0
则(PC)←(PC)+2
将寄存器Rn中的数据减1,若Rn中的数据(已被减1)不等于0,则转移执行地址标号rel处的指令。
若Rn中的数据等于0,则执行当前指令的下一条指令。
2、子程序调用和返回指令(4条)
(1)子程序调用指令
子程序调用指令有2条,长调用指令和短调用指令(绝对调用指令)。
子程序调用指令
LCALLaddr16
长调用指令
(PC)←(PC)+3
(SP)←(SP)+1
((SP))←(PC7~0)
((SP))←(PC15~8)
先将程序计数器PC中的值加3,得到下一条指令的地址(也就是断点地址)。
然后将堆栈寄存器SP中的值加1,得到一个8位地址,再将PC中的低8位数保存在SP中的地址所指的单元中。
接着将SP中的值再加1,得到下一个8位地址,再将PC中的高8位数保存在SP中的地址所指的单元中。
最后将addr16地址送给PC,PC就指向addr16地址,并执行该地址处的子程序。
该指令可调用64KB(216)范围内的子程序。
ACALLaddr11
短调用指令
(PC)←(PC)+2
(PC10~0)←addr10~0
上面两条指令都是在主程序中调用子程序,两者有一定的区别。
最大区别是调用范围的大小。
初学时可以不加以区分,一般来说,除非程序空间非常紧张,否则都是首选LCALL。
ACALL是在调用点为中心的2K范围内,因为它的参数是11位的,LCALL是整个64K范围内调用,因为它的参数是16位的。
ACALL相对比较节约程序空间,因为机器码是2个字节(命令加参数),而LCALL移植方便,但机器码是3个字节。
(2)返回指令
返回指令有2条,子程序返回指令和中断返回指令。
返回指令
RET
子程序返回指令
(PC15~8)←((SP))
(SP)←(SP)-1
(PC7~0)←((SP))
RET指令放在子程序的末尾,它使子程序在功能完成后返回子程序调用指令的下一条指令继续执行。
十、伪指令(8条)
汇编时,汇编程序会将源程序中的指令转换成相应的机器指令。
有时需要汇编程序对源程序进行一些处理,这时可在源程序中加入一些特殊的指令。
这些指令用于告诉汇编程序如何处理源程序,它既不控制机器的操作,也不转换成机器指令,这些指令就被称为伪指令。
1、汇编起始指令
汇编起始指令的格式和功能如下:
汇编起始指令
ORGaddr16
该指令用于指示下一条指令在程序存储器中的起始地址。
2、汇编结束指令
汇编结束指令
END
该指令用于结束汇编程序。