文档视界 最新最全的文档下载
当前位置:文档视界 › (整理)51汇编伪指令详解.

(整理)51汇编伪指令详解.

(整理)51汇编伪指令详解.
(整理)51汇编伪指令详解.

51汇编伪指令

伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令。许多伪指令要求带参数,这在定义伪指令时由“表达式”域指出,任何数值与表达式匀可以作为参数。不同汇编程序允许的伪指令并不相同,以下所述的伪指令仅适用于MASM51系统,但一些基本的伪指令在大部份汇编程序中都能使用,当使用其它的汇编程序版本时,只要注意一下它们之间的区别就可以了。

MASM51中可用的伪指令有:

ORG 设置程序起始地址

END 标志源代码结束

EQU 定义常数

SET 定义整型数

DATA 给字节类型符号定值

BYTE 给字节类型符号定值

WROD 给字类型符号定值

BIT 给位地址取名

ALTNAME 用自定义名取代保留字

DB 给一块连续的存储区装载字节型数据

DW 给一块连续的存储区装载字型数据

DS 预留一个连续的存储区或装入指定字节。

INCLUDE 将一个源文件插入程序中

TITLE 列表文件中加入标题行

NOLIST 汇编时不产生列表文件

NOCODE 条件汇编时,条件为假的不产生清单

一、ORG

伪指令ORG用于为在它之后的程序设置地址值,它有一个参数,其格式为:

ORG 表达式

表达式可以是一个具体的数值,也可以包含变量名,如果包含变量名,则必须保证,当第一次遇到这条伪指令时,其中的变量必须已有定义(已有具体的数值),否则,无定义的值将由0替换,这将会造成错误。在列表文件中,由ORG定义的指令地址会被打印出来。

ORG指令有什么用途呢?指令被翻译成机器码后,将被存入系统的ROM中,一般情况下,机器码总是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必须被放在0003H,000BH,0013H,001BH和0023H的位置,否则就会出错,如果我们编程时不作特殊处理,让机器代码一个接一个地生成,不能保证这些代码正好处于这些规定的位置,执行就会出错,这时就要用到ORG伪指令了。看如下例子:

例:

INT_0 EQU 1000H

TIME_0 EQU 1010H

INT_1 EQU 1020H

TIME_1 EQU 1030H

SERIAL EQU 1040H

AJMP START ;跳转到主程序起始点

LJMP INT_0 ;外中断0处理程序

LJMP TIME_0 ;定时中断0处理程序

LJMP INT_1 ;外中断1处理程序

LJMP TIME_1 ;定时中断1处理程序

LJMP SERIAL ;串行口中断程序

START:

NOP

END

上面的程序经汇编后列表文件如下:

The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 1 08-26-96

1000 = INT_0 EQU 1000H

1010 = TIME_0 EQU 1010H

1020 = INT_1 EQU 1020H

1030 = TIME_1 EQU 1030H

1040 = SERIAL EQU 1040H

0000 0111 AJMP START ;跳转到主程序起始点

0002 021000 LJMP INT_0 ;外中断0处理程序

0005 021010 LJMP TIME_0 ;定时中断0处理程序

0008 021020 LJMP INT_1 ;外中断1处理程序

000B 021030 LJMP TIME_1 ;定时中断1处理程序

000E 021040 LJMP SERIAL ;串行口中断程序

START:

0011 00 NOP

0000 END

The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 2

08-26-96

;%T Symbol Name Type Value

INT_0 . . . . . . . . . . . . . I 1000

INT_1 . . . . . . . . . . . . . I 1020

SERIAL. . . . . . . . . . . . . I 1040

START . . . . . . . . . . . . . L 0011

TIME_0. . . . . . . . . . . . . I 1010

TIME_1. . . . . . . . . . . . . I 1030

;%Z

00 Errors (0000)

由列表文件,可以绘出代码在ROM中的映象图如下:

由上面的映象图可知,在03H处的代码为10H,而不是我们要的02H,所以外断程序INT_0不能被正确执行,其它各中断程序的情况同样如此,如在0BH处,

本来存放的应当是定时器0中断程序,但按上述的映象图,0BH处开始的3个代码是:02H,10H,30H,这是定时器1的入口地址,所以,如果定时器0发生中断,所执行的其实是定时器1的中断程序,这当然不对。

例2:

INT_0 EQU 1000H

TIME_0 EQU 1010H

INT_1 EQU 1020H

TIME_1 EQU 1030H

SERIAL EQU 1040H

AJMP START ;跳转到主程序起始点

ORG 0003H

LJMP INT_0 ;外中断0处理程序

ORG 000BH

LJMP TIME_0 ;定时中断0处理程序

ORG 0013H

LJMP INT_1 ;外中断1处理程序

