文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言指令集

汇编语言指令集

汇编语言指令集
汇编语言指令集

寄存器以及寻址方式

汇编语言中涉及的寄存器

通用寄存器

AX,BX,CX,DX主要用作数据寄存器。

AX:一个16位的寄存器,做累加器使用,是算术运算中的主要寄存器,

乘法指令中用来存放操作数。而且所有的I/O指令都使用AX或者AL与外部传送信息。

为了方便使用将AX分为了 AH AL

BX:在计算存储器地址的时候,用作基址寄存器使用。

分为了 BH BL

CX:用来保存计数值,如在移位指令中,循环指令以及串处理指令中用做隐含的计数器。

分为了 CH CL

DX:在做双字长运算的时候,将DX和AX组合在一起存放一个双字节数,DX存放高16位。

此外在某些I/O操作中,DX还用来存放I/O的端口地址。

SP,BP,SI,DI四个16位的通用寄存器除了可以象数据寄存器一样在运算过程中存放数据外(只能以字-16为单位使用)

其主要的用途还是在存储器寻址的时候,提供偏移地址。因此它们也称为指针或者变址寄存器。

SP 堆栈指针寄存器,用来指出栈顶的偏移地址。

BP 基址指针寄存器,在寻址时候用作基地址寄存器使用,但是它必须用堆栈段寄存器SS一起来确定堆栈中的存储单元地址。

SI 源变址寄存器,在串处理指令中,SI用作因为的源变址寄存器和数据段寄存器DS一起使用,以确定数据段中的存储单元地址,

同时具有自动增量和自动减量的变址功能。

DI 目的变址寄存器,在串处理指令中,DI与附加段寄存器ES一起使用,已达到在附加段中寻址的目的,然后DI自动增量或者减量。

专用寄存器

8086中包含了3个16为的专用寄存器:IP,SP,FLAGS

IP 指令指针寄存器,用来存放将要执行的下一条指令地址的偏移量,它与代码段寄存器CS一起确定代码段中指令的地址。

在计算机系统中,控制程序的执行流程是通过控制IP的值来实现的。

SP 堆栈指针寄存器,与堆栈段寄存器SS联合确定堆栈中栈顶的地址,SP用来存放栈顶的偏移地址。

FLAGS 标志寄存器,这是一个存放条件码标志,控制标志的16的寄存器。

标志寄存器的主要用途体现在操作数的运算过程中:

条件码标志用来记录程序中运行结果的状态信息,它们是根据有关指令的运行结果由CPU自动设置的。由于这些状态信息往往作为后续条件转移指令的转移控制条件,所以称为条件码。

CF 进位标志,记录运算时最高有效位产生的有效值。

SF 符号标志,记录运算结果的符号,负数为1,其他置0。

ZF 零标志,记录运算结果是否为零,为零置1,否则置0。

OF 溢出标志,运算过程操作结果超出了机器可标识的范围产生溢出,溢出置1,否则置0。

AF 辅助进位标志,记录运算时第3位(半个字节)产生的进位。

PF 奇偶标志,为机器传送信息的过程中可能产生的代码错误情况提供检验条件,结果中1个数为偶数置1,否则置0。

控制标志码

DF 方向标志,在串指令中控制处理信息的方向,DF=1时候,控制从高位->低位方向处理,DF=0,控制从低位->高位处理。

TF 陷阱标志,用于调试时的单步方式操作,TF=1时候,每条指令执行后产生一个陷阱,由系统控制计算机,DF=0,CPU正常工作。

IF 中断标志,用于控制可屏蔽硬件中断,当IF=1允许8086响应中断请求,否则关闭中断。段寄存器

8086微处理器中有4个段寄存器,在寻址内存单元时候,用它们直接或者间接存放段地址。

CS 代码段寄存器存放当前执行的程序的段地址

DS 数据段寄存器存放当前执行的程序所用的操作数的段地址。

SS 堆栈段寄存器存放当前执行的程序所用的堆栈的段地址。

ES 附加段寄存器存放当前执行程序中一个辅助数据段的段地址。

段寄存器和与其对应存放偏移地址的寄存器之间的组合关系

段寄存器偏移地址寄存器

CS IP

SS SP或BP

DS BX、DI、SI

ES DI(用于串指令)

8086的寻址方式

a.立即寻址方式

操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段中,这种操作数被称为立即数。

立即寻址方式一般用于给寄存器赋初值,并且只能用于源操作数字段而不能用于目的操作数字段。

例如:MOV AL,9 指令执行后(AL)=09H,在这里9被称为立即数,注意立即寻址方式中不能对段寄存器和标志寄存器赋值。

寄存器寻址方式

利用寄存器来存放要处理的操作数,而寄存器由指令指定。与立即寻址方式不同在于,用寄存器代替了立即数。

例如: MOV AX ,BX 如果执行前AX=1234H BX=5678H 那么执行完毕后,AX=5678H,BX不变。但是注意的是源寄存器和目的寄存器位数要相等。

直接寻址方式

在这种寻址方式中,操作数存放在存储单元中,而这个存储单元的有效地址就在这个操作码之后,操作数的物理地址可以通过

(DS × 16)+有效地址(操作数的有效偏移地址)。

例如:MOV AX, [2000H] 如果DS=3000H,则操作数所在的物理地址为:3000H *16 +2000H = 32000H ,AX就会获取到地址32000

H中的操作数。指令形式有两种:MOV AX, DATA 或者 MOV AX, [DATA].值得注意的是直接寻址方式默认的情况下认为操作数存放在DS数据段中的,如果操作数存放在别的段中需要加前缀。例如:MOV AX, ES:ADDR。由此看来直接寻址方式适合处理单个变量。

寄存器间接寻址方式

这种寻址方式是采用基址寄存器BX,BP或者变址寄存器SI,DI来保存操作数的有效地址。如果指令使用的寄存器是BX,SI,DI则物理地址=DS*16+有效地址,如果使用的寄存器是BP,则说明存放在堆栈段中则物理地址=SS×16+有效地址。

