80C51汇编指令(111条)按字节数可以分为:单字节指令(49条),双字节指令(45条),三字节指令(17条)
单字节指令如INC A;其中操作助记符INC占5个Bit,累加器A占1个Bit,共占6BIt内存空间,记为单字节。
双字节指令如MOV A,#50H;其中操作助记符MOV占5个Bit,累加器A占1个Bit,数据50H占1个字节,共计1KB+6Bit,记为双字节。(补充说明:一个十六进制数50H,在指令中代表内存中的地址50H单元,在数据前加#代表数据,#50H就是十六进制数50H)
三字节指令如MOV 40H,#50H;其中操作助记符MOV占5Bit,地址单元40H占1KB,十六进制数据50H占1KB,共计3KB,记为三字节。
书写格式
操作助记符 [目的操作数],[源操作数];[注释]
如:MOV 40H,#50H;将数据50H存入内存单元40H中
<温馨提示:不要看到注释就加//,这里不用加滴>
<注意:要有注释,有句话是这么说的“不写注释是流氓,名字瞎起是扯淡”,拒绝流氓,拒绝扯淡>
欧克,吃完前菜,来看看正餐
首先是第一大类数据传送类指令(记住了29条),顾名思义,传送数据用的,先来看比较一般的一般数据传送指令:第一条,将数据传送到累加器A中,需要用到的操作助记符为MOV,源操作数可以是地址单元,数据,寄存器;
MOV A,Rn;意思为将寄存器组Rn存储内容传送大寄存器A中,Rn写在括号中代表Rn的存储内容;
Rn(n=0~7)-当前工作寄存器组中的寄存器R0-R7
像这种将寄存器的内容传送到目的操作数中的寻址方式【寻找(源)操作数或指令转移地址的方式】,叫做寄存器寻址。
再来看看同样作为工作寄存器组的Ri,
Ri(i=0,1)-当前工作寄存器组中的寄存器R0或R1
i只能取0或者1,Rn与Ri的不同在于Ri是用于寄存器间接寻址,在Ri前添加间址寄存器前缀@用于区分。
间接寻址,假如i=0,(R0)=30H,(30H)=50H;执行指令
MOV A,@R0;后,累加器A中的内容为50H。以R0的存储内容30H作为地址单元,将地址30H单元中存储的内容50H传输到累加器A中。
这里需要注意的是,间接寻址,只能用Ri,并且要添加前缀@。
下一条指令,MOV A,direct;将地址单元direct中存储的内容传送到累加器A 中,像这种传送内容是操作数的地址的寻址方式叫做直接寻址。
指令MOV A,#data;将操作数data传输到累加器A中,这种操作数就在编码指令中的寻址方式叫做立即数寻址。
同样,我们的数据不光可以传送到累加器A中,也可以传送到工作寄存器组Rn,Ri中,如下图所示

<提醒:在汇编指令间接寻址中Ri出现,必须前加@符号>
以direct为目的操作数,将数据传送到地址单元中

这里需要特别注意的是,两个寄存器的内容不可以互传!!!
唯一的16位传送指令
MOV DPTR, #data16;
#data16表示16位立即数,#data表示8位立即数
懂了一般的,再来看看特殊一点的,特殊传送指令
操作助记符MOVC:读ROM中常数表项指令(这里要搞清楚片内的是ROM,片外的是RAM)
以DPTR内容为基址:数据指针(DPTR)是80C51中一个功能比较特殊的16位寄存器,主要功能是存放16位地址;同样DPTR也可以拆分成两个8位的寄存器使用(DPH,DPL),在执行指令时,DPH高八位地址由P2口输出,DPL低八位地址由P0输出。
MOVC A,@A+DPTR;A ←((A)+(DPTR))
因为DPTR位16位寄存器,可存放的数据较大,对常数表的约束比较小,故又称为远程查表指令
以PC内容为基址:程序计数器PC
MOVC A,@A+PC ;A ←((A)+(PC))
PC为8位程序计数器,对于常数表存放约束较大(相对DPTR来看),又称为近程查表指令
操作助记符MOVX:读片外RAM及接口单元数据的指令

