指令是计算机计算CPU根据人的意图来执行某种操作的命令。一台计算机所执行的全部指令的集合,称为这个CPU的指令系统。而想要使计算机按照人们的要求完成一项工作,就必须让CPU按顺序执行预设的操作,即逐条执行人们编写的指令。这种按照人民要求所编排的序列,称为程序。编写程序的过程叫做程序设计。程序时机语言就是编写程序的一整套规则和方法,是实现人机交互的工具,分为机器语言、汇编语言和高级语言。我们本篇要了解的就是汇编语言。
汇编语言是用助记符、符号和数字等来表示指令的程序语言,相对于机器语言来说,汇编语言容易理解和记忆。接下来让我们一起来学习一下汇编语言格式的基础知识吧。
汇编语言格式
MCS-51汇编语言指令由4部分组成,其一般格式如下:
[标号:] 操作码 [操作数] [;注释]
格式中的方括号表示可以没有相应部分,可见,可以没有标号、操作数和注释,但至少要有操作码。
其操作数最多可以是3项:
[操作数1] [,操作数2] [,操作数3]
操作数1常称为目的操作数,操作数2称为源操作数,操作数3多为跳转的目标。
例如:START : MOV A,#23 ;23H→A
这里“START”为标号,“MOV”是操作码,“A,#23H”是操作数,“23H→A”为注释。
标号是相应指令的标记,便于查找,用于程序入口、循环等。
操作码规定了指令所要执行的操作,由2~5个英文字母表示。例如:MOX,ADD,RRC,JZ等。
操作数指出参与操作的数据来源、操作结果存放的地方以及跳转的目标位置。(操作数可以是一个数(立即数),也可以是数据所在的空间地址,即在执行指令时从指定的空间地址读取或写入数据)
注释主要使程序容易阅读。
上面一堆话看着头大:总结一下就是汇编指令由四个部分:标号、操作码、操作数和注释;操作数是必有的;一般都是操作码和操作数(有时候还会有注释)(例如:MOV A)
操作码和操作数都有对应的二进制代码,指令代码由若干字节组成;根据字节数不同分为:
单字节指令、双字节指令、三字节指令。
1.单字节指令
(1)指令码中隐含着对某个寄存器的操作
例如:"INC A","MUL AB"等指令,只需要一个8个二进制代码就能表示出执行什么操作、操作数是哪个。
比如数据指针增加1指令“INC DPTR”,其二进制指令代码是A3H,格式如下:
1 0 1 0 0 0 1 1
(2) 由指令码中的 r r r 或 i 指定操作数。
如累加器A向工作寄存器传送数据指令“MOV Rn,A”,其指令格式为:
1 1 1 1 1 r r r
2.双字节指令
用1B表示操作码,另1B表示操作数或操作数所在的地址。
其指令格式:
操作码 立即数或地址
MSC-51共有45条双字节指令。
3.三字节指令
用1B表示操作码,另外2B表示操作数或操作数所在的地址。
其指令格式:
操作码 立即数或地址 立即数或地址
上面部分不是很理解的同学不用着急,可以再看一遍熟悉一下,后面多看一些指令会帮助理解一些。接下来我们讲一下寻址方式。
寻址方式
所谓寻址方式,是值CPU寻找参与运算的操作数的方式,或者寻找数据保存位置的方式。这一部分非常重要,大家要认真学习哦。里面的举例如果看不懂的同学先不急,后面会讲到指令系统分类,可以先大致了解一下了之后看最后一部分,然后再回来看这部分的例子哦。
立即寻址
立即寻址也称立即数,它是在指令操作数中直接给出参加运算的操作数,其指令格式如
下:
如: MOV A , #70H ;
这条指令的功能是将立即数70H传送到累加器A中。
直接寻址
在直接寻址方式中,指令操作数域给出的是参加运算操作数地址。直接寻址方式只能用来表示特殊功能寄存器、内部数据寄存器和位地址空间。其中特殊功能寄存器和位地址空间只能用直接寻址方式访问。
如: ANL 70H , #48H
表示70H单元中的数与立即数48H相“与”,结果存放在70H单元中。其中70H为直接地
址,表示内部数据存储器RAM中的一个单元。
间接寻址
间接寻址采用R0或R1前添加“@”符号来表示。
例如,假设R1中的数据是40H,内部数据存储器40H单元所包含的数据为55H,那么如下指令:
MOV A, @R1
把数据55H传送到累加器。
寄存器寻址
寄存器寻址是对选定的工作寄存器R7~RO、累加器A、通用寄存器B、地址寄存器和进位C中的数进行操作。其中寄存器R7~RO由指令码的低3位表示,ACC、B、DPTR及进位位C隐含在指令码中。因此,寄存器寻址也包含一种隐含寻址方式。
寄存器工作区的选择由程序状态字寄存器PSW中的RS1、RSO来决定。指令操作数指定的寄存器均指当前工作区中的寄存器。
如: INC R0 ;(R0)+1→>R0
表1 低3位操作码与寄存器Rn的关系
低3位r r r | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
寄存器Rn | R0 | R1 | R2 | R3 | R4 | R5 | R6 | R7 |
指令寻址
绝对寻址
绝对寻址是在指令的操作数中,直接提供目标位置的地址或地址的一部分。
例如:LJMP SER_INT_T1 ;无条件跳转到T1中断服务程序SER_INT_T1
相对寻址
相对寻址是将程序计数器PC中的当前值与指令第二字节给出的数相加,其结果作为转移指令的转移地址。转移地址也称为转移目的地址,PC中的当前值称为基地址,指令第二字节给出的数称为偏移量。由于目的地址是相对于PC中的基地址而言,所以这种寻址方式称为相对寻址。偏移量为带符号的数,所能表示的范围为+127 ~-128。这种寻址方式主要用于转移指令。
如: JC 80H ;C=1 跳转
表示若进位位C为0,则程序计数器PC中的内容不改变,即不转移。若进位位C为1,则以PC
中的当前值为基地址,加上偏移量80H后所得到的结果作为该转移指令的目的地址。
变址寻址
在变址寻址方式中,指令操作数指定一个存放变址基值的变址寄存器。变址寻址时,偏移量与变址基值相加,其结果作为操作数的地址。变址寄存器有程序计数器PC和地址寄存器DPTR
如: MOVC A, @A+DPTR
表示累加器A为偏移量寄存器,其内容与地址寄存器DPTR中的内容相加,其结果作为操作数的地址,取出该单元中的数送入累加器A。
位寻址
位寻址是指对一些内部数据存储器RAM和特殊功能寄存器进行位操作时的寻址。在进行位操作时,借助于进位位C作为位操作累加器,指令操作数直接给出该位的地址,然后根据操作码的性质对该位进行位操作。位地址与字节直接寻址中的字节地址形式完全一样,主要由操作码加以区分,使用时应注意。
如: MOV C, 20H ; 片内位单元位操作型指令
以上是7种寻址方式
总结一下:
寻址方式 | 操作数寻址空间及范围 | 示例指令 |
立即数寻址 | 在程序存储空间,随指令读出 | MOV A,#46H |
直接寻址 | 片内RAM种,低128B和SFR | MOV A,46H |
间接寻址 | 片内RAM:使用@Ri、SP; 范围为256B,不含SFR 片外RAM:使用@Ri、@DPTR; 范围为64KB | MOV A,@R0 MOVX @DPTR,A |
寄存器寻址 | 使用R0~R7、A、B、C、DPTR | MOV A ,R2 |
相对寻址 | 操作数是相对地址;在程序存储空间;范围-128~127 | STMP LOOP |
绝对寻址 | 操作数是目标地址;在程序存储空间;范围为64KB全空间 | LJMP SECON |
变址寻址 | 使用@A+PC、@A+DPTR;在程序存储器中; 范围分别在PC之后256B之内和64KB全空间 | MOVC A,@A+DPTR MOVC A,@A+PC |
位寻址 | 使用位地址;在位寻址空间;范围-128~127 | SJMP LOOP |
指令中常用符号注释
Rn:n=0~7,工作寄存器R0~R7。
Ri:i=0、1。可作为地址指针的R0和R1。
#data:8位立即数
#data16:16为立即数
direct:8位片内RAM单元地址
addr16:程序存储空间的16位目的地址,用于LCALL和LJMP指令中
rel:补码形式的8位地址偏移量。
bit:片内RAM或SFR中的直接寻址位地址。
@:间接寻址方式的前缀符号。
(×):表示×中的内容。(地址)
((×)):表示由×中指向的地址单元的内容。(数据)
^:逻辑与
(与逻辑与的形状一样,开口方向相反(键盘没找到那个符号)):逻辑或
→:指令操作流程,将内容送到箭头指向的地方
指令系统分类
数据传送类指令
算术运算指令
逻辑操作类指令
控制转移类指令
布尔变量操作类指令
欢迎大家指出问题!