例如: MOV AX ,[BX] 假设执行前BX=1000H DS=2000H则物理地址为:2000H×16+1000H = 21000H,接着从21000H中提取操作数。注意:该种寻址方式也是默认操作数可以通过指定前缀的方式来获取到其他段中的操作数。MOV AX, ES:[BX]。

分析认为:该种方式适合表格处理,基址寄存器或者变址寄存器初始化为表格表首,每

取一个数据就修改BX寄存器种的数来指向下个数据。

寄存器的相对寻址方式。

这种寻址方式通过基址寄存器BX,BP或者变址寄存器SI,DI与一个位移量相加来得到有

效地址,计算物理地址的缺省值仍旧是 BX,SI,DI为DS,BP为SS。例如:MOV AX, COUNT[SI](也可表示为MOV AX, [COUNT+SI]),如果执行前DS=3000H,

SI=2000H,COUNT=4000H,则物理地址=3000H×16+2000H+4000H=35000H。这种方

式同样适合于表格处理,把位移量赋值为表首地址,修改基址或变址寄存器的内容来指向下一个操作数。

基址变址寻址方式

这种方式的完整的名字应该叫做基址存储器和变址存储器寻址方式,采用的是通过一个

基址存储器和一个变址存储器相加得到有效地址。而当基址寄存器为BX时候,物理地址=DS ×16 +有效地址,如果基址寄存器为BP时候,物理地址=SS×16+有效地址。例如:MOV AX, [BX][DI] (或写为 MOV AX, [BX+DI]),执行前,DS=2100H BX=0158H DI=10A5H,则物理地址=

2100H × 16 +(0158H + 10A5H),通过这个计算出来的地址可以得到操作数。该方

式同样适合表格的处理,首地址存放在基地中,而用变址寄存器来访问数组中的各个元素。而且两个寄存器都可以修改,所有较之寄存器相对寻址更加灵活。

相对基址变址寻址方式。

这种寻址方式其实可以算是基址变址寻址方式和寄存器相对地址的结合版本。通过一个基址寄存器和一个变址寄存器再加上一个位移量来得到有效地址。例如:MOV AX, MASK[BX][SI] (或 MOV AX, MASK[BX+SI],或 MOV AX, [MASK+BX+SI])

假设执行前:(DS)= 3000H,(BX)= 2000H,(SI)= 1000H,MASK = 0250H,则物理地址=3000H*16+2000H +1000H + 0250H=33250H ,再通过物理地址提取操作数。该中寻址方式适合于二维数组的寻址。比如存储器中有多条记录,利用偏移量来指向文件头,基址寄存器指向某条记录,而变址寄存器则指向记录中的某个元素。

指令寻址方式

前面介绍的都是关于数据的寻址方式,但是对于寻址我们还有一个必需考虑就是指令的

寻址,这就是与转移地址相关的寻址方式。顺序执行的指令可以通过指令指针寄存器IP

自动增量获取,而程序转移的地址必须由转移类指令和CALL指令指出。

在介绍这些寻址方式之前,先解释三个表示转移距离(称为位移量)的操作符:SHORT、NEAR、FAR。

SHORT表示位移量在-128~127字节之间。NEAR表示在同一段内转移,位移量在

-32768~32767字节范围内。FAR表示转移距离超过±32K字节,或是在不同段之间转移。因为CS:IP寄存器总是指向下一条将要执行的指令的首地址(称为IP当前值),当转移指令

执行后,必须修改IP或CS、IP的值。当转移指令给出位移量时,用IP当前值加上位移量即为新的IP的值。

SHORT转移,称为短转移,位移量用一个字节(8位)来表示。

NEAR转移,称为近转移,位移量用16位表示,因为程序控制仍然在当前代码段,所以只修改IP的值,CS的值不变。

FAR转移,称为远转移,因为程序控制超出了当前代码段,所以CS和IP都必须修改为新的值。

与转移地址有关的4种寻址方式就是告诉CPU如何修改CS和IP的值,以达到控制程序转移的目的

段内直接寻址方式

这种方式下,指令中直接指出转向的地址。例如:JMP SHORT NEXT

JMP NEAR PTR AGAIN

NEXT和AGAIN均为转向的符号地址。在机器指令中,操作码之后给出的是相对于当前IP值的位移量(转移距离),所以,转向的有效地址是当前IP值与指令中给出的位移量(8位或16位)之和。

取例说明:

1060:000D EB04 JMP SHORT NEXT

IP当前值→ 1060:000F ……

1060:0011 ……

1060:0013 0207 NEXT: ADD AL,[BX]

CPU执行JMP命令的时候,指令指针寄存器IP指向下一条指令,其为000F,而JMP SHORT NEXT 的机器语言为EB04其中,EB为操作码,04为偏移量。这样得到有效地址:000F + 0004 =0013,0013正是标号NEXT的地址。JMP指令执行后,将IP寄存器修改为0013,代码段寄存器CS不变。紧接着CPU根据CS:IP的指示,取出1060:0013中的ADD指令开始执行,这样实现了程序的转移。

段内间接寻址方式

这种寻址方式与直接寻址方式不同的是通过利用数据寻址的方式来间接的指出转向地址。(注意数据寻址方式不能是立即寻址方式),根据指令中的寻址方式,确定一个寄存器或者存储器其内容就是指定转向的有效地址。因为程序的转移仍在同一段内进行,所以只需将IP修改成新的转向地址,CS不变。段内转移指令中的NEAR PTR是可以缺省的。

假设:(DS)= 2000H,(BX)= 1256H,(SI)= 528FH,位移量 = 20A1H,(232F7H)= 3280H,(264E5H)= 2450H。

JMP BX 则执行该指令后(IP)= 1256H

JMP [BX][SI] ,首先知道采用了基变址数据寻址方式,因此IP=DS×16+BX+SI =

(264E5H) = 2450H

段间直接寻址方式

该中寻址与段内直接寻址方式基本相同,在指令中也直接给出了转向地址,只是在符号地址之间我们必需加上标识段内远转移的操作符 FAR PTR。指令如下:JMP FAR PTR OUTSEG,由于是段间转移,因此CS和IP都需要修改,这个新的转移地址由操作码之后的连续的两

