文档视界 最新最全的文档下载
当前位置:文档视界 › PIC16系列_单片机常用伪指令(汇编)

PIC16系列_单片机常用伪指令(汇编)

PIC16系列_单片机常用伪指令(汇编)
PIC16系列_单片机常用伪指令(汇编)

PIC 单片机端口电平变化中断使用必须注意的问题

PICC18使用说明

PIC 单片机常用伪指令

PIC单片机2009-02-19 11:16:40 阅读8 评论0 字号:大中小订阅

3.2.3 MPASM 的伪指令

我们在第一章中已经详细介绍了中档PIC 单片机的35 条指令,源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不亚于35 条正真的汇编指令。我们在此着重介绍最常用的几种

伪指令。

#include 或include

#include 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。

被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM 能够识别的。最经常被“include”的是针对PIC 单片机内部特殊功能寄存器定义的包含头文件,在MPLAB 安装后它们全部放在路径“ C:\Program Files\MPLAB

IDE\MCHIP_Tools”下,每一个型号的PIC 单片机都有一个对应的预定义包含头文件,扩展名是“.inc”。除了一些符号预定义文件,你也可以把现有的其它程序文件作为一个代码模块直接“包含”进来作为自己程序的一部分。见例3-01。

#include ;把预定义的PIC16F877A 寄存器符号包含到此处

#include ”math.asm” ;把现有的程序文件包含进来作为自己代码的一部分

例3-01

请注意被包含文件的引用方式。一种是<>尖括号引用,这种引用意味着让编译器去默认的路径下寻找该文件,MPASM 默认的寄存器预定义文件存放路径即为上面提及的MPLAB 安装后的目录;另一种是””双引号引用,这种引用方式的意思是指示编译器从引号中指定的全程文件路径下寻找该文件。例3-01 中”math.asm”没有指定路径,即意味着在当前项目路径下寻找math.asm 文件。如果编译器找不到被包含的文件,将会有错误信息告

知。

请在你的源程序中尽量用MPLAB 标准头文件定义的寄存器符号。一来这些被定义的寄存器符号和芯片数据手册上的描述一一对应,理解起来即直观又容易;二来如果用你自己定义符号就缺乏一个大家能一起交流的标准平台,其他人要解读你的代码时将费时费力。故例3-01 中的首行#include 包含引用伪指令可以说是PIC 单片机程序编写时的标准必备。

list

list 伪指令可以设定程序编译时的一些信息,例如所选单片机的型号,编译时选择的缺

省数制等。例如:

list p=16f877a, r=DEC ;单片机型号为PIC16F877A,无特别指明的数字为十进制数

例3-02

如果程序开发时使用项目管理的模式,则所有list 伪指令可以描述的参数项都可以在项目的设定选项中通过对话框的形式设定并保存。在此只需对list 伪指令稍作了解即可。

__config

此伪指令的重要作用是把芯片的配置字设定在源程序中,请参阅2.5 节的详细说明。建议大家尽量用此伪指令把芯片的配置字写在程序中。

__idlocs

PIC 单片机中有一处非常特殊的标记单元。它独立于任何其它存储器,唯一的作用就是

作为一个标记。此标记值无法用软件读到,读取和写入的方法只有通过编程器实现。此标记值没有读保护,你可以利用它存放程序的版本或日期等信息。如果需要,则可以用伪指令

__idloc 在程序中定义具体的值。

__idloc 0x1234 ;设定芯片的标记值为0x1234,注意前面有两个下划线符

例3-03

和__config 伪指令定义的配置字一样,用__idloc 定义的芯片标记值在最后也会存放在

HEX 文件中,这就要求编程器能够解析它。

errorlevel

errorlevel 的用途是控制编译信息的输出显示。编译器在编译你的源程序时会提供很多

信息,有些信息是你必须要处理的,例如错误信息(Error),只要有错误信息存在,你的程序将永远无法完成编译;有些可能只需要关注,例如警告信息(Warning);也有一些可能你根本就不感兴趣,它们只是一些提示信息(Message)而已。注意出现警告和提示信息时将不会中止编译器的编译工作,你的程序将被编译并最终产生HEX 文件。图3-14 中显示了一

个程序编译后的各种信息实例,其中既有错误信息,也有警告和提示信息。我们可以用errorlevel 伪指令来控制输出信息的级别,或刻意关闭/打开一些提示信息。

编译信息的输出显示级别有三种,分别是0、1 和2。级别0 代表显示所有信息,包括

各种错误、警告和提示信息,如图3-14 所示;级别1 代表显示错误和警告信息,忽略提示信息;级别3 代表只显示错误信息而忽略警告和提示信息。在任何一个大的级别上还可以对某些信息单独设定显示或关闭。每个信息都有一个识别标号,见图3-14 中信息项“[]”中的数字,打开或关闭某类信息只需在errorlevel 伪指令中引用信息识别标号,并在其前面用“+”

或“-”号,即代表打开或关闭这一类信息,例如:

errorlevel 0, -302, -305 ;显示所有信息,但不需要302 和305 这两类提示信息

errorlevel 1, +305 ;显示错误和警告信息,但同时还要关注305 类的提示信息

图3-14

例3-04

#define / #undefine

#define 的作用是定义常数符号,即用一个符号变量替换另一个符号串或变量。被替换的可以是任意字母数字组成的符号但替换者本身不能是一个纯数字。例如:#define DELAY_TIME 1000 ;定义常数符号,即用DELAY_TIME 符号代替1000 #define KEY1 PORTB,7 ;用KEY1 符号代替端口PORTB 的第7 引脚

例3-05

用#define 伪指令定义符号后,可使程序中的变量或指令变得更具实际意义,也使程序

变得更易维护。指令“btfss PORTB,7”和“btfss KEY1”在事先用了例3-05 中的#define 后编译的结果是一样的,但明显地后者看起来更容易理解,一看就知道这是在测试编号为KEY1 的一个按键。而且如果你的硬件设计改动了KEY1 所接的单片机引脚,只要改动这一处#define 重新定义引脚位置,程序的其它部分无需任何修改,再编译一次即可得到更新后的软件代码。一个好的编程习惯是事先把一些代表实际意义的变量、单片机的输入输出引脚在硬件电路中的实际功能等用#define 伪指令定义成简单直观的符号名字,然后在程序中直接用其符号名字而不用简单机械的数字形式。替换的工作由编译器在编译时自动完成。它会先扫描你的源程序代码,把事先#define 的符号名改回成被替换的字符串,然后再继续编译

生产机器码。

equ

equ 顾名思义是“等于”的意思,其作用和#define 伪指令有点类似,也是用一个符号名

字替换其它数字变量,但它只能替换立即数。如果要替换一个符号名字,则此符号名必须事

先用#define 或equ 伪指令已经定义替换了一个立即数。例如:

#define MyCount 0x70 ;定义MyCount 符号替换立即数0x70

w_temp equ 0x20 ;符号名w_temp 等于0x20

count1 equ MyCount ;符号名count1 等同于MyCount

;如果MyCount 没有事先定义则会产生一个错误

例3-06

在绝对定位的编程模式中equ 被经常用于定义用户自己的变量,即用一个符号名代替一

个固定的存储单元地址,上例3-06 中的w_temp 定义即属于此类。用equ 方式定义的符号在汇编后可以生成相关的调试信息,可以通过各种变量观察的方式显示此符号所代表的内存地