三者的区别在于MOV用于对单片机内部数据存储器寻址,MOVC用于对单片机内部程序存储器区进行寻址,MOVX用于对外部数据存储器区进行寻址,
堆栈操作指令PUSH和POP
堆栈是一片存储区,遵循“后进先出”原则,栈顶由SP指示。
80C51的堆栈设在片内RAM低端的128个单元,向上生长。
数据交换指令XCH、XCHD和SWAP
字节交换指令XCH

半字节交换指令XCHD
XCHD是间址操作数的低半字节与A的低半字节互换。
SWAP是累加器的高低4位互换

然后是第二大类24条的算术运算类指令:加减乘除与或非之类的
在开始之前先来认识一下CPU功能单元的运算器部分:ALU,累加器ACC,寄存器B,和PSW。PSW,程序状态字存储器,位于特殊功能寄存取得8位可读写寄存器,字节地址D0H。
PSW的格式如下:

接下来请看张毅刚的《单片机原理及应用》介绍的功能意义
(1)Cy(PSW .7)进位标志位:在执行算术和逻辑指令时,Cy可以被硬件或软件置位或清除,在位处理器中,它是位累加器。Cy也可写为C。
(2)Ac(PSW .6)辅助进位标志位:当进行BCD码的加法或减法操作而产生的由低4位数(代表一个BCD码)向高4位进位或借位时Ac将被硬件置1,否则被清0。Ac被用于十进位调整,同DA指令结合起来用。
(3)F0(PSW .5)标志位:它是由用户使用的一个状态标志位,可用软件来使它置1或清0,也可由软件来测试标志FO以控制程序的流向。编程时,该标志位特别有用。
(4)RS1,RS0(PSW.4,PSW.3)4组工作寄存器区选择控制位1和位0。
这两位用来选择4组工作寄存器区中的哪一组为当前工作寄存区(4组寄存器在单片机内的RAM区中)它们与4组工作寄存器区的对应关系如下:

(5)OV(PSW.2)溢出标志位
当执行算术指令时,由硬件置1或清0,以指示运算是否产生滋出。各种算术运算对该位的影响情况较为复杂
(6)PSW.1位
该位是保留位,未用
(7)P(PSW .0)奇偶标志位
该标志位用来表示累加器A中为1的位数的奇偶数。
P=1,则A中“1"的位数为奇数
P=0,则A中“1"的位数为偶数
此标志位对申行口通讯中的数据传输有重要的意义,常用奇偶检验的方法来检验数据传输的可靠性。
这里需要用到的是其中四位:
CY为1,无符号数(字节)加减发生进位或借位
OV为1,有符号数(字节)加减发生溢出错误
AC为1,十进制数(BCD码)加法的结果应调整
P为1,存于累加器A中操作结果的“1”的个数为奇数
进入正题,无进位加法运算ADD

带进位加法,操作助记符ADDC

加1运算INC:

十进制数调整(加6调整)DA:
DA A ;调整A的内容为正确的BCD码
两个压缩的BCD码按二进制相加后,必须经过调整方能得到正确的和。
用00001001表示十进制数09,超过1001则不是BCD码
当A中低4位出现了非BCD码(1010~1111)或低4位的进位AC=1,则应在低4位加6调整。
当A中高4位出现了非BCD码(1010~1111)或高4位的进位CY=1,则应在高4位加6调整。
执行十进制调整指令后,PSW中的CY表示结果的百位值
注:只有BCD码运算才需要进行十进制调整
减法运算SUBB:

CY(借位标志)为1,表示D7位需借位
AC(辅助借位标志)为1,表示D3位需借位
OV(溢出标志)为1,表示“D6有借位D7无借位”或“D7有借位D6无借位”,即D6,D7其中一个有借位
D7 D6 D5 D4 D3 D2 D1 D0
减1指令DEC:

