【第二章】指令系统

【 1. 51指令基本 】

计算机通过执行程序完成人们指定的任务,程序由一条一条指令构成,能为CPU识别并执行的 指令的集合 就是该CPU的指令系统。

  • 51系列单片机汇编语言指令格式:
    操作符 目的操作数 ,源操作数 ;注释
    操作符 指明该指令对操作数完成什么操作;
    操作数 指明该指令的操作对象;
    目的操作数源操作数 完成操作符规定的操作后,结果存放在目的操作数中;
    注释可有可无,用“;”与指令隔开,用于解释指令功能,增加程序可读性。
  • Rn
    RAM中的4组通用寄存器中的其中一组
  • Ri
    i=0或1,代表R0和R1寄存器中其中一个。可用于寄存器间接寻址的寄存器(即由寄存器中的内容为地址,以地址中的内容为操作数)。
  • dir
    8位直接字节地址(片内RAM和SFR)。
  • #data
    8位立即数,即8位常数。可以是2进制、10进制、16进制、字符。
  • #data16
    16位立即数,即16位常数,取值范围是#0000H~#0FFFFH。
  • addr16
    16位地址。
  • rel
    相对偏移量(是一个字节的补码),用于相对转移指令。
  • bit
    位地址,在位地址空间中。
  • $
    表示当前指令的地址。
  • ()
    在注释中表示括号中的地址单元存储的内容。

【 1. 寻址方式 】

  • 指令中提供(寻找)操作数所在地址或者操作数本身 的方式称为寻址方式
  • 一条指令有两个操作数,所以它可以有两个不同的或者相同的寻址方式。
  • 每条指令都是以二进制代码的形式(称为机器码)存放在单元中。

1. 立即寻址

  • 直接给出操作数的寻址方式称为立即寻址。
  • 立即寻址中的操作数称为立即数,前面有“#”。

在这里插入图片描述

2. 直接寻址

  • 直接给出操作数所在的地址(dir)的寻址方式称为 直接寻址
  • 分类:
    ❶ RAM中,以直接地址表示;
    ❷ SFR中,以特殊功能寄存器的名称表示;
  • A作直接寻址时记作ACC。
  • B仅在乘除法指令中为寄存器寻址,在其他指令中为直接寻址

在这里插入图片描述

3. 寄存器寻址

  • 以寄存器的内容作为操作数的寻址方式称为 寄存器寻址
  • 寻址对象:A,B,DPTR,R0~R7
  • B仅在乘除法指令中为寄存器寻址,在其他指令中为直接寻址
  • A可做寄存器寻址、直接寻址(此时写作ACC)。

在这里插入图片描述
在这里插入图片描述

4. 寄存器间接寻址(寄存器间址)

  • 以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式称为寄存器间接寻址
  • 使用寄存器间接寻址的寄存器,必须先把操作数的地址赋值给它。
  • 可间接寻址的寄存器:R0,R1,DPTR。用时在寄存器前面加@,如@R0。

在这里插入图片描述

5. 变址寻址

  • 由寄存器 DPTR 或 PC 中的内容加上 A 累加器内容之和,作为操作数地址的寻址方式称为 变址寻址

在这里插入图片描述

6. 相对寻址

  • 以当前程序计数器PC的内容为基值,加上指令给出的一字节补码数(偏移量)形成新的PC值的寻址方式称为相对寻址
  • 故相对寻址只用于修改 PC 的值,主要用于程序的分支转移。

在这里插入图片描述

7. 位寻址、字节寻址

  • 对位地址中的内容作位操作的寻址方式称为位寻址
  • 对某一字节的地址作操作的的寻址方式称为字节寻址
  • 由于单片机中只有内部RAM和SFR的部分单元有位地址,故位地址只能对有位地址的这两个空间进行寻址操作。
  • 对于到底是位寻址还是字节寻址,根据两操作数类型一致的原则,由另一个操作数的位数决定。

在这里插入图片描述