址处的数据内容,但用#define 方式定义的符号则不能产生调试信息。要注意equ 伪指令本

身并没有限定所定义的一定是一个变量地址,它只是一个简单的符号和数字替换而已,其意义必须和具体的指令结合才能确定,如下例3-07 中对符号w_temp 的理解。

w_temp equ 0x20 ;符号名w_temp 等于0x20

movlw 0x55 ;W=0x55

movwf w_temp ;把W 的值送给变量w_temp,(0x20 单元内容=0x55)

movf w_temp, w ;把w_temp 单元内容送W,(W=0x55)

movwf FSR ;把W 的内容送FSR,(FSR=0x55)

movlw w_temp ;把w_temp 所代表的立即数即地址值送给W,(W=0x20)movwf FSR ;让FSR 指针指向w_temp,(FSR=0x20 而不是0x55)

例3-07

cblock / endc

用equ 伪指令可以给一个符号变量分配一个地址。但在一个程序设计过程中往往需要定

义很多变量,你当然可以给每一个变量逐个用equ 的方法分配一个地址空间。但如果变量很多,这样做就显得非常麻烦,你必须自己安排每个变量的地址,小心不能出现地址重叠;若要在已定义分配好的变量间插入新的变量,那就必须重新逐个安排随后变量的地址等等。cblock/endc 伪指令可以轻松解决有很多变量定义的场合出现的这些问题,我们把它叫作变

量块连续定义。具体用法如下:

cblock 伪指令声明变量块的起始地址,endc 伪指令声明变量块定义结束,cblock/endc

中间可以插入任意多的变量声明。其地址编排由编译器自动计算:第一个变量地址分配从起

始地址开始,然后按所声明变量保留的字节数自动分配后面变量的地址,变量所需保留的字节数用“:”加后面的数字表示,如果只有一个字节“:1”可以省略不写。以例3-08 来说明:

cblock 0x20 ;变量定义起始地址为0x20

w_temp ;w_temp 地址为0x20,占一个字节

status_temp ;status_temp 地址为0x21,占一个字节

buffer:8 ;buffer 的起始地址为0x22,并保留8 个字节单元

var1 ;var1 的地址为0x2a,占一个字节

var2 ;var2 的地址为0x2b,占一个字节

endc ;结束变量连续定义

例3-08

用cblock 方式定义的变量和用equ 方式定义的变量一样在汇编后可以生成相关的调试

信息,可以通过各种变量观察的方式显示此符号所代表的内存地址和其中的数据内容,所以实际编程时一般无需关心计算每个变量的具体地址。程序员要注意的用这种方式连续定义很多变量时不要让变量块跨越所处bank 的边界。你可以在cblock 中随意插入新定义的变量,或通过改变起始地址的方式使变量块整个挪到其它内存地址处,地址的更新由编译器代劳。

org

org 用以定义程序代码的起始地址,通过此伪指令你可以把程序定位到任何可用的程序

空间,它实现的是程序代码绝对定位,如例3-09:

org 0x0000 ;定义复位入口地址,以下指令从地址0x0000 开始

goto main ;

org 0x0004 ;定义中断入口地址,以下指令从地址0x0004 开始

movwf w_temp ;保存w

;... ;其它中断服务代码

org 0x0800 ;定义page1 的起始地址,以下指令代码放在page1

Sub1 return

例3-09

只要你认为代码需要确定放在某一特定地址处,在程序的任何地方都可以用org 伪指令

重新定义存放的起始地址,且地址顺序可以任意编排。但要注意的是若干个确定起始地址的代码块不能相互重叠,否则编译器会报错,无法得到正确结果。若用可重定位方式开发指令

代码时一般不能用org 伪指令绝对定位代码。

dt

dt 的作用是定义表格数据。在第一章介绍基本汇编指令时已经提到,PIC 单片机实现表格定义的最基本指令是“retlw xx”,表格中的每一个字节数据都以指令“retlw”的形式出现。

若表格较大,就需要很多“retlw”指令,比较麻烦,可读性也差。这时我们可以用此“dt”

伪指令替代“retlw”实现很多数据的表格定义。如例3-10:

Table addwf PCL,f ;PC 相对寻址查表

dt 0 ;retlw 0

dt 1, 2, ’3’;retlw 1

;retlw 2

;retlw 0x33 (’3’的ASCII 码)

dt ”ABC”;re tlw ’A’

;retlw ’B’

;retlw ’C’

例3-10

de

de 伪指令可以让你在源程序中定义片内EEPROM 的初值。毫无疑问,该条伪指令只适用于那些内含EEPROM 数据存储器的单片机,例如:PIC16F87x、PIC16F62x 等等。在中档PIC 单片机中,除了PIC16F7x 系列外,其它Flash 型的单片机都有片上EEPROM,只是字节数多少的问题。你可以编写代码在程序运行时来设定片内EEPROM 数据区的初值,但此EEPROM 区还可以在芯片编程烧写时通过编程器对其设定初值。对编程器而言EEPROM 数据区是程序空间的延伸,它有个特别的编程起始地址0x2100。基于这一前提,我们可以在

源程序中利用“org”和“de”伪指令定义片内EEPROM 数据的初值,这样最后得到的HEX

文件被烧入到单片机内后,EEPROM 区就同时被特定数据所初始化。看例3-11 的实例

org 0x2100 ;特殊的程序空间起始地址

;编程器能识别此地址作为EEPROM 数据区的起始地址

de 0, 1, 2, 3 ;EEPROM 地址单元[0]=0, [1]=1, [2]=2, [3]=3

de ”ABCD” ;[4]=0x41, [5]=0x42, [6]=0x43, [7]=0x44

例3-11

按例3-11 所示的定义,芯片完成编程烧入后,其内部EEPROM 区从0x00 单元开始被

分别初始化成0x00、0x01、0x02、0x03、0x41、0x42、0x43、0x44。其它未被初始化的EEPROM

单元全部是0xff。

要注意并不是所有的编程工具都能支持此法定义的EEPROM 初始值烧入。能直接挂接

在MPLAB 环境下的Microchip 原厂或兼容的编程工具都可以支持“de”伪指令定义的EEPROM 初值烧入,但其它第三方生产的编程工具就不一定,使用前请咨询编程器的生产

厂商。

fill

fill 伪指令可以实现对程序空间连续自动填充某一特定的指令数据,被填充的可以是一个立即数(实际肯定代表某一条指令),也可以是一条形象的汇编指令。基本上在一个设计中都有一些程序空间没有写上具体的指令编码(空白处),在单片机正常运行时这些地方的指令是不会被执行到的。但在有干扰的情况下程序跑飞正好落在这些非法指令处时,就有必要设置软件陷阱捕捉这些非法跳转,让程序恢复正常运行。如果要程序员一个一个地址去分

析哪里有空的指令单元然后又用特殊指令一条一条填入,这是根本行不通的。fill 伪指令在

这时就派上用场了。

fill 0x0000, 5 ;从当前地址处连续5 个程序字填成0x0000(NOP 指令)

fill (goto $), NEXT_BLOCK-$ ;从当前地址开始到标号NEXT_BLOCK 前所有程序空间填上

;goto $ (死循环)指令

org 0x0800

NEXT_BLOCK

