折腾来折腾去

pikipity的blog

单片机原理及程序设计 第四章 汇编语言

学习汇编语言可以很好地帮助单片机的学习,而且一个好的汇编语言写成的程序要比实现相同功能的 C 语言更短更快。但是难以理解,移植性差,所以现在一般都用 C 语言来为单片机编程,只有部分硬件的驱动或是 C 语言难以控制的部分来用汇编编写。

汇编指令分类

汇编语言中的指令分为两大部分:

  1. 指令(Instruction):指令会被编译器编译为机器语言将来提供给单片机。指令的数量很有限,不像 C 语言,内置函数就一堆,所以用到什么查表就可以了,表格会在后面提供。
  2. 伪指令(Directive):伪指令不会被编译器编译为机器语言,仅仅是提供给编译器,为了“编译”而存在的指令。

汇编语言格式

任何编程语言都有格式,汇编语言也不例外,格式如下:

标记: 操作码 操作数  ;注释

标记不是每一行都有,需要的时候有就可以了,标记是为了方便对程序内存的寻址,冒号是和标记一起存在的。操作码和操作数就是汇编指令,当然必须有。分号与注释一起存在,不会被编译。

寻址方式

再给出所有汇编指令表之前先要介绍一下汇编语言的寻址方式,单片机中对数据的操作最常见的就是将数据从内存的一个地方移到另一个地方,在移动的过程中就需要声明内存地址(内存地址是什么?请回到第二章,谢谢),那么如何获得这个内存地址呢?就是通过“寻址”来获得。8051 的汇编指令只有四种寻址方式:

  1. 直接寻址(Direct Addressing,在表格中简写为 Dir):直接给出一个16进制数,代表资料记忆体的一个字节地址,从这个地址中拿出数据来操作。只能用于内置 RAM
  2. 间接寻址(Indirect Addressing,在表格中简写为 Ind):一个 “@” 的符号在加一个寄存器的名字,例如 @DPTR,从这个寄存器中拿出数据,把这个数据当做地址,再从这个地址中拿出数据来操作。可对内置和外扩 RAM 使用。
  3. 寄存器寻址(Register Addressing,在表格中简称 Reg):直接一个寄存器的名字,例如 R0,从寄存器中拿出数据进行操作。仅对寄存器有效。
  4. 立即寻址(Immediate Addressing,在表格中简称 Imm):一个井号 “#” 再加一个整数,例如 #1011B,直接对这个整数进行操作。

指令表

为了方便记忆和查询,指令又分为了五类

  1. 数据移动:数据移动的指令又根据被移动的数据所在位置分为三个部分。

    • 内部 RAM 内数据的移动

    • 外部 RAM 内数据读取与写入

    • 程序内存数据读取

    注意:

    • Ri 的意思是 R1 或者 R0,不包括 R2 ~ R7
    • MOV 指令代表一个1 byte 的机器语言,所以它的操作数中不可能同时出现多个寄存器,例如 MOV R0,R1 是错误的,只能是

      MOV A,R1 MOV R0,A

  2. 计算:

  3. 逻辑运算:

  4. 布尔运算和判断:

  5. 跳转:



Comments