ORG 001BH

LJMP TIME_1 ;定时中断1处理程序

ORG 0023H

LJMP SERIAL ;串行口中断程序

START:

NOP

END

上面的程序经过汇编后列表文件如下:

The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 1 08-26-96

1000 = INT_0 EQU 1000H

1010 = TIME_0 EQU 1010H

1020 = INT_1 EQU 1020H

1030 = TIME_1 EQU 1030H

1040 = SERIAL EQU 1040H

0000 0126 AJMP START ;跳转到主程序起始点

0003 ORG 0003H

0003 021000 LJMP INT_0 ;外中断0处理程序

000B ORG 000BH

000B 021010 LJMP TIME_0 ;定时中断0处理程序

0013 ORG 0013H

0013 021020 LJMP INT_1 ;外中断1处理程序

001B ORG 001BH

001B 021030 LJMP TIME_1 ;定时中断1处理程序

0023 ORG 0023H

0023 021040 LJMP SERIAL ;串行口中断程序

START:

0026 00 NOP

0000 END

The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 2

08-26-96

;%T Symbol Name Type Value

INT_0 . . . . . . . . . . . . . I 1000

INT_1 . . . . . . . . . . . . . I 1020

SERIAL. . . . . . . . . . . . . I 1040

START . . . . . . . . . . . . . L 0026

TIME_0. . . . . . . . . . . . . I 1010

TIME_1. . . . . . . . . . . . . I 1030

;%Z

00 Errors (0000)

由列表文件,可以绘出代码在ROM中的映象图如下:

代码01H 11H 02H 10H 00H

地址00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH

代码02H 10H 10H 02H 01H 20H

地址0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H 15H

代码02H 10H 30H

地址16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH 1FH 20H

代码02H 10H 40H 00H

地址21H 22H 23H 24H 25H 26H 27H 28H

2AH 2BH

29H

由映象图可知,各中断程序的代码都在其规定地址处,一旦产生中断即可执行相应的程序。至于图中未填的部分(如02H),根据各编程器不同而不同,一般为FFH或00H。

二、END

END语句标志源代码的结束,汇编程序遇到END语句即停止运行。若没有END语句,汇编将报错。END语句有一个参数,可以是数值0,也可以是表达式,其格式是:

标号: END 表达式

它的值就是程序的地址并且作为一个特殊的记录写入HEX文件。若这个表达式省略,HEX文件中其值就是0。

三、EQU

EQU以及其它一些符号定义伪指令用来给程序中出现的一些符号赋值。对这些符号名的要求与其它符号相同,即长度不限,大小写字母可互换并且必须以字母开头。由等值指令定义的符号是汇编符号表的一部分。等值伪指令有两种形式。一种用EQU,另一种用字符“=”即

符号名EQU 表达式

符号名= 表达式

两种形式的效果是一样的。符号名在左边,其对应的值在右边。值可以是变元,其它的符号名或表达式。只要在两遍扫描中求出表达式的值就行,否则引用该符号名时将报错。当表达式的值是字符串时,只取后两个字符。若串长为1,高位字节被置0,符号名的值被打印在程序清单中。由等值伪指令定义的符号名不允许重名。如果经定义的符号名被重定义,则汇编将报出错,并且这个符号名按新定义的处理,最好不要在程序中出现重名。

例:0469= ABC EQU 469H

0464= XY EQU ABC-5

02F0= JK = 752

0754 XYJK = XY+JK

在列表文件中最左边的数字不是这些伪指令所在的地址而是通过汇编后赋给符号名

的值。第一条符号名ABC被起来469H,第二条XY被赋于ABC-5,因此XY的值为469H-5=464H,JK的值为752(即2F0H),XYJK的值XY+JK=464H+2F0H=754H

四、SET

SET伪指令有些类似于等值伪指令,它定义了一个整数类型的符号名,它的格式为

符号名SET 表达式

SET伪指令与等值伪指令的唯一区别在于SET伪指令所定义的符号名右以在程序中多次定义,而不报错。

例:002D= K57 SET 101101B

8707= K57 SET 34567

五、DATA与BYTE

DATA与BYTE都是用来定义字节类型的存储单元,赋予字节类型的存储单元一个符号名,以便在程序中通过符号名来访问这个存储单元,以帮助对程序的理解。

BYTE与DATE之间的区别类似于EQU和SET,BYTE伪指令不能定义重名。

六、WORD

WORD伪指令类似于DATE伪指令,只是WORD伪指令定义了一个字类型的符号名,其格式为:

符号名WORD 表达式

0027= VAL31 WORD 39

0021= PAR7 WORD 21H