例3-12

请大家特别注意上例3-12 中第二行fill 伪指令的用法。在你自己的程序中也可以用同样

的方法把所有未用到的程序空间填上“goto $”这样一条死循环的指令。一旦单片机执行过

程中非法跳到这些指令处时指令运行就将被“俘获”,停在那里直到看门狗复位,然后程序

从头开始。这是软件陷阱的最基本处理方法。若填充指令“goto 0x0000”直接跳转到复位地址处可能会有问题,因为goto 指令执行时必须和PCLATH 寄存器配合(跨页跳转的问题),若PCLATH[4:3]不为00就不能跳到复位地址0x0000 处。在程序跑飞非法跳转到设定的陷阱处时你又怎能保证PCLATH 中的页面设定为正好指向第0 页?

end

end 伪指令告诉汇编编译器编译工作到此为止,end 后面所有的信息,不管正确与否,

一概不管。绝大多数情形下你的程序的最后一行应该是“end”。无论如何,end 必须出现在

程序中,不然编译器会报错,无法进行编译工作。

3.2.4 MPASM 内的直接运算符

为了使所编的程序理解更直观,维护更方便,MPASM 汇编器允许你在程序的编写过程中直接以数学表达式的形式在指令中实现一些数字运算的功能。千万不要误解成MPASM 可以替你生成数学运算的指令,那可是其它编译器(例如C 编译器)才能完成的工作。这里

讲的数字运算前提是所有参与运算的操作数全部是明明白白的立即数,如果是符号名字则必

须事先用#define 或equ 伪指令明确定义了的(如果是变量使用了这些符号则是地址运算,原先有明确的地址)。整个运算过程是由编译器在扫描你的源程序

时进行的,运算结果也只能是一个确定的立即数。我们将在这里介绍几种非常有用的运算符。

取当前指令的地址值:$

你可以在写程序时给一条指令前加上一个标号,然后直接引用该标而得到此程序字的地

址。如果你的程序经常需要用到指令的当前地址或附近的地址值,这样的标号就需要写很多

且不能重复。用“$”运算符让汇编器替你计算当前指令所处的位置将有效地减轻你的这份

工作量。见例3-12 和3-13。

;用语句标号得到指令地址

Here goto Here ;跳转到当前地址,程序进入死循环

Delay decfsz count, f ;计数器减1 并判0

goto Delay ;跳转到上一行重复循环

;用$运算符得到指令地址而无需定义任何语句标号

goto $ ;跳转到当前地址,程序进入死循环

decfsz count, f ;计数器减1 并判0

goto $-1 ;跳转到(当前地址-1)处,即上一行,重复循环

例3-13

取16位立即数的高低字节:high 和low

一个16 位的立即数在8 位单片机中必须被拆解成高8 位一个字节(高字节)和低8 位

一个字节(低字节)才能用指令一条条处理,类似的处理在对两字节变量赋立即数初值和基

于PC 相对跳转查表前设定PCLATH 寄存器时经常碰到。MPASM 提供了high 和low 两个运算符分别计算一个立即数的高字节和低字节。我们看例3-14 的代码实例:

;两字节变量赋立即数初值

#define DELAY_TIME .1000;定义一个常数立即数

movlw low(DELAY_TIME) ;取立即数的低字节值,经编译器计算将得到0xe8 movwf count ;赋给变量的低字节

movlw high(DELAY_TIME) ;取立即数的高字节值,经编译器计算将得到0x03 movwf count+1 ;赋给变量的高字节(count已用EQU命令了, 地址确定

了,count+1表示count的下一个内存地址.)

;查表前设定PCLATH 寄存器。关于PC 相对跳转的概念详见1.5.2 节

movlw high(Table) ;取查找表入口地址的高字节值

movwf PCLATH ;设定PCLATH 寄存器

movf index,w ;取查表索引值

call Table ;调用查表子程序

例3-14

加减乘除:+ - * /

实际上前面的很多代码范例中都已经说明了“+”、“-”运算符的使用方法。“*”和“/”

的运算也类似。看下面例3-15 计算异步串行通讯波特率常数的方法。

;高速异步通信波特率BPS=Fosc/(16*(X+1))

;故,波特率常数X = Fosc/(BPS*16) – 1

#define BPS .9600 ;定义工作波特率

#define Fosc .4000000 ;定义单片机工作振荡频率4MHz

;... ;其它代码

movlw Fosc/(BPS*.16) – 1 ;编译器计算得到.25(10 进制25)

movwf SPBRG ;设定波特率定时寄存器

例3-15

程序中用了统一的计算公式后,在调试时只要简单地改变前面的#define 语句定义新的

波特率或振荡频率值,然后重新编译一次程序即实现了波特率设定代码的更新,非常方便。

移位运算:>> 和<<

“>>”运算符把一个立即数算术右移若干位(高位补0),“<<”运算符把一个立即数算

术左移若干位(低位补0)。

#define xxx 0x55

movlw xxx>>1 ;W=0x2a

movlw xxx<<2 ;W=0x54

movlw 1<<7 ;W=0x80

例3-16

立即数逻辑运算:& | ^

“&”运算符把一个立即数和另外一个立即数相“与”;“|”运算符把一个立即数和另外一个立即数相“或”;“^”运算符把一个立即数和另外一个立即数相“异或”。例3-17 的代

码利用异或运算符“^”实现类似于C 语言“switch-case”功能的汇编代码指令,注意例中

的VAL1、VAL2、VAL3 等判别值都是事先已经定义的立即数而不是RAM 中的变量。

;利用异或运算实现类似于C 语言的switch-case 语句

movf switchVal, w ;取分支判断值. switch (W)

xorlw VAL1 ;W=W ^ VAL1

btfsc STATUS, Z ;判0 标志

goto Case_VAL1 ;case VAL1: (原始W=VAL1)

xorlw VAL1^VAL2 ;W=(W^VAL1)^(VAL1^VAL2) = W^VAL2

btfsc STATUS, Z ;判0 标志

goto Case_VAL2 ;case VAL2: (原始W=VAL2)

xorlw VAL2^VAL3 ;W=(W^VAL2)^(VAL2^VAL3) = W^VAL3

btfsc STATUS, Z ;判0 标志

goto Case_VAL3 ;case VAL3: (原始W=VAL3)

;... ;其它case 情况判别

例3-17

3.2.5 MPASM 的宏指令

引入宏指令的目的也是为了增强程序的可读性和易维护性。和伪指令不同的是,伪指令

所起的只是辅助性的作用,其本身不会直接产生真正的机器码;但宏指令是真正的指令,它

实际上是若干条基本汇编指令的集合。为了编程方便,MPASM 已经内含了一些非常好用的

宏指令,用户也可以自己编写任意形式的宏指令。

3.2.5.1 MPASM 内含的宏指令

MPASM 内含的宏指令就象扩充了的标准汇编指令一样,其名字已作为MPLAB 的关键

词而被保留。虽然经过编译器编译后最终将变成真正的汇编指令机器码,但某些宏指令的转

换过程还是有其独到之处。

banksel

banksel 和下面的pagesel 宏指令可以说是所有宏指令中最好用最有用的了。banksel 可

以帮助你非常方便地实现寄存器bank 的设定。你只需在banksel 后给它一个变量名或地址,