个字节分别提供(新的段地址和偏移地址)。所以只要将指令中提供的转向偏移地址装入IP,转向段地址装入CS,就完成了从一个段到另一个段转移的工作。

d.段间间接寻址

这种方式和段间直接寻址方式也有几分相似,采用连续的两个字空间转入CS和IP以达到段间转移的目的,只是这两个字的空间的存储地址是通过数据寻址方式获取的(直接寻址方式和寄存器寻址方式不能用于这里)。

为了说明寻址两个字单元,指令中必须加上双字操作符DWORD。

指令格式如下:

JMP DWORD PTR [SI]

JMP DWORD PTR[TABLE+BX]

5.机器语言指令的转换

8086机器语言指令是一种可变长度的指令,也就是说一条指令由1~7个字节组成,按照顺序排列为:

段前缀-操作码-寻址方式-数据/偏移量-数据/偏移量-数据-数据

汇编语言指令集

数据传送指令

通用数据传送指令

1. 传送指令[MOV]

指令格式:MOV dst src

执行操作:(dst) (src)

指令功能:将源操作数(字或者字节)传送到目的地址

使用注意:

?dst,src不能同时使用存储器寻址方式

?目的地址不能是CS也不能是立即数

?Dst,src不能同时为段寄存器

?MOV不影响标志位

2. 进栈指令[PUSH]

指令格式:PUSH src

执行操作:(sp) ← (sp -2 ) ; ( (sp) ) ← (src)

指令功能:SP内容先-2,然后将源操作数压入SP指向的字单元(高8位存入高地址) 使用注意:

?PUSH操作必须是字操作(SP必须是+2 -2)

?不能使用立即数寻址方式

?不影响标志位

3. 出栈指令[POP]

指令格式:POP dst

执行操作:(dst) <-- ( (sp) ) ; (sp) ← (sp ) +2

指令功能:将数据从堆栈中取出放入目的地址中,然后SP+2 指向新的堆栈栈顶

使用注意:

?POP操作必须是字操作(SP必须是+2 -2)

?不能使用立即数寻址方式

?Dst不能够是CS寄存器

?不影响标志位

4. 交换指令[XCHG]

指令格式:XCHG opr1 opr2

执行操作:(opr1) ←→ ( opr2)

指令功能:使两个操作数互相交换

使用注意:

?其中一操作数必须在寄存器中,另一个操作数可以在寄存器或者存储器中。

?不允许使用段寄存器

?不影响标志位

使用举例:XCHG AH AL; XCHG AX [BX+SI]

累加器专用传送指令

5. 输入指令[IN]

指令格式:IN ac , PORT(PORT<=0FFH) IN ac DX (DX>0FFH)

执行操作:(AL) ← (PORT) 或者(AX) ← (PORT+1, PORT)

(AL) ← (DX) 或者(AX)←(DX+1, DX)

指令功能:8086以及其后续机型的处理器,采用IN/OUT 来完成所有IO端口和CPU之间的通讯,IN将信息从IO输入到CPU,OUT将信息从CPU到IO端口。微处理器最多有2^16=64K个端口,其中前256个是固定端口,可以在指令中指定,当端口地址超过8位(>=256),称为可变端口,它必须先送到寄存器DX

使用注意:

?只限于AL或者AX与IO端口之间传送信息

?不影响标志位

使用举例:IN AL 61H ;MOV DX 288H ,IN AL DX

OUT 61H AL ;MOV DX 288H ,OUT DX AX

6. 输出指令[OUT]

指令格式:OUT port,ac (port<=0FFH) OUT DX ,ac (DX>0FFH)

执行操作:(port) ← (AL) 或者(port+1,port) ← (AX)

(DX) ← (AL) 或者(DX+1,DX) ← (AX)

指令功能:8086以及其后续机型的处理器,采用IN/OUT 来完成所有IO端口和CPU之间的通讯,IN将信息从IO输入到CPU,OUT将信息从CPU到IO端口。微处理器最多有2^16=64K个端口,其中前256个是固定端口,可以在指令中指定,当端口地址超过8位(>=256),称为可变端口,它必须先送到寄存器DX

使用注意:

?只限于AL或者AX与IO端口之间传送信息

?不影响标志位

7. 换码指令[XLAT]