【 2. 数据传送与交换指令 】

  • 计算机中的传送指令实际上是将源操作数的内容拷贝到目的操作数。因此,源操作数的内容不变,而目的操作数原来的内容会被新拷贝的内容代替。可以把数据传送指令理解为覆盖写指令。
  • 数据传送与交换指令类指令包括数据传送、数据交换、栈操作等指令。

1. 传送类指令

① 内部 RAM 和 SFR 间的传送 MOV 指令

  • 通用寄存器 R 之间不能相互传送。
  • 立即数 #data 仅仅只能作为源操作数传递给目的操作数。
  • 对 DPTR 的16位数据传送指令:MOV DPTR ,#data16
  • 进行传送指令时,注意看被传送的数据大小是否超过了要存放空间的大小。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

② 外部存储器和累加器 A 之间的传递 MOVC、MOVX指令

  1. MOVX
  • 以 Ri (i=0、1)为寄存器间接寻址时,外部数据存储器 RAM 的低8位地址在 Ri 中,高8位地址由 P2 口指示。
  • 片外数据存储器不能直接寻址。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. MOVC
  • 内部、外部程序存储器均适用 MOVC 指令。
  • 只能用变址寻址的方式从程序存储器读取数据到累加器 A。
  • 查表指令,多用于查常数表程序,直接求取常数表中的函数值。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

③ 堆栈操作指令

  • 堆栈 是用于保存暂时需要保留的信息的一片存储区(相当于贮藏室)。
  • 这片存储区的地址必须由寄存器 SP 指示。
  • 8XX51单片机的堆栈设在内部 RAM 区,因此深度不大于128字节(因为51的内部RAM也就128字节)。
  • 保存信息称为入栈,取出信息称为出栈
  • 指令 PUSH/POP dir;
  • 8XX51单片机的堆栈操作特点是:“入假鸭,出弹减”
    ★ 初始化时SP指向07H。若不重置,数据从08H单元开始压入,执行一次指令,只压入 1 个字节。
    ★ 入栈出栈操作实际上是数据的传送,只不过每执行一次指令,SP指示的地址会自动 加1 或 减1。入栈时,SP 先加 1,再将数据压入;出栈时,数据先弹出,SP 再减 1。
    ★ 若要回恢复堆栈保留的信息,应遵循后进先出的原则,否则将不能还原原来的信息。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 交换指令

  • 实现内部RAM区数据的双向传送。
  • 字节交换指令
    XCH A,Rn/@Ri/dir;
  • 低半字节交换指令
    XCHD A,@Ri;
  • A的高、低半字节交换指令
    SWAP A;

在这里插入图片描述
在这里插入图片描述

【 3. 算术运算和逻辑运算指令 】

  • 算术运算是加、减、乘、除运算,包括有进、借位和没有进、借位的加、减指令。
  • 逻辑运算是按位进行的与(逻辑乘)、或(逻辑加)、非(取反)、异或等运算。操作数还是那几种形式,

1. 以A为目的的操作数的算术运算和逻辑运算指令

  • ADDC进位加:两数相加后还需加进位位(CY);
  • SUBB借位减:两数相减后还需减去进位位(CY),
  • 减指令没有不带借位的指令,所以在多字节减法程序中,最低位字节作减法时,注意要先清CY。
  • 逻辑运算指令常用于对数据位进行加工。
  • 两数逻辑运算法则是:
    与:有 0 则 0 ;
    或:有 1 则 1
    异或:同为 0 ,异为 1 ,与 0 异或值不变,与 1 异或值变反
  • 加减运算指令影响标志位CY、OV、AC
  • 逻辑运算是按位进行的,因此不影响CY、OV、AC标志位。
  • 凡是指令执行结果在A累加器中,运行结果 1 的奇、偶性反映在P标志位(包括前面的传送指令和后面的移位指令)。
  • 常见指令:
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 以 dir 为目的操作数的逻辑运算指令

  • 可选源操作数:A。#data
  • 可选操作指令:ANL,ORL,XRL

在这里插入图片描述

3. 加1、减1指令

  • 不影响CY、OV、AC标志位。
  • 加1:INC
  • 减1:DEC

在这里插入图片描述