编译器会自动按照变量地址所在的bank,自动生成设定STATUS 寄存器RP1:RP0 位的指令。更聪明的是,编译器知道你所选的芯片最多有几个bank,它将用最少的指令完成bank 设定。

例如:

;芯片选择PIC16F874A,RAM 共有2 个bank

banksel TRISC ;设定TRISC 所在的bank (TRISC 在bank1)

;编译后的机器码

bsf STATUS, RP0 ;只生成1 条汇编代码

;芯片选择PIC16F877A,RAM 共有4 个bank

banksel TRISC ;设定TRISC 所在的bank (TRISC 在bank1)

;编译后的机器码

bsf STATUS, RP0 ;生成2 条汇编代码

bcf STATUS, RP1 ;

例3-18

同样的一条“banksel TRISC”指令,针对不同的芯片编译器生成的汇编代码可能不同。

两个bank 的芯片只要用到RP0 一位即可实现bank 选择,banksel 宏指令会转换成一条汇编指令;四个bank 的芯片则必须用RP1:RP0 两位一起实现bank 选择,故一条banksel 宏指令将转换成两条汇编指令。用banksel 的好处是显而易见的,你无需太多关心你准备操作的寄存器落在哪个bank 内,编译器会知道这个寄存器的实际地址,然后替你生成相关的汇编代码以正确设定bank 位;需要时你可以随意移动变量的定义地址而无需修改其它代码,只需重新编译一次即可;另外,如果你用代码可重定位方式进行软件开发时,在写指令之时根本就无法知道自己定义的变量最后会落在哪个bank 中,想自己设定具体的bank 都不行。此时,只有用banksel 宏指令让编译器连接器一起在连接定位后再“自动填入”相关的bank 位设定

指令。

bankisel

和banksel 类似,不过它对付的是用于寄存器相对寻址的STATUS 寄存器中的IRP 位。

它也会用最少的代码实现IRP 位的设定。如果是只有两个bank 的芯片,用bankisel 将不产生任何指令!在代码可重定位开发方式下,对可重定位的变量作相对寻址需要设定IRP 位时,也只能用bankisel 交由编译器连接器来替你实现。

;芯片选择PIC16F877A,RAM 共有4 个bank

cblock 0x120

buffer:8 ;从地址0x120 起定义8 字节的数据区

endc

bankisel buffer ;用bankisel 自动设定IRP 位

movlw low(buffer) ;取buffer 的地址(只有低8 位)

movwf FSR ;送给FSR

;编译后的机器码

bsf STATUS, 7 ;真正的设定IRP 的汇编代码

movlw 0x20

movwf FSR

例3-19

pagesel

pagesel 可以帮助你设定程序的页面。使用方式和banksel 相似,只是它改变的是PCLATH[4:3]两位。该宏指令也同样将用最少的代码实现程序页面设定:程序空间不超过2K 字(只有1 页)的将不产生任何汇编代码;程序空间不超过4K 字(最多2 页)的芯片将只生成一条设定PCLATH[3]的汇编代码;只有超过4K 字(最多4 页)的芯片才会生成两条代码。同样,pagesel 在代码可重定位的开发模式下也是不可或缺的。

;芯片选择PIC16F877A,RAM 共有4 个页面

org 0x0100 ;在第0 页内

main pagesel sub1 ;用宏指令设定被调用子程序的页面

call sub1 ;随后调用该子程序

pagesel $ ;用宏指令设定当前地址的页面

goto main ;循环

org 0x0800 ;第1 页起始

sub1 return ;子程序返回

;编译后的机器码(main 部分)

main bsf PCLATH, 3 ;设定sub1 所在的页面

bcf PCLATH, 4

call sub1

bcf PCLATH, 3 ;设定当前指令所在的页面

bcf PCLATH, 4

goto main

例3-20

clrc/setc

clrc/setc 针对的是状态寄存器STATUS 中的进位标志位。

clrc 等同于bcf STATUS, C ;C=0

setc 等同于bsf STATUS, C ;C=1

clrz/setz

clrz/setz 针对的是状态寄存器STATUS 中的零标志位。

clrz 等同于bcf STATUS, Z ;Z=0

setz 等同于bsf STATUS, Z ;Z=1

clrdc/setdc

clrdc/setdc 针对的是状态寄存器STATUS 中的半字节进位标志位。

clrdc 等同于bcf STATUS, DC ;DC=0

setdc 等同于bsf STATUS, DC ;DC=1

skpc/skpnc

skpc/skpnc 是判状态寄存器STATUS 中的进位标志位,若条件满足则程序跳过下一条指

令。

skpc 等同于btfss STATUS, C ;若C=1 则程序跳过下一条指令

skpnc 等同于btfsc STATUS, C ;若C=0 则程序跳过下一条指令

skpz/skpnz

skpz/skpnz 是判状态寄存器STATUS 中的零标志位,若条件满足则程序跳过下一条指令。

skpz 等同于btfss STATUS, Z ;若Z=1 则程序跳过下一条指令

skpnz 等同于btfsc STATUS, Z ;若Z=0 则程序跳过下一条指令

skpdc/skpndc

skpdc/skpndc 是判状态寄存器STATUS 中的半字节进位标志位,若条件满足则程序跳过

下一条指令。

skpdc 等同于btfss STATUS, DC ;若DC=1 则程序跳过下一条指令

skpndc 等同于btfsc STATUS, DC ;若DC=0 则程序跳过下一条指令

bc/bnc

bc/bnc 宏指令的作用有点象51 单片机的“jc/jnc”指令。它判别状态寄存器STATUS 中的进位标志位,按进位标志实现程序的分支跳转。如例3-21。

movlw 0x31 ;W=0x31

addwf sum,f ;sum = sum+W

bc Carry1 ;如果发生进位就跳转到Carry1 处执行

nop ;如果没有进位则继续执行bc 的下一条指令

;...

Carry1 nop

bc XXX ;如果C=1 就跳转到标号XXX,否则程序执行bc 的下一条

等同于

btfsc STATUS,C

goto XXX

bnc YYY ;如果C=0 就跳转到标号YYY,否则程序执行bnc 的下一条

等同于

btfss STATUS,C

goto YYY

例3-21

请不要被bc/bnc 这样“一条”指令所迷惑,它实际上是由两条汇编指令组成,且用到了“goto”实现跳转,故在用此宏指令前注意页面的设定。

bz/bnz

同bc/bnc 一样,只不过判别的是状态寄存器STATUS 中的零标志位。

movlw 0x55 ;W=0x55

xorwf flag,w ;flag = 0x55 ?

bz Match ;Z=1, flag=0x55, 跳转到Match 处执行

nop ;Z=0,继续执行bz 的下一条指令

;...

Match nop

bz XXX ;如果Z=1 就跳转到标号XXX,否则程序执行bz 的下一条

等同于

btfsc STATUS,Z

goto XXX

bnz YYY ;如果Z=0 就跳转到标号YYY,否则程序执行bnz 的下一条

等同于

btfss STATUS,Z

goto YYY

例3-22

bdc/bndc

同上,判别的是状态寄存器STATUS 中的半字节进位标志位。

bdc XXX ;如果DC=1 就跳转到标号XXX,否则程序执行bdc 的下一条

等同于

btfsc STATUS,DC

goto XXX

bndc YYY ;如果DC=0 就跳转到标号YYY,否则程序执行bndc 的下一条

