指令是让计算机完成某种操作的命令。指令可用英文单词缩写表示,称为助记符。
指令的格式与寻址方式
指令的格式
任何一种汇编语言的指令语句都是与机器指令一一对应的,汇编程序将指令语句翻译成机器指令代码,然后让机器执行
一般格式为:
标号: 指令助记符 目的操作数 源操作数;注释
寻址方式
基本的寻址方式有6种:立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址以及基地加变址寻址。在MCS-51中还有特有的寻址方式:位寻址
1.立即数寻址 所需数据在指令中直接给出,这种方式叫立即数寻址方式。
例如: MOV DPTR, #16H; DPTR ← 16H
2.直接寻址 在指令中直接给出操作数的地址就叫直接寻址。
例如: MOV A, 30H; A ← (30H)
如果指令中没有指明段,则默认为数据段。
3.寄存器寻址 操作数在寄存器中,这种寻址方式就是寄存器寻址
例如: MOV A, R0; A←R0 将R0寄存器的内容送到累加器A中
4.寄存器间接寻址 指令中将某一个寄存器的内容作为操作数的地址,这种寻找操作数的方式称为寄存器间接寻址
例如: MOV A , @R0; A←(R0)
MOVX 表示与外部RAM传送数据
5.变址寻址 以源变址寄存器或目的变址寄存器的内容为地址偏移量即变址,然后将变址加上基本地址才是最终的操作数地址
6.相对地址 相对地址方式只出现在相对转移指令中。在相对地址转移指令中,采用相对寻址方式,此时指令的操作数部分给出的是地址的相对偏移量。以当前PC值再加上指令中规定的偏移量而构成十级的转移地址。
所在的地址称为源地址,转以后的地址称为目的地址。
7.位寻址
(1)直接采用00H~0FFH范围的某一位的位地址来表示
(2)采用第几单元的第几位方法
(3)对于特殊功能寄存器,可以直接使用寄存器名加位数的表示法。
MCS-51的指令系统
数据传送指令
1.基本传送指令
MOV指令是形式最简单、用得最多的指令,它可以实现CPU内部数据之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的寄存器或者内存单元。
(1)目的操作数不允许为立即数;
(2)除源操作数为立即数的情况外,两个操作数中必有一个是寄存器;
(3)不允许在两个内存单元之间或者两个段寄存器之间直接传送数据;
(4)MOV指令不影响标志寄存器中的标志位。
2.堆栈操作指令
堆栈是以先进后出方式工作的存储区。在程序调用和中断处理过程时,分表要保存返回地址和断点地址;在进入子程序和中断处理后,还需要保留通用寄存器的值;子程序返回和中断处理返回时,则要恢复通用寄存器的值,并分别将返回地址或断点地址恢复到指令指针寄存器中。
PUSH是把字压入栈,POP是把字弹出栈。
SP的内容任何时候都指向当前的栈顶。
3.交换指令
MCS-51系统中,只能和累加器A进行字节交换
XCH A,Rn;
算数运算类指令
1、加法指令
(1)普通加法 ADD 目的操作数 源操作数
(2)带进位的加法 ADDC 目的操作数 源操作数
(3)加一指令 INC 操作数;
2、减法指令
在MCS-51系统中,只有带借位的减法指令,没有不带借位的减法指令
在第一次使用SUBB钱,要首先将CY清零。CLR C
(1)借位减法指令 SUBB 目的操作数 源操作数
(2)减1指令 DEC 操作数
3、乘法指令
(1)MUL 无符号乘法指令
MUL AB
本指令将累加器A和寄存器B中两个8位无符号数相乘,16位积的低8位存于A,高8位存于B中,进位标志总是清零。
4、除法指令
(2)DIB AB
被除数存于A中,除数存于B中,相除之后,商存于累加器A,余数存于累加器B中,清零CY和OV标志(只有除数为0,才会置为OV)
5、十进制调整指令(BCD码调整)
在MCS-51系统中,BCD码加法的调整指令为
DA A
逻辑操作类指令
1.逻辑与
ANL 目的操作数, 源操作数
对目的操作数与源操作数按位与运算
2.逻辑或
ORL 目的操作数, 源操作数
对目的操作数与源操作数按位或
3.逻辑疑惑
XRL 目的操作数,源操作数
4.逻辑求反
CPL A;将A诸位求反
CLR A;将A清零
RL A;各位一次左移,并将最高位移动至最低位
RLC A; 带进位的循环左移
RR A;各位依次右移,并将最低位移动至最高位
RRC A;带进位的循环右移指令
程序控制类指令
1.转移指令
(1)无条件转移指令
LJMP addr16;长转移指令
AJMP addr11;短跳转移指令 先将PC内容加2,PC高5位与11位地址addr11拼装成16位绝对地址。
SJMP rel;短跳转指令。
JMP @A + DPTR;间接跳转指令,
(2)条件转移指令
①累加器判零跳转指令
JZ rel;当A全0,则跳转至PC+2+rel
JNZ rel;当A不是全0,则跳转至PC+2+rel
②比较条件转移指令
CJNE 比较值1,比较值2,跳转偏移量
③减一条件转移指令
DJNZ Rn,rel;
2.调用和返回指令
(1)调用指令
①短调用指令
ACALL addr11
②长调用指令
LCALL addr16
(2)返回指令 RET
布尔位操作指令
MCS-51系统在硬件上有一个布尔处理器。
1、位传送指令
MOV C,bit
MOV bit,C
2、位清零以及位置位指令
CLR bit;清零
SETB bit;置位
3、位运算指令
ANL ORL CPL
4、位控制转移指令
(1)以CY内容为条件的转移指令
JC rel
JNC rel
JB bit,rel
JNB bit,rel
JBC bit,rel ;若bit=1;则跳转,且bit置0,否则执行下一指令
MCS-51的伪指令
由汇编语言编写的源程序要经过汇编程序汇编,生成目标文件即.obj文件,再经过连接,生成可执行文件,即.exe文件才能运行程序。
汇编语言程序的语句除指令以外还有专供汇编的伪指令和宏指令。伪指令不是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,它们可以完成如数据定义、分配存储区、指示程序结束等功能。
(1)ORG(启始汇编)伪指令
用来指定汇编程序对源程序开始进行汇编
(2)END(结束汇编)伪指令
常用语汇编语言程序末尾,用来指示源程序到此全部结束
(3)EQU(赋值)伪指令
用于给它左边的“字符名称”赋值。
(4)DATA(数据地址赋值)伪指令
DATA伪指令称为数据地址赋值伪指令,也用来给它左侧“字符名称”赋值。
(5)DB伪指令
定义字节伪指令,可以用来为汇编程序在内存的某个区域中定义一个或者一串字节。
(6)DW伪指令
定义字伪指令,用来为汇编程序在内存的某个区域中定义一个或者一串字。
DW的作用于DB基本相同,不同之处是DW的表达式计算出的是16位字长的值,低8位存储在标号只是的单元地址中,高8位存储在标号加一的地址单元中。
(7)DS伪指令
称为定义存储空间伪指令
可以指示汇编程序从它的标号地址开始预留一定数量的内存单元,以备源程序执行过程中使用。
(8)BIT伪指令
BIT(位地址赋值)伪指令称为位地址赋值伪指令,用于给以符号形式的位地址赋值
汇编语言程序设计步骤与结构
汇编语言程序设计要经历建立模型、确定算法、编制流程、分配内存、编写程序、上机调试。
程序的基本结构有三种:顺序、分支、循环
子程序与运算程序设计
1.子程序设计需要注意的问题
(1)子程序要利用过程定义伪指令声明,获得子程序名和调用属性。
(2)子程序最后利用RET指令返回主程序,主程序执行CALL指令调用子程序
(3)子程序中对堆栈的压入和弹出操作要成对使用,保持堆栈平衡
主程序CALL指令将返回地址压入堆栈,子程序RET指令将返回地址弹出堆栈。
(4)子程序开始应该保护用到的寄存器内容,子程序返回前进行相应恢复。
(5)子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置,也可以放在主程序开始执行之前的位置。
(6)子程序允许嵌套和递归
(7)子程序可以与主程序共用一个数据段,也可以使用不同的数据段
(8)子程序的编写可以很灵活,例如具有多个出口和入口,但一定要保证堆栈操作的正确性
(9)处理好子程序与主程序间的参数传递问题。
(10)提供必要的子程序说明信息
2.子程序参数的传递方法
(1)采用寄存器传递参数
(2)利用寄存器传送子程序参数的地址
(3)利用堆栈传送子程序参数
(4)利用位地址传送子程序参数
我们可以将子程序单独编写成一个源程序文件,经过汇编之后形成目标模块OBJ文件,这就是子程序模块。子程序模块让库管理程序LIB.EXE统一管理,作为库中的一部分,就形成了子程序库。
(1)子程序文件中的子程序名、定义的共享变量名要声明以便为其他程序使用。
(2)子程序必须在代码段中,但没有主程序那样的开始执行和结束执行点
(3)如果采用简化段源程序格式,子程序文件的存储模式要与主程序文件保持一致。
(4)子程序与主程序之间的参数传递仍然是一个难点。
宏汇编
宏是具有宏名的一段汇编语言序列。
与伪指令主要指示如何汇编不同,宏指令实际上是一段代码序列的缩写,在汇编时,汇编程序用对应的代码序列代替宏指令。
宏定义
宏名 MACRO[形参表]
...
ENDM
宏调用
宏定义之后就可以使用它
宏名[实参表]
宏像子程序一样可以简化源程序的书写,但是他们有本质区别:
宏调用在汇编时将相应的宏定义语句复制到宏指令的位置,执行时不存在控制的转移与返回
子程序调用在执行时由主程序的调用CALL指令实现,控制转移到子程序,子程序需要执行返回RET指令将控制再转移到主程序。
局部标号
当宏定义具有分支、循环等程序结构时,需要标号。宏定义体重的标号必须用LOCAL伪指令声明为局部标号,否则多次宏调用将出现标号的重复定义语法错误。
LOCAL 标号列表
宏定义中可以有宏调用,只要遵循先定义后调用的原则即可;宏定义中还可以具有子程序调用;子程序中也可以进行宏调用,只要实现有宏定义即可。
文件包含
运用伪指令INCLUDE将多个源程序合为一体。
利用INCLUDE伪指令包含其他文件,其实质仍然是一个源程序,只不过是分成了几个文件书写;被包含的文件不能独立汇编,而是依附主程序而存在的。所以,合并的源程序之间的各种标识符应该统一规定,不能发生冲突。