一个字由2个字节组成。当然,因为8051汇编语言集没有字操作,所以程序执行时,只处理字节。WROD伪指令仅仅允许用户定义一个认为是字的存储位置。

七、BIT

BIT伪指令定义了一个字位类型的符号名,其格式为:

符号名BIT 表达式

这里表达式的值是一个位地址,这个伪指令有助于位的地址符号化。

例:

002F= LOG3 BIT 47

0014= Y731 BIT 14H

八、ALTNAME

替换名(ALTNAME)伪指令提供用户一种手段,以定义一个符号名来替换一个保留字,此后这个答名与被替换的保留字均可等效地用于程序中。任何保留类型的答名均可被替换。替换名伪指令格式为:

ALTNAME 保留字,新名

例:

0002= ALTNAME R2 COUNT

013A EA MOV A,R2

013B E502 MOV A,COUNT

九、DB

DB伪指令用于定义一个连续的存储区,给该存储区的存储单元赋值。该伪指令的参数即为存储单元的值,在表达式中对变元个数没有限制,只要此条伪指令能容纳在源程序的一行内,其格式为:

标号:DB 表达式

只要表达式不是字符串,每一表达式值都被赋给一个字节。计算表达式值时按16位处理,但其结果只取低8位,若多个表达式出现在一个DB伪指令中,它们必须以逗号分开。

表达式中有字符串时,以单引号“'”作分隔符,每个字符占一个字节,字符串不加改变地被存在各字节中,并不将小写字母转换成大写字母。

例如:

DB 00H 01H 03H 46H

DB 'This is a demo!'

十、DW

DW为以字节为单元(十六位二进制)来给一个的存储区赋值,其格式为:

标号:DW 表达式

例如:

0000 3035 D46B DW 12341,54379,10110100101110B

0004 2D2E

0006 4344 4243 DW 'ABCD','BC','A'

000A 0041

000C 2868 02E8 DW 456*375h,83+295h,'YZ',72h-456

0010 595A FEAA

十一、DS

DS为定义存储内容的伪指令,用它定义一个存储区,并用指定的参数填满该存储区。

DS伪指令包含两个变元,第一个变元定义了存储区的长度的字节数,在汇编时,汇编程序将跳过这些单元把其它指令汇编在这些字节之后,因此在使用DS伪指令时第一个变元不可活力第二个变元表示在这些单元中真入什么值,第二个变元可以活力活力时这些字节将不处理。下例中0173处有一条DS 9,则空出9个字节,下一第指令被汇编到017C处;在017C处空出1BH个单元,在这些字节中被27H所填充。

DS指令的格式如下:

标号:DS 表达式1,表达式2

表达式1定义了存储区的长度(以字节为单位)。这个变元不能省略。表达式2是可选择的,它的值低8位用以填入所定义的存储区。

若省略则这部分存储单元不处理。

例:

0000 04 INC A

0001 DS 9

000A 04 INC A

000B DS 1BH,27H

0026 04 INC A

十二、INCLUDE

INCLUDE伪指令用于链接源文件,即将一个源文件插入到另一个源文件中。它有一个参数,指出将要插入的文件名,该文件名中可包括驱动器名和路径名。若文件没有扩展名,则默认为是ASM。但待插入的文件必须是可以打开的。若文件打开操作失败,则产生致命错误,汇编将停止运行。反之,汇编程序将文件内容读入并按源代码处理。当遇到文件结速符时,汇编程序返回到INCLUDE伪指令处继续身下处理源程序。被插入的文件在程序清单中以“I”开头。

本宏汇编版本支持级嵌套,可在程序中用INCLUDE伪指令插入任意多个文件,但是,在一般情况下DOS允许打开的文件数量是有限的,如果用户需要打开较多的文件,则必须在CONFIG.SYS文件中加入FILES=40或更多的值,若超过8级嵌套或打开的文件太多,则产生致命错误,汇编中止运行。

INCLUDE伪指令提供了模块化程序设计手段,在汇编程序处理主程序时,模块被插入,尽管这不等价于链接和装配可重定位的目标模块,但它具有类似的功能,被插入的源文件中不应该包含END伪指令,否则,汇编就会提前停止运行,END伪指令只能出现在主程序中。此外,在主程序进行汇编前所有附加的源文件必须通过汇编,产生相应的HEX及LST文件,由于附加的文件没有END伪指令,因此,附加文件汇编时,汇编程序将显示:“没有结束语句”的错误,但并不影响与主程序的链接。

下面是一个使用INCLUDE伪指令的例子,其主程序的源文件MAIN.ASM为:;MAIN.ASM

ORG 27H

START:

CLR A

MOV R3,A

INCLUDE MOD1

INC R5

INCLUDE MOD2.ASM

DEC R3

END START

