单片机伪指令


  伪指令又叫做汇编控制指令,它是在汇编过程中起作用的指令,用来对汇编过程进行某种控制,或者对符号、标号赋值。伪指令和指令是完全不同的,在汇编过程中,伪指令并不产生可执行的目标代码,大部份伪指令甚至不会影响中的内容。
  
  ORG(汇编起始命令)ORG的功能为规定下面目标程序的起始地址。
  
  格式:[标号:] ORG 16位地址。
  
  其中括号内是任选项,可以没有。
  
  ORG伪指令总是出现在每段源程序或数据块的起始位置,故称为汇编起始命令。在一个源程序中,可以多次使用ORG指令,以规定不同的程序段的起始位置。但所规定的地址应该是从小到大,而且不允许有重叠,即不同的程序段之间不能有重叠。一个源程序若不用ORG指令开始,则从OOOOH开始存放目标码。
  
  如:

  表示主程序从0030H单元开始存放。
  
  END(汇编结束命令)格式:[标号:] END其中括号内是任选项,可以没有。
  
  END是汇编语言源程序的结束标志,在END以后所写的指令,汇编程序都不予处理。一个源程序只能有一个END命令。在同时包含有主程序和子程序的源程序中,也只能有一个END命令,并放到所有指令的最后。否则,在END之后就有一部分指令不能被汇编(编译)。
  
  EQU(等值命令)EQU的功能是将一个数或者特定的汇编符号赋予规定的字符名称。
  
  格式:字符名称  EQU数或汇编符号。注意,这里使用的是“字符名称”,不是标号,而且也不用“:”来作分隔符,若加上“:”反而被汇编程序认为是一种错误。用EQU指令赋值以后的字符名称,可以用作数据地址、代码地址、位地址或者直接当作一个立即数使用。因此,给字符名称所赋的值可以是8位数,也可以是16位数。使用EQU伪指令时必须先赋值,后使用。而不能先使用,后赋值。

  如:

  表示经定义后,允许在指令中用FA代替Rl。
  
  又如:

  表示经定义后,即给ADD赋以地址值1000H。
  
  DB或DEFB(定义字节命今)DB的功能是从指定的地址单元开始,定义若干个字节作为内存单元的内容。
  
  格式:[标号:]DB字节形式的数据表这个伪指令是在程序存储器的某一部分存入一组规定好的8位二进制数,或者是将一个数据表格存入程序存储器。该伪指令在汇编以后,将影响程序存储器的内容。
  
  DB命令所确定的单元地址可以由下述两种方法之一来确定:若DB命令是紧接着其它源程序的,则由源程序最后一条指令的地址加上该指令的字节数来确定;由ORG命令来规定首地址。
  
  如:

  表示首地址从0800H开始的一组数据表格。
  
  DW或DEFW(定义字命令)其功能是从指定地址开始,定义若干个16位数据。

  每个16位数要占ROM的两个单元,在51系列单片机中,16位二进制数的高8位先存入(低地址字节),低8位后存入(高地址字节)。
  
  如:

  表示表示首地址从0800H开始的一组16位数据表格。

  DB、DW伪指令都只对程序存储器起作用,即不能用它们来对数据存储器的内容进行赋值或其它初始化的工作。
  
  DS或DEFS(预留存储区命令)其功能是从指定地址开始,定义一个存储区,以备源程序使用。存储区预留的存储单元数由表达式的值决定。
  
  格式:[标号:]DS表达式值女口:

  即由0500H地址开始保留连续的10个存储单元存储区。
  
  BIT(定义位命令)其功能用于给字符名称定义位地址。
  
  格式:字符名称BIT位地址如:

  经定义后,允许在指令中用Fl代替Pl.l。
  
  DATA(定义数据地址命令)其功能用于给字符名称定义16位地址。通常用来定义数据地址。
  
  格式:字符名称DATA16位地址4.字节交换指令XCHA,Rn表示将寄存器Rn中的内容与累加器A的内容相互交换。
  
  XCHA,direct表示把直接寻址单元direct中的内容与累加器A的内容相互交换。
  
  XCHA,@Ri表示将寄存器Ri中内容作为地址的单元内容(寄存器间接寻址单元)与累加器A的内容相互交换。
  
  XCHDA,@Ri表示将寄存器Ri间接寻址单元的低4位内容与累加器A的低4位内容相互交换,而各自的高4位维持不变。
  
  内部RAM接下来做实验,具体认识所学这些指令的作用。

  现在我们做实验,在S2板上实现:按下0~9键后,将立即数0~9输入到累加器A中,左边第二个用作输入显示。单片机根据累加器A中的数查其平方表,并且在右边的两个数码管上显示出来。在我的文档中建立一个文件目录(S13),然后建立S13.uv2的工程项目,最后建立源程序文件(S13.asm)。
  
  输入下面的程序:

  编译通过后,将S13文件夹中的hex文件烧录到89C51芯片中,将芯片插入到S2型数码管试验板上,按下O键,左边第二个数码管显示0,右边的两个数码管上显示00;按下1键,左边第二个数码管显示1.右边的两个数码管上显示01:……按下9键,左边第二个数码管显示9,右边的两个数码管上显示81。实现了根据输入数查其平方表的功能。
  
  我们对程序进行分析解释。
  
  序号1(程序解释,以下同):程序开始。
  
  序号2:跳转到MAIN主程序处。
  
  序号3:主程序MAIN从地址0030H开始。
  
  序号4:调用键扫描子程序。
  
  序号5:若累加器为O,跳转到MAIN处。
  
  序号6:调用lOms延时子程序,避开键抖动干扰。
  
  序号7:再调用键扫描子程序。
  
  序号8:若累加器A为0,说明无键输入,跳转到MAIN处。否则说明有键输入,顺序执行。
  
  序号9:向P3口送数7FH,准备读取键输入状态。
  
  序号10:有3键按下转L3。
  
  序号11:有6键按下转L6。
  
  序号12:有9键按下转L9。
  
  序号13:向P3口送数BFH,准备读取键输入状态。
  
  序号14:有2键按下转L2。
  
  序号15:有5键按下转L5。
  
  序号16:有8键按下转L8。
  
  序号17:有0键按下转L0。
  
  序号18:向P3口送数DFH,准备读取键输入状态。
  
  序号19:有1键按下转Ll。
  
  序号20:有4键按下转LA。

  序号21:有7键按下转L7。
  
  序号22:无有效键按下,跳转到标号MAIN处。
  
  序号23:向累加器A送立即数00。
  
  序号24:跳转到标号GOON处。
  
  序号25:向累加器A送立即数01。
  
  序号26:跳转到标号GOON处。
  
  序号27:向累加器A送立即数02。
  
  序号28:跳转到标号GOON处。
  
  序号29:向累加器A送立即数03。
  
  序号30:跳转到标号GOON处。
  
  序号31:向累加器A送立即数04。
  
  序号32:跳转到标号GOON处。
  
  序号33:向累加器A送立即数05。
  
  序号34:跳转到标号GOON处。
  
  序号35:向累加器A送立即数06。
  
  序号36:跳转到标号GOON处。
  
  序号37:向累加器A送立即数07。
  
  序号38:跳转到标号GOON处。
  
  序号39:向累加器A送立即数08。
  
  序号40:跳转到标号GOON处。
  
  序号41:向累加器A送立即数09。
  
  序号42:将累加器A内容送30H单元暂存。
  
  序号43:将数码管字段码数据表格的首地址(0350H)存入16位数据地址指针DPTR中。
  
  序号44:根据A中内容查表。
  
  序号45:查表结果送P2口显示。
  
  序号46:将30H单元内容送回累加器A。
  
  序号47:将0—9平方表数据表格的首地址(0300H)存入16位数据地址指针DPTR中。
  
  序号48:根据A中内容查表。
  
  序号49:将数码管字段码数据表格的首地址(0350H)存入16位数据地址指针DPTR中。
  
  序号50:将累加器A中内容压栈。
  
  序号51:屏蔽累加器A高4位。
  
  序号52:根据A中内容查表。
  
  序号53:累加器A中内容送PO口显示。
  
  序号54:恢复累加器A中原内容。
  
  序号55:交换累加器的高、低4位。
  
  序号56:屏蔽累加器A高4位。
  
  序号57:根据A中内容查表。
  
  序号58:累加器A中内容送Pl口显示。
  
  序号59:调用延时子程序,维持数码管点亮。
  
  序号60:跳转到MAIN处循环执行。
  
  序号61:键扫描子程序从地址0200H开始。
  
  序号62:键扫描子程序开始,向P3口送数OFH,准备读键输入。
  
  序号63:将P3口状态读入累加器A中。
  
  序号64:累加器A与立即数FOH相或。