4. 十进制调整指令

  • 计算机完成二进制加法其和也为二进制,如果是十进制相加(即BCD码相加)想得到十进制的结果,就必须进行十进制调整(即BCD码调整)
    调整指令: DA A。将A中二进制 相加和 调整成BCD码
    调整方法:
    和的低4位大于9或有半进位,则低4位加6;;
    和的高4位大于9或有进位,则高4位加6。
    指令根据相加和及标志自行进行判断,因此该指令应紧跟在加指令之后,至少在加指令和该指令之间不能有影响标志的指令。
  • DA A指令只对一个字节和调整,如为多字节相加必须进行多次调整。此指令不能对减法结果进行调整。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 专对 A 的指令

  • 对 A 取反 CPL A;
  • 对 A 清零:CLR A;
  • 对 A 向右循环移位(不包括CY):RR A;
  • 对 A 向左循环移位(不包括CY):RL A;
  • 对 A 向右循环移位(包括CY,CY在右边):RR A;
  • 对 A 向左循环移位(包括CY,CY在左边):RL A;

在这里插入图片描述
在这里插入图片描述

6. 乘、除法指令

  • 乘法指令:MUL AB,AxB 当乘积结果大于255,溢出标志位OV=1。
  • 除法指令:DIV AB,A÷B 商在A中,余数在B中。若除数B=00H,则该指令执行后,溢出标志位OV=1,且A、B中内容不变。

在这里插入图片描述

7. 指令综合应用举例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【 4. 控制转移指令 】

  • 这一类指令的功能是改变指令的执行顺序,转到指令指示的新的PC地址执行。
  • MCS-51单片机的控制转移指令有以下类型:
    子程序调用:
    长调用( 64KB地址范围)、短调用( 2KB地址范围)
    无条件转移: 无需判断,执行该指令就转移到目的地址。
    条件转移: 需判断标志位是否满足条件,满足条件转移到目的地址,否则顺序执行。
    绝对转移: 转移的目的地址用绝对地址指示,通常为无条件转移。
    相对转移: 转移的目的地址用相对于当前PC的偏差(偏移量)指示,通常为条件转移。
  • 绝对转移转移的目的地址用绝对地址指示、8XX51单片机程序存储器最大为64K,因此绝对转移转移的转移范围为64K.
  • 相对转移是偏移量指示,可以往前转(小地址方向),偏移量为负,也可以往后转(地址增大方向),偏移量为正,所以偏移量是个有符号数,8位有符号数的补码范围+127 ~ -128,这就决定了相对转移的转移范围不能超过+127~-128。
  • 上面转移指令类型虽然多,但功能相同:转移到新地址执行。差别仅在于有条件还是无条件及目的地址在指令机器码中的表现形式。实际在编写源程序时,并不知道具体地址,所以转移的目的地址均是以符号地址表示,具体的目的地址的地址值,编译系统在把程序翻译成机器码时由编译系统自行填入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 调用程序指令、返回指令

① 长调用

  • 指令:LCALL addrl16 :addr16 → 程序计数器PC的位0~位15
  • 指令功能:
    保护断点,将当前PC(本指令的下一条指令的首选地址)压入堆栈。
    子程序的入口地址addr16 送PC,转子程序执行。
  • 本指令为 64KB 地址范围内的调子程序指令,子程序可在64KB地址空间的任一处。
  • 本指令的机器码为三字节 12 addr16。addr16 是转移的目标地址。

在这里插入图片描述

② 短调用

  • 指令:ACALL addr11;addr11→ 程序计数器PC的位0~位10
  • 指令功能:
    ①保护断点,将当前PC(本指令的下一条指令的首选地址)压入堆栈。
    ②addrl1-→PC0~ 10,而PC11~ 15保持原值不变。
  • 本指令为2KB地址范围的调子程序指令,子程序入口距当前PC不得超过2KB地址范围。
  • 本指令的机器码为二字节,设addr11的各位是a10a9a8…a2a1a0,则ACALL指令机器码a10a9a810001 a7a6a5a4a3a2a1a0,其中10001是ACALL指令的操作码。

在这里插入图片描述
在这里插入图片描述