主程序为带有END伪指令的完整的源文件。程序中有两INCLUDE伪指令,分别将两附加的文件MOD1.ASM及MOD2.ASM链接到主程序中。以下是这两个文件。

;MOD1.ASM

MOV R2,#31H

MOV R5,#18H

;MOD2.ASM

MOV R6,#47H

ANL A,#07H

MOV R1,A

注意MOD1.ASM及MOD2.ASM均没有END指令。

在进行汇编时必须先对MOD1.ASM和MOD2.ASM进行汇编,然后在汇编MAIN.ASM,由于上两个文件没有END伪指令,所以在汇编时会出现错误提示,不用管它,继续下面的工作,就可以得到正确的结果。

以下是形成的列表文件:

The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 1

;MOD2.ASM

MOV R6,#47H

ANL A,#07H

MOV R1,A

08-27-96

;MAIN.ASM

0027 ORG 27H

START:

0027 E4 CLR A

0028 FB MOV R3,A

I INCLUDE MOD1

I ;MOD1.ASM

I0029 7A31 MOV R2,#31H

I002B 7D18 MOV R5,#18H

I

002D 0D INC R5

I INCLUDE MOD2.ASM

I ;MOD2.ASM

I002E 7E47 MOV R6,#47H

I0030 5407 ANL A,#07H

I0032 F9 MOV R1,A

0033 1B DEC R3

0027 END START

The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 2 08-27-96

;%T Symbol Name Type Value

START . . . . . . . . . . . . . L 0027

;%Z

00 Errors (0000)

十三、T I T L

TITLE伪指令用于在列表文件页头建立一个标题,其格式为:

$TITLE标题行

这里标量行就是将出现在页头的标量与通常的字符串定义不同。这里标量行不加引号。汇编从$TITLE之后的第一个可打印字符开始,到回车符之间的字符串作为标量标量的最大长度是60个字符,基标量行省略,则标题行为空行。若TITLE伪指令在一页,它说明的标量行包含在本页,否则,标题将出现在下页页头。

十四、P A C E

PAGE伪指令用于形成新的一中定义一面的行数。其格式为:

$PAGE表达式

若表达式缺省则开始新的一页,若有表达式,则每页行数重新定义。汇编开始时页长为66行。一页中除出页外,剩余55行用于打印源程序,这一格式适用于标准打印纸。

如果变元值小于66,页内可打印的源代码行将相应减少。页长最小值为12。若小于12时,每页内除页上只打印一行源程序。

页长变元是16位字节,因而每页最长可定义到65535行,这时分页打印变为连续打印,在屏幕显示程序清单或在卷筒纸上打印程序清单时,常常使用连续打印,如果在启动汇编时用/N选项,页长就是65535。

十五、L I S T与N O L I S T

它们的格式为:

$LIST

$NOLIST

LIST伪指令使汇编时主生程序清单,但即使不用该指令,汇编也会自动产生清单。但如果使用了NOLIST伪指令后需要继续主生清单则必须使用LIST伪指令。

NOLIST伪指令使汇编时不产生清单,所有包含此伪指令及在这条伪指令之后的语句都不进入列表文件。当不需要任何列表文件,并且不需要显示程序清单时,可以在启动汇编时不加.L附加项,且在源代码的第一行加上NOLIST指令。

使用NOLIST伪指令与附加项/L不同之处是NOLIST伪指令可加在源程序中,与LIST伪指令配合使用,使源程序中某些部分不产生清单。而不加附加项/L 则不产生任何程序清单。不过,不管有无$NOLIST伪指令,程序在汇编时检查到的错误都将在屏幕上显示出错的源代码行及错误信息

十六、N O C O D E

其格式为$NOCODE

NOCODE伪指令使得在汇编时,条件汇编程序结构中那些真值为假的条件不产生清单。有关条件汇编结构在下面介绍。如果没有这条伪指令,汇编将主生所有条件下的清单,不论其真值是否为真。但是假的条件,不产生目标码。而NOCODE伪指令使汇编清单中只列出那些由汇编程序用到的部分,因此,当使用NOCODE伪指令时,程序清单与源程序并非逐行对应。

汇编伪指令详解

51单片机汇编指令速查表