等同于

btfss STATUS,DC

goto YYY

例3-23

3.2.5.2 用户自定义宏

除了MPASM 内带的宏指令外,按实际开发的需要和个人的习惯,程序员可以自己定义

任意形式的宏指令。大量使用定义合理的宏指令可以使程序的可读性大大提高,也更容易移

植。

自己定义宏指令时须遵循一些语法规则。宏指令的定义由“宏指令名“开始,后跟关键

词“macro”,其后可以带若干宏参数,也可以不跟任何宏参数;然后从下一行起开始写基本

的汇编指令或已被认可的其它宏指令(宏嵌套);指令可以是任意多行,最后以关键词“endm”

结束整个宏定义,例如:

;定义宏指令实现一个字(两字节数)加1 的功能

IncWord macro wordVal ;IncWord 是宏指令名,wordVal 是宏参数

;下面为宏的实体(实际的汇编指令)

incf wordVal,f ;对字的低字节加1,如果结果为0 则为字节计数溢出

skpnz ;如果没有溢出(上面指令结果不为0)就跳过下一条指令

incf wordVal+1,f ;若低字节加1 后溢出,则字的高字节加1

endm ;结束宏指令定义

;程序中对宏指令的引用

cblock 0x20

counter:2 ;定义一个两字节的字变量

endc

Loop

IncWord counter ;用宏指令实现变量counter 每次循环加1 ;编译器会把这“一条”宏指令展开成原定义的3 条汇编指令

;并用实际的counter 符号替换宏参数wordVal

goto Loop ;跳转重复循环。注意一条宏指令展开后可能是多条汇编指令

;故此处用“$-?”时要特别小心。

例3-24

使用宏指令时几个问题需要注意。

㈠宏指令不同于子程序调

用指令。编译器在编译你的代码

时会用原宏定义中的若干条汇

编指令代替程序中的“一条”宏

指令插入到此宏指令位置处(图

3-15)。若程序中有很多地方用

了同样的宏指令,那么相同的汇

编指令集也会被复制成同样多

份,它不能节省代码长度。而子

程序调用只有一条指令,若一个

子程序在程序中被多处调用,增加的只是调用指令“call”而子程序只有一个,它可以减少

代码长度。宏指令最有用的是集成少量且非常相关的代码实现一个特定任务,例如3-24 中

的字变量加1 这样的功能。你可以安自己的习惯和项目的需要设计这样的宏指令,甚至可以建一个宏指令库头文件,以后程序开发时直接用#include包含进你的程序即可使用。

㈡虽然宏指令定义中允许使用语句标号以便给“goto”指令引用,但最好不要这样做。

因为若此宏指令将被多处使用的话,相同的宏定义会被重复复制,其中的语句标号也会一样

复制,这就使得程序有“标号重复定义”的语法错误而无法成功编译。所以在宏指令中需要用goto 指令跳转时尽量使用“$”配合“+”、“-”运算,例如:“goto $-3”、“goto $+2”等

等;或者使用宏参数给goto 指令一个特定的语句标号。例如3-25 的宏定义:

;定义宏指令实现寄存器和立即数比较大小

;若寄存器值>=立即数则程序跳到某一位置

FL_JGE macro fileReg, litVal, jumpTo

;fileReg 为寄存器,litVal 为立即数,jumpTo 为跳转的语句标号

movlw litVal &

0xff

;把立即数送给W (确保0x00~0xff)

subwf fileReg, w ;计算寄存器-W

skpnc ;若C=0 即,寄存器值

goto jumpTo ;若寄存器值>=W,则跳到指定标号处继续运行

源程序编译后的lst 列表文件(局部)

图3-15

endm ;结束宏指令定义

;程序中对宏指令的引用

val1 equ 0x20 ;定义一个寄存器变量

;使用宏指令

FL_JGE val1, .100, Val1_Over

;变量val1 和立即数100 比较,

;如果val1>=100 则程序跳到Val1_Over 处运行

nop ;若val1<.100,则程序执行这条语句

;... ;其它代码

Val1_Over nop ;若val1>=.100,则程序将跳到这里继续运行

例3-25

㈢程序仿真调试时对用户自定义的宏指令和MPASM 自己提供的内部宏指令支持度不

尽相同。在用户自定义的宏指令处无法设置断点,但MPASM 自己提供的内部宏指令没有此限制;在程序单步运行时用户自定义的宏指令无法“一步”执行完毕,调试器会单步跟踪进入宏定义体一步一步执行,MPASM 内部宏指令可以“一步”执行完毕。

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移;

伪指令

A51汇编解释---伪指令 2011-05-11 17:51:46| 分类:默认分类| 标签: |举报 |字号大 中 小订阅 一:定义符号的伪指令 1)SEGMENT 格式: 段名符号 SEGMENT 段类型 [再定位类型] SEGMENT指令可声明一个可再定位(区别于CSEG,DSEG,XSEG,BSEG,ISEG等定义的在相对应的空间固定地址定义的绝对段—在连接的过程中不允许重新定位)的段符号和一个可选的再定位类型,段符号可以用来定义段,L51连接器可将多个模块内的具有相同段名和再定位类型的几个段合成为一个段.段类型说明了段所处的地址空间. 如果是编写的汇编程序要与C源程序接口,即被C源程序调用,则全部的汇编子程序所命名的定义的代码段的段名必须是可用SEGMENT来定义的,而且名字的命名的方法也应该参照C51编译器产生的局部段的段名的转换规则.段名的作用主要是在汇编的时候用RSEG来激活的,在连接定位的时候用到的.与段名相应的是用于存储和传递参数的别名,可以在汇编源程序中直接应用局部段的别名,这个别名主要是在传递函数参数的时候用的.在汇编程序中要用PUBLIC 声明被其他模块引用的全局符号. DATA (可直接寻址的内部RAM空间) IDATA (可间接寻址的内部RAM空间) XDATA (外部数据存储空间) BIT (内部RAM低地址区的可位寻址的空间) CODE (程序存储器空间) 可选的再定位类型定义了L51连接时的定位方式,再定位类型: UNIT:定义一个可开始于任一单元的段对于BIT型的段,一个单元是一个位, 其它所有的段一个单元是一个字节. PAGE:定义一个起始地址必须是256的整数倍的段,段的绝对地址由L51自己计算,该类型只允许用于XDATA和CODE类型段. INPAGE:定义一个由L51连接后必须包含在256B的块中,只适用于XDATA和CODE段. INBLOCK:定义一个L51连接后必须包含在2KB中的段,只适用于CODE段. OVERLAYABLE:定义一个可与其他段交叠的覆盖段,其段名符号必须按C51或者PL/M51的规则命名.C51把局部数据段和局部位段定义成?DT?FUNCTIONNAME?MODULENAME 和?BI?FUNCTIONNAME?MODULENAME这是在small模式下.其他的模式略有不同。BITADDRESSABLE:定义一个L51连接后位于可位寻址的区,段长不能超过16B. 2) EQU 格式: 符号名 EQU 表达式 符号名 EQU 寄存器名 EQU伪指令定义一表示数值或寄存器的符号,该符号可用于表达式或助记符指令的操作数,EQU指令定义的符号不能被改变或重新定义,其段类型取决于表达式中的操作数类型类型,无类型的EQU符号可用于任何表达式中. LIMIT EQU 200 VALUE EQU LIMIT-100+’A’