减1指令只会影响程序状态字PSW的(奇偶校检)P,改变1的个数。
唯一的乘法指令MUL:
MUL AB ;A与B相乘
无符号数相乘的结果中,A中存低八位,B中存高八位,相乘后CY会被清零,如果OV(溢出标志)为1,则表示积大于FFH。
唯一的除法指令DIV:
DIV AB;A除以B
无符号数除法运算,A存整除结果,B存余数
逻辑与ANL:

逻辑或ORL:

异或运算XRL:

清零CLR与取反CPL:

累加器循环移位指令:
先来看图

假设(A)=F0H;即累加器A中的内容 1111 0000,CY=1
执行指令RR A;循环右移,将溢出的A0位内容存放到A7中,
(A)= 78H =0111 1000
执行指令 RRC A;右移后,将CY补到A7位
(A)=F8H=1111 1000
执行指令RL A;循环左移,将溢出的A7位内容存放到A0位中
(A)=E1H=1110 0001
执行指令RLC A;;左移,将CY补到A0位
(A)=E1H=1110 0001
下面来看17条的控制转移类指令(中断,调用,子程序)
无条件转移指令AJMP,JJMP,SJMP,与JMP
短跳转AJMP addr11 ;PC ←(PC)+ 2,PC10~0 ← addr11
addr11代表11位的地址值,2^11,也就是2K,查找范围就是2K
PC:16位程序计数器
长跳转LJMP addr16 ;PC ← addr16
Addr16,2^16,也就是64K的寻址空间
相对转移SJMP rel ;PC ←(PC)+ 2,PC ←(PC)+ rel
地址偏移量rel 对应范围为 +127 ~-128。
散转移JMP @A+DPTR;PC ←(PC)+ 1,PC ←(A)+(DPTR)
通常情况下,数据指针DPTR是一个固定值,所以偏移量取决于累加器A,可完成多条判跳指令的功能
再然后是几种条件转移
其一累加器判0转移(JZ,JNZ)

其二比较不等转移(CJNE,CJN)

其三减一不为零转移(DJNZ)

其四调用与返回
先调用(ACALL)

再返回(RET,RETI)

RETI专用于中断服务程序返回,它具有清除内部相应的中断状态触发器(以保证正确的中断逻辑)的功能。
补充说明:PC是怎么加得1,2,3
三字节指令+3,双字节+2,单字节指令+1;
还有一条空操作
NOP ;PC ←(PC)+ 1,占1个周期、一个字节
终于终于终于到了最后一类指令,那就是位操作指令
位操作指令,就是对位操作的指令,对一个二进制数的地址进行操作,
位地址总共有这么四种表现形式,先肯定是直接地址,然后呢就是点操作符,比如说PSW.5,0D0H.5之类的,再然后就是位名称,操作位的名称,最后,最常用的伪指令定义,这个比较像C语言中的define;
说define就没有解释的必要了。
位传送MOV,其实与前面所讲的并无太大区别,先前用的是累加器A,现在用的是位累加器C,也就是PSW中的CY,这里简写了而已。

位状态设置(CLR,SETB)

位逻辑运算(ANLORL,CPL)

位转移(JC,JNC,JB,JBC,JNB)

以上便是80C51汇编的全部指令了,接下来再来看张图,简单复习一下。

长篇大论的说了那么多,小朋友,你是否有很多问号,下面就让我们来看一张丑到极致的导图,来结束这篇啰嗦的博客。