51单片机汇编指令速查表 指令格式功能简述字节数周期 一、数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,@Ri 内部RAM单元送累加器 1 1 MOV @Ri ,A 累加器送内部RAM单元 1 1 MOV A ,#data 立即数送累加器 2 1 MOV A ,direct 直接寻址单元送累加器 2 1 MOV direct ,A 累加器送直接寻址单元 2 1 MOV Rn,#data 立即数送寄存器 2 1 MOV direct ,#data 立即数送直接寻址单元 3 2 MOV @Ri ,#data 立即数送内部RAM单元 2 1 MOV direct ,Rn 寄存器送直接寻址单元 2 2 MOV Rn ,direct 直接寻址单元送寄存器 2 2 MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2 MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2 MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1 XCH A ,@Ri 累加器与内部RAM单元交换 1 1 XCHD A ,direct 累加器与直接寻址单元交换 2 1 XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1 POP direct 栈顶弹出指令直接寻址单元 2 2 PUSH direct 直接寻址单元压入栈顶 2 2 二、算术运算类指令 ADD A, Rn 累加器加寄存器 1 1

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的汇编控制指令即宏指令

A51汇编器是运行于IBM PC系列及其兼容机上的交叉汇编软件,其主要功能是将MCS-51系列单片机汇编语言源程序翻译成符合Intel目标文件格式的可再定位的目标代码,经过L51连接器的连接和装配,产生可被DS51仿真器调试或其它任何一种与Intel 目标文件格式兼容的仿真器使用的绝对目标代码. 一:A51的符号:在A51中可使用符号表示数值(EQU),地址和寄存器名,符号具有段类型,作用域,值域和可变性等属性. 符号的段属性:指出符号所位于的地址空间.段类型有: NUMBER 无类型符号 DATA DATA段符号(可直接寻址的内部RAM空间) IDATA IDATA段符号(可间接寻址的内部RAM空间) XDATA XDATA段符号(外部数据存储空间) BIT BIT段符号(内部RAM低地址区的可位寻址的空间) CODE CODE段符号(程序存储器空间) REGISTER 寄存器符号 作用域:指出符号是外部的,局部的还是全局的.(PUBLIC,EXTRN关键字说明) 二:标号:定义标号时,标号名后必须接冒号”:”,以示区别,每行只能定义一个标号,标号一经定义,其值为当前地址计数器的当前值,因此标号代表了指令和数据的地址,不能重复定义. 三:特殊的汇编符号:A51宏汇编语言定义了代表CPU寄存器的特殊符号,这些是保留的关键字,AR0---AR7:表示当前工作寄存器的R0—R7的绝对地址,它的值取决于指令所选择的工作寄存器组. 四:运算符:有三种 1):算术运算符包括:+,-(正负号),加---+,减,乘,除,MOD(取模),()—括号,改变运算顺序. 2):二进制运算符号:用来对二进制数进行按位取反,移位或逻辑运算.包 括:NOT(按位取反),HIGH(取右边操作数的高8位,LOW(取右边操作数的低8 位)SHR(右移位),SHL(左移位),AND(逻辑与),OR(逻辑或),XOR(逻辑异或). 3):关系运算符:>=,<=,<>,=,<,>. 所有运算符的优先级顺序:()→NOT,HIGH,LOW→+,-(正负号)→*,/,MOD→+,-(加减)→SHR,SHL→AND,OR,XOR→>=,<=,<>,>,<,=. 数值表达式:数值表达式由运算符和操作数组成,一个操作数又可以是表达式,与符号具有段属性一样,表达式也具有段类型属性,表达式的类型依赖于操作数的类型.表达式的类型如下:BIT,NUMBER,CODE,DATA,IDATA,XDATA.大多数的表达式是无类型的,当表达式中包含有段类型的操作数或者是子表达式时,运算结果的段类型遵循下面的原则: 对于单目运算符:(+/-/HIGH/LOW/NOT)表达式的结果与操作数具有相同的类型. 对于所有的双目运算符(除+/-),表达式的结果均为无类型的结果. 对加减运算,只有当其中的一个操作数具有段类型的时候,运算结果才具有相同的段类型,如果两个操作数具有段类型,即使他们的段类型一样,结果也是无类型的(NUMBER). 总结:只有当操作数加上或者是减去一个无类型时,才可能产生一类型,其他所有的组合均产生无类型的表达式.

单片机汇编指令大全

单片机汇编指令一览表 作者:乡下人 助记符指令说明字节数周期数 (数据传递类指令) 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

(完整版)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条)

51汇编伪指令(解说+例子)

51汇编伪指令 2008-12-20 10:58 伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令。 许多伪指令要求带参数,这在定义伪指令时由“表达式”域指出,任何数值与表达式匀可以作为参数。 不同汇编程序允许的伪指令并不相同,以下所述的伪指令仅适用于MASM51系统,但一些基本的伪指令在大部份汇编程序中都能使用,当使用其它的汇编程序版本时,只要注意一下它们之间的区别就可以了。MASM51中可用的伪指令有: ORG 设置程序起始地址 END 标志源代码结束 EQU 定义常数 SET 定义整型数 DA TA给字节类型符号定值 BYTE 给字节类型符号定值 WROD 给字类型符号定值 BIT 给位地址取名 ALTNAME 用自定义名取代保留字 DB 给一块连续的存储区装载字节型数据 DW 给一块连续的存储区装载字型数据 DS 预留一个连续的存储区或装入指定字节。 INCLUDE 将一个源文件插入程序中 TITLE 列表文件中加入标题行 NOLIST 汇编时不产生列表文件 NOCODE 条件汇编时,条件为假的不产生清单