指令格式:XLAT或者XLAT opr (opr为字节表格的首地址,opr表示偏移地址已存入BX 执行操作:(AL)← (DS *16) +(BX) +(AL)

指令功能:根据AL寄存器中指定的偏移量将BX指示的字表格中的代码换存在AL中

使用注意:

?由于存放偏移量采用的是AL,所以所建的字节表格的长度不能超过256字节

?XLAT不影响标志位

使用举例:MOV BX OFFSET_OF_TABLE ;IF offset is 40H

MOV AL 3 ;AL = 3H

XLAT ;(AL) = ((BX)+3) = 43H

地址传送指令

8. 有效地址送寄存器[LEA]

指令格式:LEA reg, src

执行操作:有效地址送寄存器(注意是地址,不是src对应的值)

指令功能:(reg) ← offset of src

使用注意:

?Reg不能是段寄存器

?SRC必须使用存储器寻址方式

?指令不影响标志位

使用举例:

0000 DATA SEGMENT

0000 0040 TABLE DW 0040

0002 3000 DW 3000H

0004 DATA SEGMENG END

MOV BX, TABLE ;(BX)=0040 取到了TABLE的值

LEA BX ,TABLE ;(BX =0000 取到了TABLE的地址

MOV BX OFFSET OF TABLE ;(BX)=0000 取到了TABLE的地址

但是LEA可以支持多种寻址方式,比如LEA BX,[DI],LEA BX,TABLE[DI]等,但是offset 标识符却不能这样使用,它只能作用于像TABLE这样的简单变量或者标号。但是对于简单变量offset指示符比LEA速度快,offset是在汇编时候就计算出TABLE偏移地址的

9. 指针送寄存器和DS [LDS]

指令格式:LDS reg, src

执行操作:(reg) ← (src) ; (DS) ←(src + 2)

指令功能:把确定内存单元位置的偏移量送寄存器,段地址送DS,这个偏移地址和段地址(也称地址指针)由SRC指定的两个相继字单元提供。

使用注意:

?Reg不能是段寄存器

?SRC必须使用存储器寻址方式

?指令不影响标志位

使用举例:(采用LEA的数据段)

LDS BX TABLE ; (BX) = 0040H ,(DS) = 3000H

10. 指针送寄存器和ES [LES]

指令格式:LES reg , src

执行操作:(reg)← (src) ; (ES) ← (src +2)

指令功能:把确定内存单元位置的偏移量送寄存器,段地址送ES,这个偏移地址和段地址(也称地址指针)由SRC指定的两个相继字单元提供。

使用注意:

?Reg不能是段寄存器

?SRC必须使用存储器寻址方式

?指令不影响标志位

使用举例:(使用LEA的数据段)

LES BX TABLE ;(BX) = 0040H (ES) = 3000H

标志寄存器传送指令

11. 标志送AH [LAHF]

指令格式:LAHF

执行操作:(AH)← (FLAGS)0~7

指令功能:标志寄存器的低字节送AH

使用注意:

?隐含操作器是AH,FLAGS

?不影响标志位

12. AH送标志寄存器[SAHF]

指令格式:SAHF

执行操作:(FLAGS)0~7 ← AH

指令功能:AH送标志寄存器低字节

使用注意:

隐含操作器是AH,FLAGS

标志寄存器由装载的值确定

13. 标志进栈[PUSHF]

指令格式:PUSHF

执行操作:(SP)← (SP -2 ) ; ( (sp+1), (sp) ) ← (FALGS) 0~15

指令功能:标志进栈

使用注意:

?不影响标志位

14. 标志出栈[POPF]

指令格式:POPF

执行操作:(FLAGS) 0~15 ← ((sp+1),(sp)) ; (sp) ← (sp)+2

指令功能:标志出栈

使用注意:

?标志由转入的值确定

算术指令

加法指令

15. 加法指令[ADD]

指令格式:ADD dst, src

执行操作:(dst) ← (src) + (dst)

指令功能:两数相加

使用注意:

?两个操作数不能同时为寄存器寻址方式,即除了src为立即数这种情况外,src,dst 中必须有一个是寄存器寻址方式

?影响标志位SF ZF CF OF,其设置方法如下:

SF=1 加法结果为负数(符号位为1)

SF=0 加法结果为整数(符号位为0)

ZF=1 加法结果为零

ZF=0 加法结果不为零

CF=1 最高有效位向高位有进位

CF=0 最高有效位向高位无进位

OF=1 同符号数相加,加法结果符号与其相反

OF=0 不同符号数相加,或者同符号数相加,但是结果与其符号相同?由于计算机执行运算时候并不关心是否有符号,所有程序应该根据标志位以及相加的两个参数(是符号数还是无符号数)来对加法的结果进行判断。比如

SF=1对两个无符号数相加是没有任何意义的。有如对于符号数和无符号数,

表示溢出的条件也是不同的,对于符号数OF=1 说明结果是没有意义的,而

无符号数相加的溢出(运算结果超出有限位的表示范围),表现位最高位产生

进位,所以CF=1表示其溢出,结果无效。而对于双字长数的运算,低字位

设置的CF=1说明了向高位字有进位。

使用举例:MOV BX ,9B8CH

ADD BX ,6478H ;1 0000 0000 0000 0000

CF =1 ZF=1 SF=0 OF=0

16. 带进位加指令[ADC]

指令格式:ADC dst, src

执行操作:(dst) ← (src) + (dst) +CF

指令功能:带进位的两数相加

使用注意:CF只的上次运算的CF设置的数据

使用举例:

(DX,CX)=A248 2AC0H (BX,AX)=088AH E25BH

ADD CX AX ;=1 0000 1101 0001 1011 CF=1

ADC DX BX ;CF=1 需要加进去,=1010 1010 1101 0011 (DX)=AAD3,SF=1 ZF=0 OF=0 CF=0

17. 加1指令[INC]

指令格式:INC opr

执行操作:(opr) ← (opr) +1

指令功能:对opr加1操作

使用注意:

使用举例:

减法指令

18. 减法指令[SUB]

指令格式:SUB dst ,src

执行操作:(dst) ← (dst) – (src)

指令功能:减法指令

使用注意:

?除DEC位其他几个减法都影响SF OF ZF CF,具体设置如下:

CF=1 最高有效位向高位借位(被减数<减数,不够减)

CF=0 最高有效位向高位无借位(够减)

OF=1 两数符号相反,但是结果却与减数符号相同

OF=0 两数符号相同,或者两数符号相反,结果符号与被减数相同?和加法类似,对于无符号数相减,CF表示是否溢出,OF表示有符号数相减是否溢出

使用举例:

43H – 16H = 1 0010 1101 = 2DH CF=0 OF=0

(这里需要注意的一点是对于减法计算机是转换为其对应的补码来做加法的^_^ ,所以对于这个加法的结果,如果产生进位那么CF=0 【正好和加法的相反,记得!!】,没有产生进位CF=1。我是这么理解的X-Y 假设都是n位的,转换位X +(2^n-1-Y) 此时X Y 都是无符号的了,所以对于结果如果产生进位的条件时无符号数X>无符号状态下的Y,此时产生的进位了,这和减法时候被减数够减(CF=0)是一样的前提条件(X>Y) 所以这个是否加法的产生进位实际上是CF=0是不用被减数借位的情况了.

【分析下4BH – 0B6H = 0DEH 不管是作为有符号数还是无符号数,其结果都是无效的?】

19. 带借位减法指令[SBB]

指令格式:SBB dst ,src

执行操作:(dst) ← (dst) – (src) – CF

指令功能:带借位的减法指令

使用注意:

使用举例:

20. 减1指令[DEC]

指令格式:DEC opr

执行操作:(opr ) ← (opr)-1

指令功能:减1操作

使用注意:

使用举例:

21. 求补指令[NEG]

指令格式:NEG opr

执行操作:(opr) ←- (opr) 【可以看成-0 –(opr) 】或者表示(opr) ← 0FFFFH – (opr) +1 指令功能:把操作数变成与其符号相反的数,操作数各位求反+1

使用注意:

影响条件标志为,具体设置如下:

CF=1 不为0的操作数求补

CF=0 为0 的操作数求补

OF=1 操作数为-128 或者-2^15

OF=0 操作数不为-2^7 或者-32768(字)

使用举例:

22. 比较指令[CMP]

指令格式:CMP opr1 , opr2

执行操作:(opr1) – (opr2) 根据相减结果设置条件码,但是不返回结果

指令功能:

使用注意:

使用举例:

乘法指令

23. 无符号数乘法指令[MUL]

指令格式:MUL src

执行操作:(AX) ← (AL) * (src) 或者(DX,AX) ← (AX) * (src)

指令功能:

使用注意:

?指令中只给出源操作数SRC,SRC可以是除立即数外的任意寻址方式,目的操作数是隐含的,它可能是AX/AL,结果寄存器可能是AX/(DX,AX)

?乘法指令只影响标志为CF OF,其他标志位是无定义

CF OF =0 0 乘积的高一半为0 (AH或者DX)

CF OF =1 1 乘积的高一半不为0

这样根据CF=1判断除结果是16位(字节操作)/32位(字操作)

CF=0 判断结果是8位/16位

使用举例:

24. 带符号数乘法指令[IMUL]

指令格式:MUL src

执行操作:(AX) ← (AL) * (src) 或者(DX,AX) ← (AX) * (src)

指令功能:

使用注意:

?指令中只给出源操作数SRC,SRC可以是除立即数外的任意寻址方式,目的操作数是隐含的,它可能是AX/AL,结果寄存器可能是AX/(DX,AX)

?乘法指令只影响标志为CF OF,其他标志位是无定义

CF OF =0 0 乘积的高一半为低一半的符号扩展

CF OF =1 1 其他情况

符号扩展指的是:利用低字的最高为(0,1)来扩展高字节全为(0/1)

例如:1000 0001 ->扩展为字1111 1111 1000 00001

使用举例:

除法指令

25. 无符号数除法指令[DIV]

指令格式:DIV src

执行操作:字节情况下:(AL)← (AX) / src的商(AH) ← (AX) / src的余数

字情况下:(AX) ← (DX,AX)/src的商,(DX) ← (DX,AX)/src的余数

指令功能:

使用注意:

?被除数存放在AX,(DX,AX)中,且除数和被除数都是无符号的,而且商和余数也是无符号的

?除法对于所有的条件码都是没有定义的,既使除以0的时候,我们也不能通过条件码来进行判断(这是通过0型中断来处理的)

?商也存在溢出的情况,请注意商的位数(为被除数的一半),如果被除数的高一半位的无符号数值大于除数,那么商会溢出了。

使用举例:

26. 带符号数除法指令[IDIV]

指令格式:

执行操作:

指令功能:

使用注意:

?同DIV指令,但是操作数是带符号的,商和余数也是带符号的,且商和余数的符号和被除数相同

使用举例:

符号扩展指令

27. 字节扩展为字指令[CBW]

指令格式:CBW

执行操作:(AL)最高位为0时,(AH)=00H

(AL)最高为为1时,(AH)=FFH

指令功能:

使用注意:

?操作数必须放在AL寄存器或者AX寄存器中

?不影响标志位

使用举例:

(AX)=0BA45H

CBW:(AL)=45H (AH)=00H

28. 字扩展为双字指令[CWD]

指令格式:CWD

执行操作:(AX)最高位为0时,(DX)=0000H

(AX)最高位位1时,(DX)=FFFFH

指令功能:

使用注意:

?操作数必须放在AL寄存器或者AX寄存器中

?不影响标志位

使用举例:

(AX) = 0BA45H

CWD:(AX)=0BA45H (DX)=FFFFH

十进制调整指令

29. 加法的十进制调整[DAA]

指令格式:DAA (Decimal Adjust for Addition)

执行操作:

如果(AL) 0~3>9或者AF=1, (AL) ← (AL)+06H,且AF设置为1

如果(AL) 4~7>9或者CF=1, (AL) ← (AL)+60H,且CF设置为1

指令功能:

执行ADD、ADC后,(AL) ←把AL中的和调整为压缩的BCD码

使用注意:

使用举例:

BCD码-----十进制数78的压缩BCD码01111 1000 ,不压缩0000 0111 0000 1000

2784(BCD) + 1839(BCD) = 4623(BCD)实现方法

(ADD) 84H + 39H = 0BDH

(DAA) 0BD + 06H +60H = 23H ,AF=1,CF=1

(ADC) 27H + 18H +1 = 40H ,AF=1 CF=0

(DAA) 40H + 06H = 46H ;AF=1也是一个条件

指令格式:DAS (Decimal Adjust for subtraction)

执行操作:

如果(AL) 0~3>9或者AF=1, (AL) ← (AL)-06H,且AF设置为1

如果(AL) 4~7>9或者CF=1, (AL) ← (AL)-60H,且CF设置为1

指令功能:

?执行SUB、SBB后,(AL) ←把AL中的和调整为压缩的BCD码

使用注意:

使用举例:

31. 加法的ASCII调整指令[AAA]

指令格式:AAA (ASCII Adjust for Adition)

执行操作:

如果(AL)0~3<9 且AF=0,则(AL)4~7 = 0 ,并设置CF=AF,CF=0

如果(AL)0~3>9 或者AF=1,则(AL)← (AL) + 06H, (AL)4~7=0, (AH) ← (AH)+1,

AF的值送CF

指令功能:

(AL)←把AL中的和调整为非压缩的BCD码格式

(AH)← (AH) + 调整产生的进位

使用注意:

?只影响标志位CF AF,其他位是无定义的

使用举例:

ASCII数5 + 2 ;其实就是35H + 32H

(ADD) 35H + 32H = 67 H ,AF=0 CF=0

(AAA) 7<9,AF=0, 则67H → 07H

(OR) 07H OR 30H → 37H 7对应的ASCII

32. 减法的ASCII调整指令[AAS]

指令格式:AAS (ASCII Adjust for subtraction)

执行操作:

如果(AL)0~3<9 且AF=0,则(AL)4~7 = 0 ,并设置CF=AF,CF=0

如果(AL)0~3>9 或者AF=1,则(AL)← (AL) - 06H, (AL)4~7=0, (AH) ← (AH)-1,

AF的值送CF

指令功能:

使用注意:

使用举例:

指令格式:AAM ( ASCII Adjust for Mul)

执行操作:

执行乘法运算MUL后,调整存放在AL寄存器中的乘积

(AH)←(AL) /0AH 的商

(AL) ←(AL)/0AH 的余数

指令功能:(AX) ←把AX中的乘积调整为非压缩的BCD格式

将两个一位数的非压缩BCD码相乘后得到的乘积进行二进制转换为十进制,十位

存放在AH,个位存放AL中,这样AX就是乘积的非压缩BCD码

使用注意:

使用举例:

ASCII 7 ×6 ;37H * 36H

(AND) 37H AND 0FH -→ 07H

(AND) 36H AND 0FH → 06H

(MUL) 06H * 07H = 42H

(AAM) AH = 04 AL=02

(AX) = 0402

(OR) AX or 3030H →3432H

34. 除法的ASCII调整指令[AAD]

指令格式:AAD ( Ascii Adjust for Div)

执行操作:

指令功能:在执行除法指令之前将被除数转换为二进制.

执行除法指令前,对AX中的非压缩码BCD码(被除数)执行,

(AL)← (AH) *10+(AL) (AH) ← 0

使用注意:

使用举例:

逻辑指令

逻辑运算指令

35. 逻辑与指令[AND]

指令格式:AND dst, src

执行操作:(dst) ← (dst) ∩(src)

指令功能:将字或者字节按位进行与操作

使用注意:

?影响标志位,CF和OF置0

?AF没有定义

?SF、ZF、PF根据运算结果确定

使用举例:

MOV AL 35H ;0011 0101

ADD AL 0FH ;0000 1111

;result ZF=0 SF=0 PF=1 CF=OF=0

注意对于字的AND操作PF的设置根据低8位来进行

36. 逻辑或指令[OR]

指令格式:OR dst src

执行操作:(dst) ← (dst) ∪ (src)

指令功能:将字或者字节按位进行或操作

使用注意:

?影响标志位,CF和OF置0

?AF没有定义

?SF、ZF、PF根据运算结果确定

使用举例:

37. 逻辑非指令[OT]

指令格式:NOT OPR

执行操作:(OPR)←^(OPR)

指令功能:

使用注意:

使用举例:

38. 异或指令[XOR]

指令格式:XOR dst, src

执行操作:(dst) ← (dst) A (src)

指令功能:使两个操作数对应位不同时候设置位1,相同时候设置为0 使用注意:

使用举例:

清零:XOR AL AL ;(AL)=0

39. 测试指令[TEST]

指令格式:TEST opr1 ,opr2

执行操作:(opr1) ∩ (opr2),设置条件码,但是不返回结果

指令功能:

使用注意:

使用举例:

测试奇偶性:

MOV DL 0AEH ;

TEST DL 01H ; 如果ZF=1 说明是偶数ZF=0 说明是偶数测试正负:

TEST DL 80H ;ZF=0 负数ZF=1 正数

移位指令

40. 算术左移指令[SAL]

指令格式:SAL dst, cnt

执行操作:CF <-字/字节---- 0

指令功能:最高位进入CF,最低位用0补充

使用注意:

?如果cnt=1可以直接用立既数表示,写成SAL dst,1,但是如果cnt>1则必须将cnt 放入CF中

?用于带符号的移位处理

?条件码的设置,CF=移入的数值

?OF=1,当移动后最高位的值发生变化,OF=0,移动后最高位没有发生变化

?SF、ZF、PF根据最终结果确定

使用举例:

41. 算术左移指令[SHL]

指令格式:SHL dst, cnt

执行操作:CF <-字/字节---- 0

指令功能:最高位进入CF,最低位用0补充

使用注意:

?如果cnt=1可以直接用立既数表示,写成SAL dst,1,但是如果cnt>1则必须将cnt 放入CF中

?用于不带符号的移位处理

?条件码的设置,CF=移入的数值

?OF=1,当移动后最高位的值发生变化,OF=0,移动后最高位没有发生变化

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

(完整版)快速入门单片机汇编语言

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(p0.0—p0.7):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(p1.0—p1.7):其每一位都能作为可编程的输入或输出线。 P2口(p2.0—p2.7):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(p3.0—p3.7):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释]

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

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)比较不相等则转移;

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

MCS-51汇编语言指令集

MCS-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),特殊功能寄存器的直接地址的位 2指令介绍 指令 字节 周期 动作说明 算数运算指令 1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器 2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器 3.ADD A,@Ri 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

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。 XCHG交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。 LEA 16位寄存器存储器操作数传送有效地址指令:必须是一个16位寄存器和存储器操作数。 LDS 16位寄存器存储器操作数传送存储器操作数32位地址,它的16位偏移地址送16位寄存器,16位段基值送入DS中。 LES :同上,只是16位段基址送ES中。 堆栈操作指令 PUSH 操作数,操作数不能使用立即数, POP 操作数,操作数不能是CS和立即数 标志操作指令 LAHF:把标志寄存器低8位,符号SF,零ZF,辅助进位AF,奇偶PF,进位CF传送到AH 指定的位。不影响标志位。 SAHF:与上相反,把AH中的标志位传送回标志寄存器。 PUSHF:把标志寄存器内容压入栈顶。 POPF:把栈顶的一个字节传送到标志寄存器中。 CLC:进位位清零。 STC:进位位为1。 CMC:进位位取反。 CLD:使方向标志DF为零,在执行串操作中,使地址按递增方式变化。 STD:DF为1。 CLI:清中断允许标志IF。Cpu不相应来自外部装置的可屏蔽中断。 STI:IF为1。 加减运算指令