单片机汇编指令大全

单片机汇编指令一览表 作者:乡下人 助记符指令说明字节数周期数 (数据传递类指令) MOV A,Rn 寄存器传送到累加器 1 1 MOV A,direct 直接地址传送到累加器 2 1 MOV A,@Ri 累加器传送到外部RAM(8 地址) 1 1 MOV A,#data 立即数传送到累加器 2 1 MOV Rn,A 累加器传送到寄存器 1 1 MOV Rn,direct 直接地址传送到寄存器 2 2 MOV Rn,#data 累加器传送到直接地址 2 1 MOV direct,Rn 寄存器传送到直接地址 2 1 MOV direct,direct 直接地址传送到直接地址 3 2 MOV direct,A 累加器传送到直接地址 2 1 MOV direct,@Ri 间接RAM 传送到直接地址 2 2 MOV direct,#data 立即数传送到直接地址 3 2 MOV @Ri,A 直接地址传送到直接地址 1 2 MOV @Ri,direct 直接地址传送到间接RAM 2 1 MOV @Ri,#data 立即数传送到间接RAM 2 2 MOV DPTR,#data16 16 位常数加载到数据指针 3 1 MOVC A,@A+DPTR 代码字节传送到累加器 1 2 MOVC A,@A+PC 代码字节传送到累加器 1 2 MOVX A,@Ri 外部RAM(8 地址)传送到累加器 1 2 MOVX A,@DPTR 外部RAM(16 地址)传送到累加器 1 2 MOVX @Ri,A 累加器传送到外部RAM(8 地址) 1 2 MOVX @DPTR,A 累加器传送到外部RAM(16 地址) 1 2 PUSH direct 直接地址压入堆栈 2 2 POP direct 直接地址弹出堆栈 2 2 XCH A,Rn 寄存器和累加器交换 1 1 XCH A, direct 直接地址和累加器交换 2 1 XCH A, @Ri 间接RAM 和累加器交换 1 1 XCHD A, @Ri 间接RAM 和累加器交换低4 位字节 1 1 (算术运算类指令) INC A 累加器加1 1 1 INC Rn 寄存器加1 1 1 INC direct 直接地址加1 2 1 INC @Ri 间接RAM 加1 1 1 INC DPTR 数据指针加1 1 2 DEC A 累加器减1 1 1 DEC Rn 寄存器减1 1 1 DEC direct 直接地址减1 2 2

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

PIC16系列_单片机常用伪指令(汇编)

PIC 单片机端口电平变化中断使用必须注意的问题 PICC18使用说明 PIC 单片机常用伪指令 PIC单片机2009-02-19 11:16:40 阅读8 评论0 字号:大中小订阅 3.2.3 MPASM 的伪指令 我们在第一章中已经详细介绍了中档PIC 单片机的35 条指令,源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不亚于35 条正真的汇编指令。我们在此着重介绍最常用的几种 伪指令。 #include 或include #include 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。 被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM 能够识别的。最经常被“include”的是针对PIC 单片机内部特殊功能寄存器定义的包含头文件,在MPLAB 安装后它们全部放在路径“ C:\Program Files\MPLAB IDE\MCHIP_Tools”下,每一个型号的PIC 单片机都有一个对应的预定义包含头文件,扩展名是“.inc”。除了一些符号预定义文件,你也可以把现有的其它程序文件作为一个代码模块直接“包含”进来作为自己程序的一部分。见例3-01。 #include ;把预定义的PIC16F877A 寄存器符号包含到此处 #include ”math.asm” ;把现有的程序文件包含进来作为自己代码的一部分 例3-01 请注意被包含文件的引用方式。一种是<>尖括号引用,这种引用意味着让编译器去默认的路径下寻找该文件,MPASM 默认的寄存器预定义文件存放路径即为上面提及的MPLAB 安装后的目录;另一种是””双引号引用,这种引用方式的意思是指示编译器从引号中指定的全程文件路径下寻找该文件。例3-01 中”math.asm”没有指定路径,即意味着在当前项目路径下寻找math.asm 文件。如果编译器找不到被包含的文件,将会有错误信息告 知。 请在你的源程序中尽量用MPLAB 标准头文件定义的寄存器符号。一来这些被定义的寄存器符号和芯片数据手册上的描述一一对应,理解起来即直观又容易;二来如果用你自己定义符号就缺乏一个大家能一起交流的标准平台,其他人要解读你的代码时将费时费力。故例3-01 中的首行#include 包含引用伪指令可以说是PIC 单片机程序编写时的标准必备。

PIC单片机汇编语言基础

PIC单片机汇编语言基础 1、程序的基本格式 先介绍二条伪指令: EQU ——标号赋值伪指令 ORG ——地址定义伪指令 PIC16C5X在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为: PIC16C54/55:1FFH PIC16C56:3FFH PIC16C57/58:7FFH 一般来说,PIC的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。 TITLE This is …… ;程序标题 ;-------------------------------------- ;名称定义和变量定义 ;-------------------------------------- F0 EQU 0 RTCC EQU 1 PC EQU 2 STATUS EQU 3 FSR EQU 4

RA EQU 5 RB EQU 6 RC EQU 7 ┋ PIC16C54 EQU 1FFH ;芯片复位地址 PIC16C56 EQU 3FFH PIC16C57 EQU 7FFH ;----------------------------------------- ORG PIC16C54 GOTO MAIN ;在复位地址处转入主程序ORG 0 ;在0000H开始存放程序 ;----------------------------------------- ;子程序区 ;----------------------------------------- DELAY MOVLW 255 ┋ RETLW 0 ;------------------------------------------ ;主程序区 ;------------------------------------------ MAIN MOVLW B‘00000000’ TRIS RB ;RB已由伪指令定义为6,即B

单片机伪指令和指令详解

ASM-51汇编伪指令 一、伪指令分类 1.符号定义 SEGMENT, EQU, SET, DATA, IDATA, XDATA, BIT, CODE 2.存储器初始化/保留 DS, DB, DW, DBIT 3.程序链接 PUBILC, EXTRN, NAME 4.汇编程序状态控制 ORG, END 5.选择段的伪指令 RSEG, CSEG, DSEG, XSEG, ISEG, BSEG, USING 二、伪指令具体说明 1.符号定义伪指令 1)SEGMENT伪指令 格式:段名SEGMENT 段类型 说明:SEGMENT 伪指令说明一个段。段就是一块程序代码或数据存储器。允许使用的段类型为: ●CODE代码空间 ●DATA 可以直接寻址的内部数据空间 ●XDATA外部数据空间 ●IDATA可以间接寻址的整个内部数据空间 ●BIT位空间 例子:(段符号用于表达式时,代表被连接段的基地址) STACK SEGMENT IDATA RSEG STACK DS 10H ;保留16字节做堆栈 MOV SP , #STACK-1 ;堆栈指针初始化