③ 子程序返回指令

  • RET:从调用子程序返回。从栈顶弹出断点到PC。
  • RETI:从中断程序返回。从栈顶弹出断点到PC,并恢复中断优先级状态触发器。

在这里插入图片描述

2. 转移指令

① 无条件转移指令

  1. 短转移 SJMP (Short Jump)
  • 指令:SJMP rel;PC+rel→PC,机器码为80 rel 。
  • 说明:该指令功能为PC+rel→+PC,其中 rel 为转移的偏移量,转移可以向前转( 目的地址小于源地址),也可以向后转( 目的地址大于源地址),因此偏移量rel是1字节有符号数,用补码表示,转移范围为距离PC一128~+ 127字节。

在这里插入图片描述

  1. 长转移 LJMP (Long Jump)
  • 指令:LJMP addr16; addr16→程序计数器PC的位0~位10。
  • 本指令为64KB程序存储空间的全范围转移指令。转移地址可为16位地址中的任意值。本指令为3字节指令02 addr 16。

在这里插入图片描述

  1. 间接转移(也叫变址转移)JMP(Jump to Data Pointer + Accumulator)
  • JMP @A+DPTR;A+DPTR→PC

在这里插入图片描述
在这里插入图片描述

  1. 绝对转移 AJMP (Absolute Jump Within 2K Block)
  • AJMP addr11; addr11→程序计数器PC的位0~位10。
  • 转移范围:本指令为2KB地址范围内的转移指令。对转移目的地址的要求与ACALL指令对子程序入口地址的要求相同。
  • 机器码形式:本指令为2字节指令。设addr11的各位是a10a9a… a2a1a0,则指令的机器码为a10a9a800001a7a6a5a4a3a2a1a0。

在这里插入图片描述

② 条件转移指令

  • 累加器为0,则转移:JZ rel。PC+rel→ PC
    累加器不为0,则转移:JNZ rel。PC+rel→ PC
  • 减1不等于0转移:DJNZZ (Decrement and Jump if Not Zero)
    DJNZ Rn,rel;Rn-1
    DJNZ dir,rel
    本指令有自动减1功能。
  • 比较不等转移:CJNE (Compare and Jump if Not Equal)
    CINE A,dir, rel
    CINE A, #data,rel
    CINE Rn,#data,rel
    CINE @Ri,#data, rel
    对于以上几条指令,均有:若目的操作数≠源操作数,则PC+rel→PC,否则程序将顺序执行。
    ①CJNE指令都是3字节指令,作减操作,不回送结果,影响CY标志。
    ②若第一操作数大于或等于第二操作数,则标志CY=0。若第一操作数小于第二操作数,则CY=1。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 空操作指令

  • NOP 机器码 00
  • 该指令经取指,译码后不进行任何操作(空操作)而转到下一条指令, 常用于生产一个机器周期的延时,或上机修改程序时作填充指令以方便增减指令。

在这里插入图片描述

4. 指令应用实例

在这里插入图片描述
在这里插入图片描述

【 5. 位操作指令 】

  • 位地址的表达方式
  1. 用直接位地址表示。如 D4H。
  2. 用 “." 操作符号表示。如 PSW.4 或 D0H.4
  3. 用位名称表示。如 RS1。
  4. 用用户自定义名表示。如 ABC BIT D4H,其中 ABC 定义为 D4H 位的位名,BIT 为位定义伪指令。
    以上各例均表示 PSW.4 的 RS1 位。
  • 位操作类指令的对象是C和直接位地址,由于C是位累加器,所以位的逻辑运算指令目的操作数只能是C,这就是位操作指令的特点。
  • 位清零
    CLR C ;0→CY
    CLR bit ;0→bit
  • 位置1
    SETB C;1→CY
    SETB bit;1→bit
  • 位取反
    CPL C ; CY’→CY
    CPL bit ;bit’→bit
  • 位与
    ANL C,bit; CYΛ(bit) →CY
    ANL C,/bit; CYΛ(bit’) →CY
  • 位或
    ORL C , bit; CY V (bit) →CY
    ORL C, /bit; CY V (bit) →CY
  • 位传送
    MOV C,bit; (bit)→CY
    MOV bit, C; CY→bit
  • 位转移
    位转移根据位的值决定转移,均为相对转移指令,
    设As为下面各指令的首地址。
    JC rel ;CY=1,则转移( PC+rel-→PC)否则程序顺序执行
    JNC rel;CY=0,则转移( PC+rel- +PC)否则程序顺序执行
    JB bit,rel;(bit)=1,则转移( PC+rel-→PC)否则程序顺序执行
    JNB bit,rel ;(bit)=0, 则转移( PC+rel- →PC )否则程序顺序执行
    JBC bit,rel ;(bit)=1,则转移 ( PC+rel- >PC )且该位清零;否则程序顺序执行。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