注意:对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。 ADD。 ADC:把进位CF中的数值加上去。 INC:加1指令 SUB。 SBB:把进位CF中数值减去。 DEC:减1指令。 NEG 操作数:取补指令,即用0减去操作数再送回操作数。 CMP:比较指令,完成操作数1减去操作数2,结果不送操作数1,但影响标志位。可根据ZF(零)是否被置1判断相等;如果两者是无符号数,可根据CF判断大小;如果两者是有符号数,要根据SF和OF判断大小。 乘除运算指令 MUL 操作数:无符号数乘法指令。操作数不能是立即数。操作数是字节与AL中的无符号数相乘,16位结果送AX中。若字节,则与AX乘,结果高16送DX,低16送AX。如乘积高半部分不为零,则CF、OF为1,否则为0。所以CF和OF表示AH或DX中含有结果的有效数。IMUL 操作数:有符号数乘法指令。基本与MUL相同。 DIV 操作数:被除数是在AX(除数8位)或者DX和AX(除数16位),操作数不能是立即数。如果除数是0,或者在8(16)位除数时商超过8(16)位,则认为是溢出,引起0号中断。IDIV:有符号除法指令,当除数为0,活着商太大,太小(字节超过127,-127字超过32767,-32767)时,引起0号中断。 符号扩展指令 CBW,CWD:把AL中的符号扩展到寄存器AH中,不影响各标志位。CWD则把AX中的符号扩展到DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用XOR 清高8位或高16位。 逻辑运算指令与位移指令 注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。 NOT:取反,不影响标志位。 AND 操作数1 操作数2:操作结果送错作数1,标志CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志) SF(符号)反映运算结果,AF(辅助进位)未定义。自己与自己AND值不变,她主要用于将操作数中与1相与的位保持不变,与0相与清0。(都为1时为1)OR 操作数1 操作数2:自己与自己OR值不变,CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志)SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置1:

汇编语言指令集

汇编语言指令集 一、数据传输指令 1. 通用数据传送指令. MOV(MOVe) 传送字或字节. MOVS(MOVe String) 串传送指令 MOVSX先符号扩展,再传送. MOVZX先零扩展,再传送. PUSH把字压入堆栈. POP把字弹出堆栈. PUSHA把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG (eXCHanG)交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD先交换再累加.( 结果在第一个操作数里) XLAT(TRANSLATE) 字节查表转换. ── BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器) 输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535. 3. 目的地址传送指令. LEA (Load Effective Address)装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS (Load DS with pointer)传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES (Load ES with pointer)传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI. 4. 标志传送指令. LAHF (Load AH with Flags)标志寄存器传送,把标志装入AH. SAHF (Store AH into Flgs)标志寄存器传送,把AH内容装入标志寄存器. PUSHF (PUSH the Flags)标志入栈. POPF (POP the Flags)标志出栈.

单片机汇编语言实验教程(1).

本文由zaoangy贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 实验一熟悉MCS-51寻址方式及传送类指令 一.实验目的: 1.熟悉uVision2集成调试环境 2.熟悉 MCS-51寻址方式及传送类指令二.uVision2集成调试环境的使用uVision2是德国Keil Software公司用于多种嵌入式微处理器的一个理想、快速、 可靠的程序调试器。此调试器包含一个高速模拟器,能够让你模拟整个8051 系统,包括片上外围.....器件和外部硬件。 1.创建项目uVision2是以项目来管理你的任务,它可以使你的8051应用系统设计变得简单。要创建一个应用,你需要按下列步骤进行操作:①第一次使用,首先为我们编写的实验程序在D盘上新建一个文件夹D:\单片机实验;②启动uVision2,新建一个项目文件并从器件库中选择一个器件,操作步骤如下:直接在桌面上点击uVision2程序图标就可以启动它。要新建一个项目文件,从uVision 2的Project菜单中选择New Project,这将打开一个标准的Windows对话框,此对话框要求你输入项目文件名,例如为实验一新建项目:D:\单片机实验\ex1.vu2。紧接着,Select Device for Target,即为你的项目选择一个CPU。我们选择Gene ric下的8032。 2.新建一个源文件你可以用菜单选项File-New来新建一个源文件。这将打开一个空的编辑窗口让你输入你的源代码。编辑后,我们把我们的实验程序保存为D:\单片机实验\dpj1.asm。 3.将你的源文件加入到你的项目中在你的P roject Workspace窗口双击Target1及Suorce Group1,将你的目标系统一直展开到看到源文件组,如图1(a所示。右击Suorce Group1,出现Add files选项, 选择它可打开一个标准的文件对话框,从对话框中选择你刚刚生成的文件dpj1.asm 。 (a (b

MIPS 指令系统和汇编语言

第四章MIPS指令系统和汇编语言 1.考研预测:出题特点总结 本章是对统考408内容来说,本章是新增的章节。此外北航961大纲中制定了要考MIPS 指令集,从15年961真题来看MIPS是重中之重。但是今年计组并没有指定具体的教材,但大纲明确要求掌握MIPS指令集,所以还是建议考生将《计算机组成与设计:硬件/软件接口》中文版(原版第三版或第四版)作为本章的参考书籍。 本章大致内容是MIPS的基础知识,难度并不大。考生应该将重点放在MIPS指令集的基础上,考察C语言中的语句转换为对应的MIPS指令,所以需要熟练掌握C语言中一些语句对应的MIPS指令实现。本章出题很大可能就是C语言和MIPS汇编语言之间的转换,也可能涉及到第五章CPU指令流水线等内容。 2.考研知识点系统整理:梳理考点,各个击破 3.1 指令系统概述 机器指令要素 操作码:指明进行的何种操作 源操作数地址:参加操作的操作数的地址,可能有多个。 目的操作数地址:保存操作结果的地址。 下条指令的地址:指明下一条要运行的指令的位置,一般指令是按顺序依次执行的,所以绝大多数指令中并不显式的指明下一条指令的地址,也就是说,指令格式中并不包含这部分信息。只有少数指令需要显示指明下一条指令的地址。

指令执行周期 3.2 指令格式 一台计算机指令格式的选择和确定要涉及多方面的因素,如指令长度、地址码结构以及操

作码结构等,是一个很复杂的问题,它与计算机系统结构、数据表示方法、指令功能设计等都密切相关。 指令的基本格式 一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下: ( 其中A1为第一操作数地址,A2为第二操作数地址,A3为操作结果存放地址。 这条指令的含义:(A1)OP(A2)→A3 式中OP表示双操作数运算指令的运算符号,如“+”或“–”等。 (2)二地址指令

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;看门狗定时器清零(若已赋值,同时清预分频器)

基于单片机的汇编语言入门教程

入门教程2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用

汇编语言的各条指令

常用命令 数据传送指令 一通用数据传送指令 MOV指令为双操作数指令,两个操作数中不能全为内存操作数 格式:MOV DST,SRC 执行操作:dst = src 注:1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作。 格式:PUSH SRC //Word 执行操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) 注:1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器。

2.入栈时高位字节先入栈,低位字节后入栈。 格式:POP DST //Word 执行操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 注:1.出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器。 2.执行POP SS指令后,堆栈区在存储区的位置要改变。 3.执行POP SP 指令后,栈顶的位置要改变。 XCHG(eXCHanG)交换指令: 将两操作数值交换。 格式:XCHG OPR1,OPR2 //Byte/Word 执行的操作:(OPR1)<-->(OPR2) 注:1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 存储器与存储器之间不能交换数据。 二累加器专用传送指令 IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节)

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 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

51单片机汇编语言教程:28课音乐程序设计

51单片机汇编语言教程:第28课-音乐程序设计

下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。 程序清单(略,请参看源程序的说明)。 程序框图如图2所示。 <单片机音乐程序的设计图> 本课由单片机教程网提供,有问题指出. 硬件连接说明: 随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。。。。 音乐程序汇编代码代码1-------------Voice.asm--------------------------ORG0000H

LJMP START ORG000BH INC20H;中断服务,中断计数器加1 MOV TH0,#0D8H MOV TL0,#0EFH;12M晶振,形成10毫秒中断 RETI START: MOV SP,#50H MOV TH0,#0D8H MOV TL0,#0EFH MOV TMOD,#01H MOV IE,#82H MUSIC0: NOP MOV DPTR,#DAT;表头地址送DPTR MOV20H,#00H;中断计数器清0 MOV B,#00H;表序号清0 MUSIC1: NOP CLR A MOVC A,@A+DPTR;查表取代码 JZ END0;是00H,则结束 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 MUSIC5: NOP MOV R6,A INC DPTR MOV A,B MOVC A,@A+DPTR;取节拍代码送R7

常见汇编语言指令解释:

PC是一个16位的程序计数器。用于存放和指示下一条要执行的指令的地址。寻址范围达64KB。PC有自动加1功能,以实现程序的顺序执行。PC没有地址,是不可寻址的,无法用指令对它进行读写。但在执行转移、调用、返回等指令时能自动改变其内容,以改变程序的执行顺序。 参数代表的意义: 1、Rn 表示R0~R7中的一个 2、#data 表示8位的数值 00H~FFH 3、direct 表示8位的地址 00H~FFH(指的是内部RAM或SFR的地址) 4、@Ri 表示寄存器间接寻址只能是R0或者R1 5、@DPTR 表示数据指针间接寻址 6、bit 表示位地址 7、$ 表示当前地址 常见汇编语言指令解释: 寄存器寻址 MOV A,R1将R1中的数值赋予A 直接寻址 MOV A,3AH将地址3AH中的数值赋予A 立即寻址 MOV A,#3AH将3AH数值赋予A

寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A 变址寻址 MOVC A,@A+DPTR以A中的数值为地址偏移量进行查表 相对寻址 AJMP MATN跳转到行号为MATN处 位寻址 MOV C,7FH 将位地址7FH的数值赋予C MOV A,#3AH数据传输、赋值命令 PUSH direct将direct为地址的数值压入堆栈中 POP direct将direct为地址的数值弹出堆栈 XCH A,direct将direct中的数值与A进行交换 ADD A,direct将direct中的数值与 INC direct将direct中的数值加1 SUBB A,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零:CLR C DEC direct将direct中的数值减1 DA A 用于对BCD码加减法后进行10进制调整 MUL A B将A和B相乘,并把高八位放在B中,低八位放在A中 DIV A B将A和B相除,并把商放在A中,余数放在B中 ANL A,direct将A与direct中的数值进行与运算,结果保留在A 中(与运算规律:有0出0,全1出1) ORL A,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0) XRL A,direct将A与direct中的数值进行异或运算,结果保留在A 中(异或运算规律:全0出0,全1出0,01、10出1)

汇编语言常见指令

?PTR?操作符:强制类型转换 MOV BYTE PTR [BX], 20H ;1B立即数20H送DS:[BX] MOV WORD PTR [BX], 20H ;立即数20H送DS:[BX], ;00H送DS:[BX+1] 2.LEA(Load Effective Address) 设:变量X的偏移地址为1020H , (BP)=0020H 执行指令后: LEA DX, X LEA BX, [BP] ; 执行后, (DX) = 1020H ; 执行后, (BX) = 0020H 3.地址传送指令LDS,LES LDS REG16, MEM ; 从存储器取出4B,送入REG16和DS LES REG16, MEM ; 从存储器取出4B,送入REG16和ES 4.符号扩展指令CBW,CWD CBW ;将AL寄存器内容符号位扩展到AH CWD ;将AX寄存器内容符号位扩展到DX 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CBW ;(AX)= 0060H 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CWD ;(DX)= 0FFFFH,(AX)= 8060H 5.交换指令XCHG 例如,(AX)= 5678H 执行下面指令后 XCHG AH, AL ;(AX)= 7856H 6.换码指令XLAT XLAT ;AL←DS: [BX+AL] 表格的首地址事先存放在内存逻辑地址DS: BX中, AL的内容是相对于表格的位移量, 把对应内存的内容取出放在AL寄存器。 7.逻辑运算符 SHR(右移) SHL(左移) AND(与) OR(或) XOR(异或)

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;看门狗定时器清零(若已赋值,同时清预分频器)

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