2)EQU伪指令 格式:符号名 EQU 表达式 符号名 EQU 特殊汇编符号 说明:EQU表示把一个数值或特殊汇编符号赋予规定的名字。 一个表达式赋予一个符号,必须是不带向前访问的表达式。 例子:N27 EQU 27; ACCUM EQU A ;定义ACCUM代替特殊汇编符号A(累加器) HERE EQU $; HERE为当前位置计数器的值 3)SET伪指令 格式:符号名 SET 表达式 符号名 SET 特殊汇编符号 说明:SET类似EQU,区别在于可以用另一个SET伪指令在以后对定义过的符号重新定义。 例子:COUNT SET 0 COUNT SET COUNT+1 4)BIT伪指令 格式:符号名 BIT 位地址 说明: BIT伪指令把一个地址赋予规定的符号名。该符号类型取段类型BIT. 例子: RSEG DATA_SEG; CONTROL: DS 1 ALATM BIT CONTROL.0; OPEN_BOARD BIT ALATM+1 ;下一位 RESET_BOARD BIT 60H ;下一个绝对的位 5)DATA伪指令 格式:符号名 DATA 表达式 说明:DATA伪指令把片内的数据地址赋予所规定的符号名。符号段类型为DATA. 例子:CONIN DATA SBUF;定义CONIN 到串行口缓冲器的地址

(完整版)51单片机汇编指令(全)

指令中常用符号说明 Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7) Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1) Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址 #data表示8位常数(立即数) #data16表示16位常数 Add16表示16位地址 Addr11表示11位地址 Rel8位代符号的地址偏移量 Bit表示位地址 @间接寻址寄存器或基址寄存器的前缀 ( )表示括号中单元的内容 (( ))表示间接寻址的内容 指令系统 数据传送指令(8个助记符) 助记符中英文注释 MOV Move 移动 MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器A MOV A , Direct;(direct)→A,直接地址的内容送A MOV A ,@ Ri;(Ri)→A,RI间址的内容送A MOV A , #data;data→A,立即数送A MOV Rn , A;A→Rn,累加器A的内容送寄存器Rn MOV Rn ,direct;(direct)→Rn,直接地址中的内容送Rn MOV Rn , #data;data→Rn,立即数送Rn MOV direct , A;A→(direct),累加器A中的内容送直接地址中 MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址 MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址 MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址 MOV direct , #data;8位立即数送到直接地址中 MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中 MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中 MOV @Ri , #data; data→@Ri ,8位立即数送到间址中 MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令) (MOV类指令共16条)

IC8位单片机汇编语言常用指令的识读

PIC单片机指令集简介 PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。 一、PIC汇编语言指令格式 PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下: 标号操作码助记符操作数1,操作数2;注释 指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。 1与MCS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。 书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。 2该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。 3由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。在这里PIC 8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。 指令的操作数项也是可选项。 PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。 4用来对程序作些说明,便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。 二、清零指令(共4条) 1 实例:CLRW;寄存器W被清零 说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。 2 实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)

51单片机汇编指令及伪指令小结

51单片机汇编指令小结

二、算术运算类指令

四、控制转移类指令类

五、位操作类指令 逻辑操作与字节中的一致

51汇编常用伪指令 https://www.docsj.com/doc/2c10053634.html, 16位地址:此指令用在原程序或数据块的开始,指明此语句后面目标程序或数据块存放的起始地址; 2.【标号】DB 字节数据项表:奖项表中的字节数据存放到从标号开始的连续字节单元中。例如:SEG:DB 88H,100,``7" , ``C"; 3.【标号】DW 双字节数据项表:定义16位地址表,16地址按低位地址存低位字节,高位地址存高位字节。例如:TAB:DW 1234H, 7BH 名字EQU 表达式或名字=表达式:用于给一个表达式赋值或给字符串起名字。之后名字可用作程序地址,数据地址或立即数地址使用。名字必须是一字母开头的字母数据串。例如:COUNT=10或SPACE EQU 10H 5.名字DATA 直接字节地址:给8位内部或外部RAM单元起个名字,名字必须是一字母开头的字母数据串。同一单元可起多个名字。例如:ERROR DATA 80H 6.XDATA直接字节地址:给8位外部RAM起个名字,名字规定同DATA伪指令。例如:IO_POTR XDATA OCF04H 7.名字Bit 指令:给一位可寻址的位单元起个名字,规定同DATA伪指令。例如:SWT BIT 30H 8.【标号】END:指出源程序到此结束,汇编对其后的程序语句不予理睬。源程序只在主程序最后使用一个END。 注:DATA和EQU的区别在于用DATA定义的字符名称作为标号登记在符号表中,故可先使用后定义;而用EQU定义的字符名称必须先定义后使用,其原因是EQU不定义在符号表中。

51单片机汇编指令集(附记忆方法)

51 单片机汇编指令集 一、数据传送类指令( 7 种助记符) MOV(英文为Move :对内部数据寄存器RAM 和特殊功能寄存器SFR 的数据进行 传送; MOV Q Move Code )读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部 RAM 勺数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令( 8 种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加 1; DEC(Decrement) 减 1; MUL(Multiplication 、Multiply) 乘法; DIV(Division 、Divide) 除法; 三、逻辑运算类指令( 10 种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) SWAP (Swap) 低 4 位与高 4 位交换; 四、控制转移类指令( 17 种助记符) ACALL ( Absolute subroutine Call )子程序绝对调用; LCALL ( Long subroutine Call )子程序长调用; RET ( Return from subroutine )子程序返回; RETI ( Return from Interruption )中断返回; SJMP ( Short Jump )短转移; AJMP ( Absolute Jump )绝对转移; LJMP( Long Jump )长转移; CJNE (Compare Jump if Not Equal) 比较不相等则转移; DJNZ (Decreme nt Jump if Not Zero) 减1后不为0则转移; JZ (Jump if Zero) 结果为0则转移; JNZ (Jump if Not Zero) 结果不为0则转移; JC (Jump if the Carry flag is set) 有进位则转移; JNC (Jump if Not Carry) 无进位则转移; JB (Jump if the Bit is set) 位为1则转移; JNB (Jump if the Bit is Not set) 位为0则转移; 带进位循环左移; 带进位循环右移;

PIC8位单片机汇编语言常用指令的识读

PIC8位单片机汇编语言常用指令的识读(上) 各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。 PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC 系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。 在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。 一、PIC汇编语言指令格式 PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下: 标号操作码助记符操作数1,操作数2;注释 指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。 1 标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。 书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。 2 操作码助记符该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。 3 操作数由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。在这里PIC 8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。 指令的操作数项也是可选项。 PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。 4 注释用来对程序作些说明,便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。 二、清零指令(共4条) 1 寄存器清零指令 实例:CLRW;寄存器W被清零 说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。 2 看门狗定时器清零指令。 实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)

单片机汇编语言程序编程规范

引言 软件设计更多地是一种工程,而不是一种个人艺术。如果不统一编程规范,最终写出的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。 分析表明,编码阶段产生的错误当中,语法错误大概占20%左右,而由于未严格检查软件逻辑导致的错误、函数(模块)之间接口错误及由于代码可理解度低导致优化维护阶段对代码的错误修改引起的错误则占了一半以上。 可见,提高软件质量必须降低编码阶段的错误率。如何有效降低编码阶段的错误呢?这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时也降低了程序的测试费用,效果相当显著。 本文从代码的可维护性(可读性、可理解性、可修改性)、代码逻辑与效率、函数(模块)接口、可测试性四个方面阐述了软件编程规范,规范分成规则和建议两种,其中规则部分为强制执行项目,而建议部分则不作强制,可根据习惯取舍。 1.排版 规则1 程序块使用缩进方式,函数和标号使用空格缩进,程序段混合使用TAB和空格缩进。缩进的目的是使程序结构清晰,便于阅读和理解。 默认宽度应为8个空格,由于Word中为4个空格,为示范清晰,此处用2个代替(下同)。例如: MOV R1, #00H MOV R2, #00H MOV PMR, #PMRNORMAL MOV DPS, #FLAGDPTR MOV DPTR, #ADDREEPROM read1kloop: read1kpage: INC R1 MOVX A, @DPTR MOV SBUF, A JNB TI, $ CLR TI INC DPTR CJNE R1, #20H, read1kpage INC R2 MOV R1, #00H CPL WDI CJNE R2, #20H, read1kloop ;END OF EEPROM 规则2