一、ORG 伪指令ORG用于为在它之后的程序设置地址值,它有一个参数,其格式为: ORG 表达式 表达式可以是一个具体的数值,也可以包含变量名,如果包含变量名,则必须保证,当第一次遇到这条伪指令时,其中的变量必须已有定义(已有具体的数值),否则,无定义的值将由0替换,这将会造成错误。在列表文件中,由ORG定义的指令地址会被打印出来。 ORG指令有什么用途呢?指令被翻译成机器码后,将被存入系统的ROM中,一般情况下,机器码总是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必须被放在0003H,000BH,0013H,001BH和0023H的位置,否则就会出错,如果我们编程时不作特殊处理,让机器代码一个接一个地生成,不能保证这些代码正好处于这些规定的位置,执行就会出错,这时就要用到ORG伪指令了。看如下例子: 例: INT_0 EQU 1000H TIME_0 EQU 1010H INT_1 EQU 1020H TIME_1 EQU 1030H SERIAL EQU 1040H AJMP START ;跳转到主程序起始点 LJMP INT_0 ;外中断0处理程序 LJMP TIME_0 ;定时中断0处理程序 LJMP INT_1 ;外中断1处理程序 LJMP TIME_1 ;定时中断1处理程序 LJMP SERIAL ;串行口中断程序 START: NOP

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则转移; 带进位循环左移; 带进位循环右移;

51单片机指令表汇总

51单片机指令表 助记符指令说明字节数周期数 (数据传递类指令) MOV A,Rn 寄存器内容传送到累加器 1 1 MOV A,direct 直接地址内容传送到累加器 2 1 MOV A,@Ri 间接RAM内容传送到累加器 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 2 MOV direct,direct 直接地址传内容传送到直接地址 3 2 MOV direct,A 累加器内容传送到直接地址 2 1 MOV direct,@Ri 间接RAM内容传送到直接地址 2 2 MOV direct,#data 立即数传送到直接地址 3 2 MOV @Ri,A 累加器内容传送到间接RAM 1 1 MOV @Ri,direct 直接地址内容传送到间接RAM 2 2 MOV @Ri,#data 立即数传送到间接RAM 2 1 MOV DPTR,#data16 16 位地址传送到数据指针 3 2 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

常用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 立即数带进位加到累加器

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

51单片机汇编指令小结

二、算术运算类指令

四、控制转移类指令类

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

51汇编常用伪指令 https://www.docsj.com/doc/588038659.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汇编伪指令 伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令。许多伪指令要求带参数,这在定义伪指令时由“表达式”域指出,任何数值与表达式匀可以作为参数。不同汇编程序允许的伪指令并不相同,以下所述的伪指令仅适用于MASM51系统,但一些基本的伪指令在大部份汇编程序中都能使用,当使用其它的汇编程序版本时,只要注意一下它们之间的区别就可以了。 MASM51中可用的伪指令有: ORG 设置程序起始地址 END 标志源代码结束 EQU 定义常数 SET 定义整型数 DATA 给字节类型符号定值 BYTE 给字节类型符号定值 WROD 给字类型符号定值 BIT 给位地址取名 ALTNAME 用自定义名取代保留字 DB 给一块连续的存储区装载字节型数据 DW 给一块连续的存储区装载字型数据 DS 预留一个连续的存储区或装入指定字节。 INCLUDE 将一个源文件插入程序中 TITLE 列表文件中加入标题行

NOLIST 汇编时不产生列表文件 NOCODE 条件汇编时,条件为假的不产生清单 一、ORG 伪指令ORG用于为在它之后的程序设置地址值,它有一个参数,其格式为: ORG 表达式 表达式可以是一个具体的数值,也可以包含变量名,如果包含变量名,则必须保证,当第一次遇到这条伪指令时,其中的变量必须已有定义(已有具体的数值),否则,无定义的值将由0替换,这将会造成错误。在列表文件中,由ORG定义的指令地址会被打印出来。 ORG指令有什么用途呢?指令被翻译成机器码后,将被存入系统的ROM中,一般情况下,机器码总是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必须被放在0003H,000BH,0013H,001BH和0023H的位置,否则就会出错,如果我们编程时不作特殊处理,让机器代码一个接一个地生成,不能保证这些代码正好处于这些规定的位置,执行就会出错,这时就要用到ORG伪指令了。看如下例子: 例: INT_0 EQU 1000H TIME_0 EQU 1010H INT_1 EQU 1020H TIME_1 EQU 1030H SERIAL EQU 1040H