【 6. 小结 】

51系列单片机指令系统的特点是不同的存储空间寻址方式不同,适用的指令不同,必须进行区分指令是程序设计的基础。

  • 10
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
51汇编语言指令集 符号定义表 符号 含义 Rn R0~R7寄存器n=0~7 Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 @Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数 #data16 16位常数 Addr16 16位的目标地址 Addr11 11位的目标地址 Rel 相关地址 bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位 指令介绍 指令 字节 周期 动作说明 算数运算指令 1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器 2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器 3.ADD A,@Ri 1 1 将累加器与间接地址的内容相加,结果存回累加器 4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器 5.ADDC A,Rn 1 1 将累加器与寄存器的内容及进位C相加,结果存回累加器 6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器 7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器 8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器 9.SUBB A,Rn 1 1 将累加器的值减去寄存器的值减借位C,结果存回累加器 10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器 11.SUBB A,@Ri 1 1 将累加器的值减间接地址的值减借位C,结果存回累加器 12.SUBB A,0data 2 1 将累加器的值减常数值减借位C,结果存回累加器 13.INC A 1 1 将累加器的值加1 14.INC Rn 1 1 将寄存器的值加l 15.INC direct 2 1 将直接地址的内容加1 16.INC @Ri 1 1 将间接地址的内容加1 17.INC DPTR 1 1 数据指针寄存器值加1 说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位 18.DEC A 1 1 将累加器的值减1 19.DEC Rn 1 1 将寄存器的值减1 20.DEC direct 2 1 将直接地址的内容减1 21.DEC @Ri 1 1 将间接地址的内容减1 22.MUL AB 1 4 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回B寄存器 说明:将累加器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器。如果积大于FFH,则溢出标志位(OV)被设定为1,而进位标志位为0 23.DIV AB 1 4 将累加器的值除以B寄存器的值,结果的商存回累加器,余数存回B寄存器 说明:无符号的除法运算,将累加器A除以B寄存器的值,商存入A,余数存入B。执行本指令后,进位位(C)及溢出位(OV)被清除为0 24.DA A 1 1 将累加器A作十进制调整, 若(A) 3-0>9或(AC)=1,则(A) 3-0←(A)3-0+6 若(A) 7-4>9或 (C)=1,则(A) 7-4←(A)7-4+6 逻辑运算指令 25.ANL A,Rn 1 1 将累加器的值与寄存器的值做AND的逻辑判断,结果存回累加器 26.ANL A,direct 2 1 将累加器的值与直接地址的内容做AND的逻辑判断,结果存回累加器 27.ANL A,@Ri 1 1 将累加器的值与间接地址的内容做AND的逻辑判断,结果存回累加器 28.ANL A,#data 2 1 将累加器的值与常数做AND的逻辑判断,结果存回累加器 29.ANL direct,A 2 1 将直接地址的内容与累加器的值做AND的逻辑判断,结果存回该直接地址 30.ANL direct,#data 3 2 将直接地址的内容与常数值做AND的逻辑判断,结果存回该直接地址 31.ORL A,Rn 1 1 将累加器的值与寄存器的值做OR的逻辑判断,结果存回累加器 32.ORL A,direct 2 1 将累加器的值与直接地址的内容做OR的逻辑判断,结果存回累加器 33.ORL A,@Ri 1 1 将累加器的值与间接地址的内容做OR的逻辑判断,结果存回累加器 34.ORL A,#data 2 1 将累加器的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值