常用51单片机汇编指令

常用单片机汇编指令: 1 .MOV A,Rn寄存器内容送入累加器 2 .MOV A,direct 直接地址单元中的数据送入累加器 3 .MOV A,@Ri (i=0,1) 间接RAM中的数据送入累加器 4 .MOV A,#data 立即数送入累加器 5 .MOV Rn,A累加器内容送入寄存器 6 .MOV Rn,direct 直接地址单元中的数据送入寄存器 7 .MOV Rn,#data 立即数送入寄存器 8 .MOV direct,A 累加器内容送入直接地址单元 9 .MOV direct,Rn 寄存器内容送入直接地址单元 10. MOV direct,direct 直接地址单元中的数据送入另一个 直接地址单元 11 .MOV direct,@Ri (i=0,1) 间接RAM中的数据送入直接地址单元 12 MOV direct,#data 立即数送入直接地址单元 13 .MOV @Ri,A (i=0,1) 累加器内容送间接RAM单元 14 .MOV@Ri,direct (i=0,1)直接地址单元数据送入间接RAM 单元 15 .MOV @Ri,#data (i=0,1) 立即数送入间接RAM单元 16 .MOV DPTR,#data16 16 位立即数送入地址寄存器 17 .MOVC A,@A+DPTR以DPTR^基地址变址寻址单元中的数 据送入累加器

18 .MOVC A,@A+PC以PC为基地址变址寻址单元中的数据送入累加器 19 .MOVX A,@Ri (i=0,1) 外部RAM(8位地址)送入累加器 20 .MOVX A,@DPTR外部RAM(16位地址)送入累加器 21 .MOVX @Ri,A (i=0,1) 累计器送外部RAM(8位地址) 22 .MOVX @DPTR,A累计器送外部RAM( 16位地址) 23 .PUSH direct 直接地址单元中的数据压入堆栈 24 .POP direct 弹栈送直接地址单元 25 .XCH A,Rn 寄存器与累加器交换 26 .XCH A,direct 直接地址单元与累加器交换 27 .XCH A,@Ri (i=0,1) 间接RAM与累加器交换 28 .XCHD A,@Ri (i=0,1) 间接RAM的低半字节与累加器交换算术操作类指令: 1. ADD A,Rn 寄存器内容加到累加器 2 .ADD A,direct 直接地址单元的内容加到累加器 3 A.DD A,@Ri (i=0,1) 间接ROM的内容加到累加器 4 .ADD A,#data 立即数加到累加器 5 .ADDC A,Rn寄存器内容带进位加到累加器 6 .ADDC A,direct 直接地址单元的内容带进位加到累加器 7 .ADDC A,@Ri(i=0,1) 间接ROM的内容带进位加到累加器 8 .ADDC A,#data 立即数带进位加到累加器

单片机汇编语言伪指令

单片机汇编语言伪指令 1.BIT---用于汇编程序的一开始创建一个常量. FLASH_COUNT BIT3EH;创建一个名为FLASH_COUNT的常量,并把立即数3EH赋给这个常量,在程序中就可以直接把FLASH_COUNT等同于立即数3EH进行操作. 2.DATA---定义一个指向特殊功能寄存器区地址的变量. DPTRSW DATA0A2H;DPTRSW指向特殊功能寄存器0A2H地址上. 3.DB---用于汇编程序中定义若干个长度为1个字节的字,这若干个字使用逗号分隔开,如果逗号之间没有数据,汇编器默认为00H. DB10H,11H,,3FH,20H;在目标文件中生成10H,11H,00H,3FH,20H 4.DS---用于保留一块存储器空间给程序变量使用或别的用途. STORAGE DS10;保留一块名叫"STORAGE"的10字节存储空间 5.DW---定义若干个长度为两个字节的字,这若干个字使用逗号分隔开,如果逗号之间没有数据,汇编器默认为0000H. DW0FFFEH,,0102H;在目标文件中生成代码:FFH,FEH,00H,00H,01H,02H 6.END---该伪指令告诉汇编器程序的结束点. 7.EQU---定义某一个符号的值,一旦一个符号被定义后,就不能被另一个EQU或SET指令重复定义. BEEP_COUNT EQU1+1;表达式把2定义给符号BEEP_COUNT 8.IF、ELSE、ENDIF---这3个伪指令是条件选择语句,它们告诉汇编器根据表达式的值,是否汇编某一块程序,没有汇编的块在目标文件中是不存在对应的执行代码的. IF P1.0;如果P1.0=1,就汇编下一行 ELSE01H,02H,03H;在存储器中定义字01H、02H、03H ENDIF;条件选择结束,如果P1.0≠1,上一行不被汇编. 9.INCL---该指令用于在汇编时把其他文件与当前文件结合在一起汇编. INCL"const.def";即把文件"const.def"与当前文件结合在一起汇编. https://www.docsj.com/doc/2c10053634.html,---该伪指令用于设置程序计数器PC的初始值. ORG0000H;指令的执行代码在单片机的程序存储器中从0000H开始存储(也可简单写成00H). 11.SET---该伪指令类似EQU,但不同的是SET可以通过另一个SET伪指令重复定义变量的值. COUNT SET3 COUNT SET1;最终COUNT=1

51单片机汇编指令集

1)数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; (2)算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; (3)逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; (4)控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移; DJNZ (Decrement Jump if Not Zero)减1后不为0则转移; JZ (Jump if Zero)结果为0则转移; JNZ (Jump if Not Zero) 结果不为0则转移;

C51单片机汇编语言指令集

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 逻辑运算指令 ANL A,Rn 1 1 将累加器的值与寄存器的值做AND的逻 辑判断,结果存回累加器 ANL A,direct 2 1 将累加器的值与直接地址的内容做AND 的逻辑判断,结果存回累加器 ANL A,@Ri 1 1 将累加器的值与间接地址的内容做AND 的逻辑判断,结果存回累加器 ANL A,#data 2 1 将累加器的值与常数做AND的逻辑判 断,结果存回累加器 ANL direct,A 2 1 将直接地址的内容与累加器的值做AND 的逻辑判断,结果存回该直接地址 ANL direct,#data 3 2 将直接地址的内容与常数值做AND 的逻辑判断,结果存回该直接地址ORL A,Rn 1 1 将累加器的值与寄存器的值做OR的逻 辑判断,结果存回累加器 32.ORL A,direct 2 1 将累加器的值与直接地址的内容做OR 的逻辑判断,结果存回累加器33.ORL 1 1 将累加器的值与间接地址的内容做OR

相关文档
相关文档 最新文档