80C51汇编指令学习相关推荐

  1. ARM汇编指令学习---基于启动文件startup.S分析

    本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...

  2. ARM汇编指令学习笔记(一)

    (一)数据常量定义汇编指令EQU EQU用于为程序中的常量.标号等定义一个有效的字符名称,类似于C语言中的#define,当表达式为32位常量时,可指定表达式的数据类型,CODE16,CODE32,D ...

  3. MIPS 汇编指令学习

    mips的32个寄存器 MIPS comes with 32 general purpose registers named $0. . . $31 Registers also have symbo ...

  4. 汇编指令学习(AND,OR,XOR,NOT)

    一.AND指令 逻辑与运算,二进制位都为1时,才为1,否则为0,置eax为5,置ebx为6,运行下面指令,结果会赋值给eax 5二进制:0101 6二进制:0110 与结果是 0100,十进制是4 a ...

  5. 汇编指令学习(MOV,MOVSX,MOVZX,LEA,XCHG)

    一.MOV指令 1.将十六进制0x1234数值,赋值给eax寄存器 mov eax,0x1234 2.将十六进制0x123数值,赋值给内存地址为ebx mov dword [ebx],0x123 3. ...

  6. 汇编指令学习(CMP,TEST)

    一.CMP比较指令,相当于SUB命令 比较两个操作数,如果两个数相等,zf标志位就为1,将eax,ebx的值置为1,执行下面指令,je这个跳转指令就会根据zf标志位进行跳转 cmp eax,ebx j ...

  7. 汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)

    一.ADD加法操作指令 将eax置1,ebx置2,运行下面命令,将结果保存到eax add eax,ebx 扩展:adc需要再加上CF标志位的值 adc eax,ebx 二.SUB减法操作指令 将ea ...

  8. 汇编指令学习(JMP、JE、JS、JP,JO,JB)

    一.JMP无条件跳转 不用看标志位,jmp后面跟一个内存地址,直接跳转到该地址 jmp 0x0046B994 二.JE(JZ)条件跳转 当ZF标致为1的时候发生跳转,为0的时候不跳转,可以双击标志位, ...

  9. mips架构汇编指令

    mips架构特点 MIPS32 架构中是没有 EBP 寄存器的,程序函数调用的时候是将当前栈指针向下移动 n 比特到该函数的 stack frame 存储组空间,函数返回的时候再加上偏移量恢复栈 传参 ...

最新文章

  1. 去掉viewstate保持在页面中的一大串字符的方法
  2. 用qt调用第三方库resolve
  3. STM32的FlyMcu程序下载
  4. 微型计算机输入输出的工业标准是7位,工业用微型计算机试题3
  5. 泛函分析 06.02 线性算子的谱理论 - 有界线性算子的谱集
  6. Quartus II——基于VGA的图像显示
  7. 社会工程学攻击案例-网站钓鱼
  8. pig的安装、pig的数据模型和pig的常用命令
  9. ASP.NET 2.0 本地化技术之研究
  10. IT基础架构规划方案三(IT基础软件和系统规划)
  11. 阿里云服务器选择不同地域有什么区别
  12. 农村土地确权之数据入库 —— 国源软件数据入库说明[多档案入库]
  13. OJ1343——First Blood
  14. Cesium 粒子系统应用:消防车灭火模拟
  15. 在word上写博客直接发到CSDN ——失败哈哈
  16. 2020,上市也疯狂
  17. [实用超分网络大赏]《Real-Time Quantized Image Super-Resolution on Mobile NPUs, Mobile AI 2021 Challenge》
  18. 题解:补♂课第110场
  19. Java中的JavaCore/HeapDump文件及其分析方法
  20. pythonjam怎么使用_PythonJam app下载-PythonJam安卓版 v1.6.1_5577安卓网

热门文章

  1. python led屏控制_【教程】简易Python上位机之LED控制
  2. OpenFlow协议Open Flow交换机跟流表(FlowTable)
  3. 如何像学霸一样高效学习?
  4. 基于ASP.NET的企业进销存管理系统的设计和实现(APP+网页)
  5. 学UG数控编程、五金汽车模具设计、产品设计学哪个好?
  6. 【Eclipse的正确打开方式】从Libraries中的jar包到源代码和API连接
  7. 七百块DIY一台自己的雕刻机
  8. 基于ADAU1452DSP数字音频信号处理
  9. WordPress限制登录次数防破解插件Limit Login Attempts Reloaded
  10. MC9S12XEP100RMV1数据手册中关于384KBPFLASH相关术语术语