51汇编伪指令(定义系统堆栈1).

51单片机汇编伪指令 命令按字母排序: 1、 ALTNAME 功能: 这一伪指令用来自定义名字,以替换源程序中原来的保留字,替换的保留字均可等效地用于子程序中。格式: ALTNAME 保留字自定义名注意: 自定义名与保留字之间首字符必须相同。 1、BIT 功能:指令用于将一个位地址赋给指定的符号名。指令格式:符号名 BIT 位地址经 BIT 指令定义过的位符号名不能更改。例如:X_ON BIT 60H ;定义一个绝对位地址 X_OFF BIT 24h.2 ;定义一个绝对位地址 BIT ---定义位命令格式:字符名称 BIT 位地址 其功能用于给字符名称定义位地址。 SPK BIT P3.7 经定义后,允许在指令中用SPK 代替 P3.7。 2、 BSEG 功能:绝对选择指令指令 BSEG 选择绝对位寻址数据段指令格式如下:BSEG [AT 绝对地址表达式] 3、CODE 功能:用于将程序存储器 ROM 地址赋给指定的符号名。指令格式:符号名CODE 表达式 例如:RESET CODE 00H 4、CSEG

功能:绝对选择指令 CSEG 选择绝对代码段; 指令格式如下:CSEG [AT 绝对地址表达式] 5、DATA(BYTE 功能:指令用于将一个内部 RAM 的地址赋给指定的符号名指令格式:符号名DATA 表达式 数值表达式的值应在 0~255 之间,表达式必须是一个简单再定位表达式。 例如:REGBUF DATA(BYTE 40H PORT0 DATA(BYTE 80H DATA 与 BYTE 的区别:DATA 与 BYTE 是相类似的伪指令。当程序运行到DATA 伪指令定义的符号名时, 该符号名将被显示;而由 BYTE 定义的符号名不被显示。 6、DB 功能:DB伪指令用于定义一个连续的存储区,给该存储区的存储单元赋值。该伪指令的参数即为存储单元的值, 在表达式中对变元个数没有限制,只要此条伪指令能容纳在源程序的一行内,其格式为: 标号:DB 表达式只要表达式不是字符串,每一表达式值都被赋给一个字节。计算表达式值时按 16位处理,但其结果只取低 8位, 若多个表达式出现在一个 DB 伪指令中,它们必须以逗号分开。表达式中有字符串时,以单引号“ ' ”作分隔符, 每个字符占一个字节,字符串不加改变地被存在各字节中,并不将小写字母转换成大写字母。 例如:DB 00H 01H 03H 46HDB 'This is a demo!' 7、DBIT 功能 :在内部数据区的 BIT 段以位为单位保留存储空间。指令格式:[标号:] DBIT 数值表达式其操作类似于 DB 。 8、 DS

51汇编指令大全

Rn: 表示当前寄存器区的8个工作寄存器R0~R7 Ri: 表示当前寄存器区的R0或R1,可作地址指针即间址寄存器(i=0或1) @: 为间接寄存器或基址寄存器的前缀. Direct: 表示8位内部数据存储单元的地址.它可以是内部RAM的单元地址0~127.特殊功能 寄存器SFR的地址(128~255)或名称, A: 累加器ACC. B: .特殊功能寄存器B,用于MUL和DIV指令中. C: 进位位Cy. #data: 表示包含在指令中的单字节(8位)立即数.如果用16位进制表示,后缀字母为”H”,数据范围00~0FFH,不得一字母开头;如果用16进制表示无须任何后缀,但必须在0~255之间. #data16: 表示包含在指令中的双字节(16位)立即数. Adda16: 表示16位的目的地址.用于LCALL和LJMP指令中,目的地址范围是从0000H~FFFFH的整个64KB存储地址空间. Adda11: 表示11位的目的地址.用于ACALL和AJMP的指令中,目的地址必须和下一条指令第一个字节同处一页. Rel: 表示8位带符号的相对偏移量.用语SJMP和所有的条件转移指令中.偏移量相对于下一条指令的第一个字节计算,在-128~+127范围内取值. DPTR: 为数据指针,可用作16位的地址寄存器. /: 加在位操作的前面,表示对该位进行非运算. bit: 表示内部可寻址位或特殊功能寄存器中的直接寻址位. “(x):寄存器或地址单元中的内容. ((x)): 有x见解寻址的单元中的内容. <-: 表示将箭头右边的内容传送至箭头的左边. $: 当前指令的地址.

单片机指令系统 (一) 内部数据传送指令 (1) 以累加器A为目的的传送指令: MOV A, #data ;(A)<-data MOV A, direct ;(A)<-(direct) MOV A, Rn ;(A)<-(Rn) MOV A, @Ri ;(A)<- ((Ri)) (2) 以通用寄存器Rn为目的的传送指令: MOV Rn, A ;(Rn)<-(A) MOV Rn, direct ; (Rn)<(direct)- MOV Rn, #data: ; (Rn)<-(data) (3) 以直接地址为目的的传送指令: MOV direct, A ;(direct)<-(A) MOV direct, Rn ; (direct)<-(Rn) MOV direct, direct2 ; (direct)<-(direct2) MOV direct, @Ri ; (direct)<-((Rn)) MOV direct, #data ; (direct)<-data (4) 以寄存器间接地址为目的的传送指令: MOV @Ri, A ;((Ri))<-(A) MOV @Ri, direct ;((Ri))<-(direct) MOV @Ri, #data ;((Ri))<-data (二) 数据指针赋值指令(16位数据传送指令) MOV DPTR, #data16; (三) 片外数据传送指令

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 单片机程序编写时的标准必备。

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则转移;

51汇编指令大全

51汇编指令大全 Rn: 表示当前寄存器区的8个工作寄存器R0~R7 Ri: 表示当前寄存器区的R0或R1,可作地址指针即间接寻址寄存器(i=0或1) @: 为间接寄存器或基址寄存器的前缀. Direct: 表示8位内部数据存储单元的地址.它可以是内部RAM的单元地址 0~127. 特殊功能寄存器SFR的地址(128~255)或名称, A: 累加器ACC. B: 特殊功能寄存器B,用于MUL和DIV指令中. C: 进位位Cy. #data: 表示包含在指令中的单字节(8位)立即数.如果用16位进制表示,后缀字母为”H”,数据范围00~0FFH,不得一字母开头;如果用16进制表示无须任何后缀,但必须在0~255之间. #data16: 表示包含在指令中的双字节(16位)立即数. Adda16: 表示16位的目的地址.用于LCALL和LJMP指令中,目的地址范围是从0000H~FFFFH的整个64KB存储地址空间. Adda11: 表示11位的目的地址.用于ACALL和AJMP的指令中,目的地址必须和下一条指令第一个字节同处一页. Rel: 表示8位带符号的相对偏移量.用语SJMP和所有的条件转移指令中.偏移量相对于下一条指令的第一个字节计算,在-128~+127范围内取值. DPTR: 为数据指针,可用作16位的地址寄存器. /: 加在位操作的前面,表示对该位进行非运算. bit: 表示内部可寻址位或特殊功能寄存器中的直接寻址位. (x): 寄存器或地址单元中的内容. ((x)): 用x间接寻址的单元中的内容.

<-: 表示将箭头右边的内容传送至箭头的左边. $: 当前指令的地址. 单片机指令系统 (一) 内部数据传送指令 (1) 以累加器A为目的的传送指令: MOV A, #data ;(A)<-data MOV A, direct ;(A)<-(direct) MOV A, Rn ;(A)<-(Rn) MOV A, @Ri ;(A)<- ((Ri)) (2) 以通用寄存器Rn为目的的传送指令: MOV Rn, A ;(Rn)<-(A) MOV Rn, direct ;(Rn)<(direct) MOV Rn, #data: ;(Rn)<-data (3) 以直接地址为目的的传送指令: MOV direct, A ;(direct)<-(A) MOV direct, Rn ;(direct)<-(Rn) MOV direct, direct2 ;(direct)<-(direct2) MOV direct, @Ri ;(direct)<-((Rn)) MOV direct, #data ;(direct)<-data (4) 以寄存器间接地址为目的的传送指令: MOV @Ri, A ;((Ri))<-(A) MOV @Ri, direct ;((Ri))<-(direct)

PIC16系列单片机汇编指令集-包括部分伪指令-很有帮助(整理的)2011

PIC16系列单片机汇编指令集-包括部分伪指令-很有帮助(整理的)2011.txt大人物的悲哀在于他们需要不停地做出选择;而小人物的悲哀在于他们从来没有选择的机会。男人因沧桑而成熟,女人因成熟而沧桑。男人有了烟,有了酒,也就有了故事;女人有了钱,有了资色,也就有了悲剧。 当D不写时默认是放到F中吗?好像是. 更新:1,PIC16没有同或指令; 面向字节 ADDWF F,D ;寄存器加法指令,F+W→D 影响C,DC,Z 进位C为1表示有进位 INCF F,D ;寄存器加1指令F+1→D SUBWF F,D ;减法指令F-W→D 影响C,DC,Z 进位C为0表示有借位.则F

相关文档