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

汇编指令

汇编指令
汇编指令

第三章指令系统

第一节指令格式和寻址方式

所谓指令,就是计算机完成某种操作的命令。一台计算机所具有的全部指令称为该机器的指令系统。指令系统全面描述了CPU的功能。指令系统是由生产厂家确定的。不同的CPU有不同的指令系统。

编程语言是人机对话的工具,按使用层次可分为机器语言、汇编语言和高级语言。机器语言(二进制代码)能直接被机器识别,程序运行效率高,但编程效率低,不便于阅读,书写和交流。引入助记符,将机器语言符号化后就是汇编语言,其程序直观。用汇编语言编写的程序称为汇编语言程序。汇编语言程序必须经过汇编(机器汇编或手工汇编)成为机器语言后才能被机器执行。

例如指令: MOV 20H, #11H

指令机器码为: 752011H

指令功能:将11H送到内部RAM20H单元。

高级语言编程效率高,但程序运行效率低。

一、指令格式

1.汇编语言指令格式

汇编语言语句是构成汇编语言源程序的基本单元。8051汇编语言指令格式为:

[标号:] 操作码助记符[操作数1] [,操作数2] [,操作数3] [;注释]

(1)标号表示该指令所在的地址,是用户根据程序需要(子程序入口或转移指令目标地址)而设定的符号地址。汇编时,以该指令所在的地址来代替标号。标号是以英文字母开始的由1-8个字母或数字组成的字符串,以“:”结束。(2)操作码助记符是表示指令操作功能的英文缩写。是指令的核心部分,每条指令都必须有操作码,不能缺省。

(3)操作数字段表示指令的操作对象,其表示形式与寻址方式有关。指令中的操作数可以是0个,1个,2个和3个,操作数和操作码之间以空格分隔。操作数之间以逗号分隔。双操作数时,逗号前面的操作数称为源操作数;逗号后面的操作数称为目的操作数。

(4)注释,是编程者为该指令或该程序段功能进行的说明,是为方便程序阅读

的一种说明。

2.机器语言指令格式

机器语言指令是一种二进制代码,由操作码和操作数两部分组成。操作码规定了指令进行的操作,是指令中的关键字,不能缺省。操作数表示该指令的操作对象。

MCS-51系列单片机的指令,按指令长度可分为单字节指令,双字节指令和三字节指令三种,分别占用1-3个存储单元。机器指令的格式为:

(1)单字节指令

操作码本身就隐含了操作数的信息,不需再加操作数。

例如:汇编语言指令 MOV A, Rn ;A←(Rn)

指令机器码为:

(2)双字节指令

首字节为操作码,第二个字节为操作数或操作数地址。

例如:汇编语言指令MOV Rn, direct ;Rn←(direct)

指令机器码为:

(3)三字节指令

首字节为操作码,后两个字节为操作数或操作数地址。

例如:汇编语言指令 MOV DPTR, #DATA16

指令机器码为:

又如:汇编语言指令: MOV direct, #DATA,

指令机器码为:

3.伪指令

在汇编语言中,除了可执行的指令外,为方便程序的编写,还定义了一些伪指令。伪指令是对汇编语言程序做出的一些必要说明。在汇编过程中,伪指令为汇编程序提供必要的控制信息,不产生任何指令代码,因此也称为不可执行指令。常见的伪指令有:

(1)ORG(oRigin)汇编起始地址命令

格式:ORG nn

ORG后面16位地址表示此语句后的程序或数据块在程序存储器中的起始地址。

例如:ORG 1000H

START:MOV A,#32H

上述指令说明:START表示的地址为1000H,MOV指令从1000H存储单元开始存放。

(2)DB(Define Byte)定义字节数据命令

格式:[名字:] DB n1, n2, n3,………,n N

该命令表示将DB后面的若干个单字节数据存入指定的连续单元中。每个数据(8位)占用一个字节单元,通常用于定义一个常数表。注意:名字也是一个符号地址,但以名字表示的存储单元之中存放的是数据,而不是指令代码,故不能做为转移指令的目标地址,这一点与标号不同。

例如: ORG 2000H

TAB1:DB 01H,04H,08H,10H

以上伪指令汇编后从2000H单元开始定义(存放)4个字节数据(平方表):(2000H)=01H,(2001H)=04H,(2002H)=09H,(2003H)=10H。

(3)DW(Define word)定义字数据命令

格式:[名字:] DW nn1, nn2,……,nnN

该命令表示将DW后面的若干个字数据存入指定的连续单元中。每个数据(16位)占用两个存储单元,其中高8位存入低地址字节,低8位存入高地址字节。常用于定义一个地址表。

例如:ORG 2100H

TAB2:DW 1067H, 1000H, 100

汇编后:(2100H)=10H,(2101H)=67H,

(2102H)=10H,(2103H)=00H,

(2104H)=00H,(2105H)=64H。

(4)DS 定义存储区命令

格式:[名字:] DS X

从指定的地址单元开始,预留X字节单元备用。

例如: ORG 2000H

L1:DS 07H

L2:DB 86H,0A7H

汇编后,从2000H开始保留7个字节单元,从2007H单元开始按DB命令给内存单元赋值:

(2007H)=86H

(2008H)=0A7H

注意:DB、DW、DS伪指令只能对程序存储器进行赋值和初始化工作,不能用来对数据存储器进行赋值和初始化工作。

(5)EQU(Equat)赋值命令

格式:字符名EQU 数或汇编符号

本命令给字符名赋予一个数或特定的汇编符号。赋值后,指令中可用该符号名来表示数或汇编符号。

例如:TEMP EQU R4

X EQU 16

第一条指令将TEMP等值为汇编符号R4,此后的指令中TEMP可以代替R4来使用。第二条指令表示指令中可以用X代替16来使用。注意使用EQU命令时

必须先赋值后使用。注意字符名不能和汇编语言的关键字同名,如A,MOV,B 等。

(6)DATA 数据地址赋值命令

格式:字符名DATA nn

DATA命令是将数据地址或代码地址赋予规定的字符名称。

(7)BIT 定义位地址符号命令

格式:字符名BIT bit

将位地址bit赋予所定义的字符名。

(8)END 汇编结束命令

END表示汇编语言源程序到此结束。

二、寻址方式

操作数是指令的一个重要组成部分,CPU在规定的寻址空间获得操作数地址的方式,称为寻址方式。寻址方式不仅影响指令的长度,还影响指令的执行速度。

MSC-51系列单片机共有七种寻址方式:

(一)立即寻址

操作数作为指令的一个组成部分存放在程序存储器中。这种寻址方式称为立即寻址,该操作数称为立即数。立即数前加“#”标记,以便和直接寻址方式相区分。

例如指令:MOV A,#40H ;A←40H

该指令将立即数40H送累加器A中。指令执行后: (A)=40H,指令中用“#”表示立即数。立即寻址示意图如图3-1所示:

(二)直接寻址

直接寻址方式是在指令代码中直接给出操作数的地址。这种寻址方式是对内部数据存储器进行访问。

直接寻址方式可寻址的空间:

1.内部RAM的低128字节单元地址空间;

2.特殊功能寄存器SFR地址空间(直接寻址是访问SFR的唯一方式);

3.位地址空间。

例如指令: MOV A, 50H ;A←(50H)

该指令是把内部RAM中50H单元(直接寻址)的内容送入累加器A中。假设指令执行前A的内容为8BH(表示为(A)=8BH),50H单元的内容为36H(表示为(50H)=36H),则指令执行后:(A)=36H,(50H)=36H(不变)。

寻址示意如图3-2所示:

(三)寄存器寻址

寄存器寻址方式是指指令中给出寄存器名称,其内容作为操作数。这种寻址方式对当前工作寄存器R0-R7进行访问,指令操作码的低三位指明了所用的寄存器;对累加器A,寄存器B,数据指针DPTR也可以用寄存器寻址来访问。寄存器寻址方式的可寻址空间:

1.当前工作寄存器R0-R7(当前工作寄存器区由RS1、RS2来选定);

2.累加器A、寄存器B、数据寄存器DPTR。

例如指令:MOV A, R2 ;A←(R2)

该指令是将工作寄存器R2的内容送给累加器A。假设指令执行前A的内容为08H(表示为(A)=08H),R2的内容为4EH(表示为(R2)=4EH),则指令执行后:(A)=4EH,(R2)=4EH(不变)。

寻址示意图如图3-3所示:

(四)寄存器间接寻址方式

指令中给出寄存器,以寄存器的内容作为操作数的地址,把该地址对应单元的内容作为操作数。

寄存器间接寻址的可寻址空间:

1.内部RAM 00H-7FH(@R0、@R1、SP);

2.外部RAM 0000H—FFFFH(@R0、@R1、@DPTR)。

在访问外部RAM的页内256个单元××00H-××FFH时,用R0,R1工作寄存器间接寻址。

在访问外部RAM整个64KB(0000H-FFFFH)地址空间时,用数据指针DPTR 来间接寻址。

例如指令:MOV A, @R0 ;A←((R0))

该指令的操作为将寄存器R0的内容(设(R0)=50H)作为地址,把片内RAM50H 单元的内容(设(50H)=48H)送入累加器A,指令执行后(A)=48H。指令中“@”表示寄存器间接寻址,称之为间址符。

寄存间接寻址示意如图3—4所示:

(五)变址寻址

寻址空间:程序存储器(@A+DPTR,@A+PC)

变址寻址是MCS—51系列单片机指令系统所特有的一种寻址方式。它以程序计数器PC或数据指针DPTR作为基址寄存器,以累加器A作为变址寄存器(存放8位无符号的偏移量),两者内容相加形成16位程序存储器地址作为指令操作数的地址。这种寻址方式用于读取程序存储器中的常数表。

例如指令: MOVC A, @A+DPTR ;A←((A)+(DPTR))

该指令是把DPTR的内容作为基地址,把A的内容作为偏移量,两量相加形成16位地址,将该地址的程序存储器ROM单元的内容送给A。假设指令执行前为:(DPTR)=2100H,(A)=56H,(2156H)=36H,则该指执行后:(A)=36H。

寻址过程如图3—5所示:

(六)相对寻址

寻址空间:程序存储器。

相对寻址方式只用于相对转移指令中。相对转移指令是以本指令的下一条指令的首地址PC为基地址,与指令中给定的相对偏移量rel相加之和作为程序的转移目标地址。偏移量rel是8位二进制补码(与PC相加时,rel需符号扩展成16位)。转移范围为当前PC值的-128~+127个字节单元之间。相对寻址一般为双字节或三字节指令。

例如指令: JZ 30H ;当(A)=0时,则PC←(PC)+2+REL,程序转移。

;当(A)=1时,则PC←(PC)+2。程序按原顺序执行。

该指令为双字节指令,其执行过程如图3—6所示:

(七)位寻址

寻址空间:

1.片内RAM的位寻址区域是:

20H—2FH共16个单元128位,其位地址编码位00H—7FH。

2.字节地址能被8整除的SFR(12个)。对这些寻址位,可以有以下四种表示方法:

①直接位地址方式,如: 0D5H;

②位名称方式,如:F0;

③点操作符方式,如PSW·5或0D0H·5;

④用户定义名方式,如:用伪指令bit定义USR_FLG bit F0,经定义后,允许指令用USR_FLG代替F0。

以上四种方式指的都是PSW中的第5位。

MCS—51单片机中设有独立的位处理器。位操作命令能对可以位寻址的空间进行位操作。

例如指令: MOV C,07H ;Cy ←(07H)

该指令属位操作指令,将内部RAM20H单元的D7位(位地址为07H)的内容送给位累加器Cy,指令的操作过程如图3—7所示:

以上我们介绍了MCS—51指令系统的7种寻址方式。实际上指令中有两个或3个操作数时,往往就具有几种类型的寻址方式。

例如指令: MOV B, #4FH

寄存器寻址立即寻址

第二节指令系统

本节要介绍的指令系统与前一章介绍的单片机基本硬件结构(即编程结构)是MCS—51单片机程序设计模型,是进行汇编语言程序设计的基础。

一、指令系统说明

单片机与一般通用微处理器指令系统的区别在于突出了控制功能,具体表现为有大量的转移指令和位操作指令。

1.分类

MCS—51单片机的指令系统内容丰富、完整,功能较强。共有111条指令,按功能可以分为五大类

(1)数据传送指令(29条)

(2)算术运算指令(24条)

(3)逻辑运算指令(24条)

(4)控制转移指令(22条)

(5)位操作指令(12条)

2.指令说明

对于每一条指令,学习时要注意掌握以下几点:

(1)指令的功能

(2)指令操作数的合法寻址方式

(3)指令对标志的影响

(4)指令的长度和执行时间

3.指令中符号的约定

在介绍汇编指令系统时,指令中的符号约定如下:

(1)Rn(n=0-7):当前选中的工作寄存器组的工作寄存器R0-R7。

(2)@Ri(i=0、1):以R0或R1作寄存器间接寻址,“@”为间址符。

(3)direct:8位直接地址。可以是内部RAM单元地址(00H-7FH),或特殊功能寄存器(SFR)地址(80H-FFH)。

(4)@DPTR:以数据指针DPTR的内容(16位)为地址的寄存器间接寻址,对外部RAM64K地址空间寻址。

(5)#data:8位立即数“#”表示DATA是立即数不是直接寻址。

(6)#data16:16位立即数。

(7)addr11:11位直接地址。短转移(AJMP)及短调用(ACALL)指令中

为转移目标地址,2K范围内转移,指令中用标号代替。

(8)addr16:16位直接地址。长转移(LJMP)及长调用(LCALL)指令中为转移目标地址,转移范围64K,指令中用标号代替。

(9)REL:相对转移地址,8位补码地址偏移量为-128— +127,指令中用标号代替。

(10)DPTR:16位数据指针。

(11)bit:位地址。内部RAM20H-2FH中可寻址位和SFR中的可寻址位。

(12)A:累加器。

(13)B:B寄存器。

(14)C:即Cy位,进位标志或进位位,或位操作指令中的位累加器。

(15)/:位操作数的取反操作前缀,如/bit 。

(16)(X):X中的内容。

(17)((X)):由X间接寻址的单元中的内容。

(18)←:箭头右边内容送箭头所指的单元。

说明:由于历史原因,为了与大多数书籍、资料目前书写习惯一致,在表示符号位(Cy,OV,EA等)的内容时,在不会引起误解的前提下,采取:BIT=X而非(BIT)=X的形式,请读者在阅读以下章节时留意。

二、数据传送指令

数据传送指令共有29条,分为片内寄存器,数据存储器传送(MOV)指令,片外数据存储器传送(MOVX)指令,程序存储器内查表(MOVC)指令,数据交换(XCH、XCHD、SWAP)指令和堆栈操作(PUSH、POP)指令。源操作数可以采用寄存器,寄存器间接,直接,立即,变址5种方式,目的操作数可以采用前3种寻址方式。数据传送指令是编程时使用最频繁的一类指令。

数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行后,源操作数不改变,目的操作数修改为源操作数。如果要求在数据传送时,不丢失目的操作数,则可以用交换指令。

数据传送指令不影响标志。这里所说的标志是指C,AC和OV,不包括检验累加器奇偶的标志P。对于P一般不加说明。

1.片内数据RAM及寄存器间的数据传送指令(16条)

(1)以累加器A为目的操作数的指令(4条)

①指令的功能是把源操作数的内容送入累加器A中。源操作数可以为寄存器寻址,直接寻址,寄存器间接寻址和立即寻址。

②源操作数是Rn时,属寄存器寻址。MCS-51内部RAM区中有4组工作寄存器,每组由8个寄存器组成。可通过改变PSW中的RS0,RS1来切换当前工作寄存器组。

例3-1:

MOV A, R4 ;A←(R4)

MOV A, 70H ;A←(70H)

MOV A,@R1 ;A←((R1))

MOV A,#88H ;A←88H

(2)以Rn为目的操作数的指令(3条)

该组指令的功能是把源操作数的内部送到当前工作寄存器区中的R7-R0中的某一个寄存器。源操作数可以为寄存器寻址,直接寻址和立即寻址方式。

例3-2:

MOV R2, A ;R2←(A)

MOV R6, 70H ;R6←(70H)

MOV R4, #40H ;R4←40H

(3)以直接地址为目的操作数的指令(5条)

该组指令的功能是把源操作数的内容送入直接地址所指的存储单元。源操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址方式。

例3-3:

MOV P1, A ; P1←(A)

MOV 64H, R6 ; 64H←(R6)

MOV 10H, #98H ; 10H←98H

MOV 20H, 48H ; 20H←(48H)

MOV 24H, @R0 ; 24H←((R0))

(4)以寄存器间接地址为目的操作数的指令(3条)

该组指令的功能是把源操作数的内容送入R0或R1寄存器间接寻址所确定的内部RAM单元中。源操作数也可以为寄存器寻址、直接寻址和立即寻址方式。

例3-4:

MOV @R0, 20H ;(R0)←(20H)

MOV @R1, A ;(R1)←(A)

MOV @R0, #28H ;(R0)←28H

(5)16位数据传送指令(1条)

该条指令是整个指令系统中唯一的一条16位数据传送指令,通常用来设置地址指针,DPTR由DPH和DPL组成,该指令传送时,把高八位立即数送入DPH。低8位立即数送入DPL中。

MOV指令用于寻址内部RAM和SFR,MOV指令对内部RAM和SFR的操作功能可用图3-8描述。

2.堆栈操作指令(2条)

由第二章已知,堆栈是在内部RAM中开辟的一个特定的存储区,栈顶地址由堆栈指针SP指示,SP总是指向栈顶。堆栈按“先进后出”原则存取数据。堆栈操作有两种,数据存入称“入栈”或“压入(数据)”,数据取出称“出栈”或“弹出”。堆栈在子程序调用及中断服务时用于现场和返回保护,还可以用于参数传递等。

进栈指令先进行指针调整,即堆栈指针SP加1,再把direct值入栈。出栈指令是先将栈顶内容弹出给direct,再进行指针调整,即堆栈指针SP减“1”。

例3-5 已知当前(SP)=38H,(10H)=70H;

执行指令:

PUSH 10H

指令执行后;(SP)=39H,(10H)=70H,(39H)=70H。

该指令的执行过程如图3-9所示:

例3-6 已知(SP)=40H,(40H)=68H,(A)=20H,

执行指令:

POP ACC

指令执行后;(SP)=3FH,(40H)=68H,(A)=68H

指令的执行过程如图3-10所示:

3.数据交换指令(5条)

数据交换指令有字节交换指令和半字节交换指令两种。字节交换指令可以将累加器A的内容与内部RAM中任一个单元以字节为单位进行交换;半字节交换指令可以将累加器A的高半字节和低半字节进行交换,或将累加器A的低半字节与@Ri寻址单元的低半字节相互交换。

例3-7 已知(A)=56H,(R0)=20H,(20H)=78H,(10H)=18H,(R4)=8AH;

单独执行指令:① XCH A, 10H

② XCH A, R4

③ XCH A, @R0

指令执行后:①(A)=18H,(10H)=56H;

②(A)=8AH,(R4)=56H;

③(A)=78H,(R0)=20H,((R0))=(20H)=56H。

例3-8 已知(A)=7AH,(R1)=48H,(48H)=0DH;

执行指令: XCHD A,@R1

指令执行后:(A)=7DH,(R1)=48H,((R1))=(48H)=0AH。

4.片外RAM数据传送指令(4条)

片外RAM的数据传送指令助记符为MOVX。片外数据存储器为读写存储器,与累加器A可实现双向操作。片外数据存储器(RAM)使用寄存器间接寻址。

注意,MSC-51扩展的I/O接口的端口地址占用的是片外RAM的地址空间,因此对扩展的I/O接口而言,这4条指令为输出/输出(I/O)指令。MCS-51只能用这种方式与连接在扩展的I/O口外部设备进行数据传送。

指令中以DPTR为片外RAM的16位地址指针时,由P0口送出低8位地址,由P2口送出高8位地址,寻址范围为64KB;以R0或R1为片外RAM的低8位地址指针时,由P0口送出8位地址,P2口的状态不变化,寻址范围为256个单元(即一页)。

5.程序存储器查表指令(2条)

程序存储器查表指令的助记符为MOVC。程序存储器为只读存储器。程序运行中所需的一些常数,常数和表格,通常是由用户先将其写在程序存储器中,程序需从程序存储器中读出数据时,采用变址寻址方式将表格常数读入累加器A 中。

例3-9 已知(A)=38H,

执行指令:1000H:MOVC A,@A+PC

解:该指令以PC内容加1后的当前值作为基址寄存器,累加器A为变址寄存器(8位无符号整数),两者内容相加得到一个16位地址。将该地址对应的程序存储器单元的内容送给累加器A。所以上面指令的操作是将程序存储器1039H 单元的内容送给累加器A。

说明:累加器A为8位无符号整数,表格位置(查表指令后255字节内)和表格长度(小于255字节)受限制。

例3-10 已知(A)=50H,(DPTR)=5000H;

执行指令:MOVC A, @A+DPTR

解:该指令以DPTR为基址寄存器,累加器A为变址寄存器,因此该指令执行的操作是将程序存储器中5050H单元的内容送入A中。

以上是介绍的数据传送指令是用得最多、最频繁的一类指令,读者应熟记8种助记符的功能以及能采用的操作数寻址方式。

三、算术运算指令

MSC—51的算术运算指令共有24条。分为:

加法指令(ADD,ADDC,INC);

带借位减法指令(SUBB,DEC);

乘除指令(MUL,DIV)和十进制调整指令(DA)等。

MSC—51运算指令能直接执行8位数的运算,借助程序状态字PSW中的标志可以实现多精度数的加、减运算,同时可以对压缩的BCD(一个字节表示两位十进制数)数进行加法运算。

算术运算指令对程序状态字(PSW)中标志的影响如表3-1所示:

“×”表示影响该标志位,“-”表示不影响该标志位,“0”表示该标志位清零。(一)加法指令

(1)不带进位的加法指令(4条)

这组指令的特点是:被加数总是累加器A值,相加结果保存在累加器A中。

加法指令影响PSW中的标志位。两个字节数相加时:

①如果第7位有进位,则Cy=1,否则Cy=0;

②如果第3位有进位,则AC=1,否则AC=0;

③如果第6位有进位,而第7位无进位或第6位有无进位而第7位有进位(表示有符号数相加结果超出表示范围),则OV=0,否则OV=0。若以J7,J6表示

(完整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段寄存器中。

【EN】单片机汇编指令讲解

2-71 Microcontroller Instruction Set For interrupt response time information, refer to the hardware description chapter. Note: 1.Operations on SFR byte address 208 or bit addresses 209-215 (that is, the PSW or bits in the PSW) also affect flag settings. Instructions that Affect Flag Settings (1) Instruction Flag Instruction Flag C OV AC C OV AC ADD X X X CLR C O ADDC X X X CPL C X SUBB X X X ANL C,bit X MUL O X ANL C,/bit X DIV O X ORL C,bit X DA X ORL C,/bit X RRC X MOV C,bit X RLC X CJNE X SETB C 1 The Instruction Set and Addressing Modes R n Register R7-R0 of the currently selected Register Bank. direct 8-bit internal data location’s address. This could be an Internal Data RAM location (0-127) or a SFR [i.e., I/O port, control register, status register, etc. (128-255)]. @R i 8-bit internal data RAM location (0-255) addressed indirectly through register R1or R0. #data 8-bit constant included in instruction.#data 1616-bit constant included in instruction. addr 1616-bit destination address. Used by LCALL and LJMP . A branch can be anywhere within the 64K byte Program Memory address space. addr 11 11-bit destination address. Used by ACALL and AJMP . The branch will be within the same 2K byte page of program memory as the first byte of the following instruction. rel Signed (two’s complement) 8-bit offset byte. Used by SJMP and all conditional jumps. Range is -128 to +127 bytes relative to first byte of the following instruction. bit Direct Addressed bit in Internal Data RAM or Special Function Register.

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

(完整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):堆栈段寄存器;

ARM的汇编指令讲解

汇编知识点的要求: 1、能看的懂 2、可以做修改 3、不需要用汇编直接编写程序 汇编代码的应用场合: 1、ARM的启动代码必须要汇编,如:uboot最开始初始化硬件的代码 2、内核在最开始初始化的位置。。。。 一、ARM汇编指令的编码格式 1、编码格式 ARM汇编指令编译成机器码以后,机器码的长度是32bits,这32bits的编码有一个固定的格式。不同ARM 汇编指令,编码格式不同。 2、举例 C: if(a==10) a++; else a--;

汇编1: CMP R0, #10; ADDEQ R0,R0,#1 SUBNE R0,R0,#1 汇编2 SUBS R1, R0, #10; //S ---运算的结果会影响条件码标志位:CPSR:NZCV ADDEQ R0,R0,#1 SUBNE R0,R0,#1 提示: 空指令NOP,实际上是占用CPU的时间,但是执行后,没有什么意义。 NOP ---- MOV R0,R0 3、条件码标识 10 -10 Z = 1 C = 0 N = 0 V = 0 ================================================================================= 二、ARM的寻址方式 1、立即数寻址 操作数,有立即数。 ADD R0,R0,#1

MOV R1,#10 ORR R1,R1,#0xf @ R1=R1 | 0xf BIC R1,R1,#0xf @R1 = R1&(~(0xf)) 错误: ADD R1,#1,#2 注意:立即数合法的条件 在ARM汇编指令中,并不是所有的立即数,立即数是有一定的限制的。 什么样的立即数是合法的??? 1、如果一个立即数是小于256的(即该立即数是8bits以内的,0~255),该立即数是合法的。 2、如果一个立即数是大于等于256,该立即数经过循环左移偶数位,可以得到一个小于256的数,则该立即数合法。 256 = 0x100 ------→左移20位0x10000000----→左移4 0x1 合法 0x111 非法 0x102 非法 0x104 合法 0xfff 0xff00 0x12000 0x450000 0xab 原因: 在数据处理指令编码的时候,立即数用12bits来表示: 高4bits:循环左移左移偶数位除以2 低8bits:循环左移后的结果。 重要问题: ADD R1,R0,#0xffff 非法 解决: LDR R2,=0xffff // R2=0xffff,将立即数0xffff的值传送给R2 ADD R1, R0, R2 2、寄存器寻址 所有的操作数都是寄存器,没有立即数 ADD R0,R0,R1 MOV R1,R0 ORR R1,R1,R0 @ R1=R1 | 0xf BIC R1,R1,R0 @R1 = R1&(~(0xf))

DSP汇编指令总结

DSP汇编指令总结 一、寻址方式: 1、立即寻址: 短立即寻址(单指令字) 长立即数寻址(双指令字) 第一指令字 第二指令字 16位常数=16384=4000h 2、直接寻址 ARU 辅助寄存器更新代码,决定当前辅助寄存器是否和如何进行增或减。N规定是否改变ARP值,(N=0,不变)

4.3.1、算术逻辑指令(28条) 4.3.1.1、加法指令(4条); 4.3.1.2、减法指令(5条); 4.3.1.3、乘法指令(2条); 4.3.1.4、乘加与乘减指令(6条); 4.3.1.5、其它算数指令(3条); 4.3.1.6、移位和循环移位指令(4条); 4.3.1.7、逻辑运算指令(4条); 4.3.2、寄存器操作指令(35条) 4.3.2.1、累加器操作指令(6条) 4.3.2.2、临时寄存器指令(5条) 4.3.2.3、乘积寄存器指令(6条) 4.3.2.4、辅助寄存器指令(5条) 4.3.2.5、状态寄存器指令(9条) 4.3.2.6、堆栈操作指令(4条) 4.3.3、存储器与I/O操作指令(8条)4.3.3.1、数据移动指令(4条) 4.3.3.2、程序存储器读写指令(2条) 4.3.3.3、I/O操作指令(2条) 4.3.4、程序控制指令(15条) 4.3.4.1、程序分支或调用指令(7条) 4.3.4.2、中断指令(3条) 4.3.4.3、返回指令(2条) 4.3.4.4、其它控制指令(3条)

4.3.1、算术逻辑指令(28条) 4.3.1.1、加法指令(4条); ▲ADD ▲ADDC(带进位加法指令) ▲ADDS(抑制符号扩展加法指令) ▲ADDT(移位次数由TREG指定的加法指令) 4.3.1.2、减法指令(5条); ★SUB(带移位的减法指令) ★SUBB(带借位的减法指令) ★SUBC(条件减法指令) ★SUBS(减法指令) ★SUBT(带移位的减法指令,TREG决定移位次数)4.3.1.3、乘法指令(2条); ★MPY(带符号乘法指令) ★MPYU(无符号乘法指令) 4.3.1.4、乘加与乘减指令(6条); ★MAC(累加前次积并乘)(字数2,周期3) ★MAC(累加前次积并乘) ★MPYA(累加-乘指令) ★MPYS(减-乘指令) ★SQRA(累加平方值指令) ★SQRS(累减并平方指令) 4.3.1.5、其它算数指令(3条); ★ABS(累加器取绝对值指令) ★NEG(累加器取补码指令) ★NORM(累加器规格化指令) 返回 4.3.1.6、移位和循环移位指令(4条); ▲ SFL(累加器内容左移指令) ▲ SFR(累加器内容右移指令) ▲ROL(累加器内容循环左移指令) ▲ROR(累加器内容循环右移指令) 返回 4.3.1.7、逻辑运算指令(4条); ▲ AND(逻辑与指令) ▲ OR(逻辑或指令) ▲ XOR(逻辑异或指令) ▲ CMPL(累加器取反指令) 返回 4.3.2、寄存器操作指令(35条) 4.3.2.1、累加器操作指令(6条)

(完整版)微机原理与接口技术汇编语言指令详解吐血版,推荐文档

第一讲 第三章指令系统--寻址方式 回顾:8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及有效地址的计算。 教学方法、实施步骤时间分配教学手段 回顾5”×2讲授40” ×2提问3” ×2小结2” ×2 板书 计算机 投影仪 多媒体课件等 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码操作数……操作数 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地 址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作 数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟 在操作码的后面,与操作码一起放在代码段区域 中。如图所示。

例如:MOV AX,3000H 立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址

STM 常用汇编指令

在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。 ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。 ARM指令使用的基本格式如下: 〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉} opcode操作码;指令助记符,如LDR、STR等。 cond可选的条件码;执行条件,如EQ、NE等。 S可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。 Rd目标寄存器。 Rn存放第1操作数的寄存器。 operand2第2个操作数 arm的寻址方式如下: 立即寻址 寄存器寻址 寄存器间接寻址 基址加偏址寻址 堆栈寻址 块拷贝寻址 相对寻址 这里不作详细描述,可以查阅相关文档。 数据处理指令 Load/Store指令 程序状态寄存器与通用寄存器之间的传送指令 转移指令 异常中断指令 协处理器指令 在S3C2410、S3C2440的数据手册中对各种汇编指令有详细的描述;这里只对较常见的作写介绍。 1、相对跳转指令:b、bl 这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。 这两条指令的可跳转范围是当前指令前后32M。 b funa .... funa: b funb ....

funb: .... 2、数据传送指令mov,地址读取伪指令ldr mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。 mov r1,r2 mov r1,#1024 mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。 ldr r1,=1024 3、内存访问指令ldr、str、ldm、stm ldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有'='时标伪指令,否则表内存访问指令。 ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。 ldr r1,[r2,#4] ldr r1,[r2] ldr r1,[r2],#4 str r1,[r2,#4] str r1,[r2] str r1,[r2],#4 寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下: LDM/STM{}Rn{!}, 4、加减指令add、sub add r1,r2,#1 sub r1,r2,#1 5、程序状态寄存器的访问指令msr,mrs ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。这两条指令分别是: 状态寄存器到通用寄存器的传送指令(MRS) 通用寄存器到状态寄存器的传送指令(MSR) 其汇编格式如下: MRS{}Rd,CPSR|SPSR 其汇编格式如下:

OllyICE反汇编教程及汇编命令详解

OllyICE反汇编教程及汇编命令详解[转] 2009-02-11 08:09 OllyICE反汇编教程及汇编命令详解 内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数; 寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,

AVRmega8汇编指令汇总.

指令集概述 指令操作数说明操作标志 # 时钟数 算数和逻辑指令 ADD Rd, Rr 无进位加法Rd ← Rd + Rr Z,C,N,V,H 1 ADC Rd, Rr 带进位加法Rd ← Rd + Rr + C Z,C,N,V,H 1 ADIW Rdl,K 立即数与字相加Rdh:Rdl ← Rdh:Rdl + K Z,C,N,V,S 2 SUB Rd, Rr 无进位减法Rd ← Rd - Rr Z,C,N,V,H 1 SUBI Rd, K 减立即数Rd ← Rd - K Z,C,N,V,H 1 SBC Rd, Rr 带进位减法Rd ← Rd - Rr - C Z,C,N,V,H 1 SBCI Rd, K 带进位减立即数Rd ← Rd - K - C Z,C,N,V,H 1 SBIW Rdl,K 从字中减立即数Rdh:Rdl ← Rdh:Rdl - K Z,C,N,V,S 2 AND Rd, Rr 逻辑与Rd ← Rd ? Rr Z,N,V 1 ANDI Rd, K 与立即数的逻辑与操作Rd ← Rd ? K Z,N,V 1 OR Rd, Rr 逻辑或Rd ← Rd v Rr Z,N,V 1 ORI Rd, K 与立即数的逻辑或操作Rd ← Rd v K Z,N,V 1 EOR Rd, Rr 异或Rd ← Rd ⊕ Rr Z,N,V 1 COM Rd 1 的补码Rd ← 0xFF ? Rd Z,C,N,V 1 NEG Rd 2 的补码Rd ← 0x00 ? Rd Z,C,N,V,H 1 SBR Rd,K 设置寄存器的位Rd ← Rd v K Z,N,V 1

CBR Rd,K 寄存器位清零Rd ← Rd ? (0xFF - K Z,N,V 1 INC Rd 加一操作Rd ← Rd + 1 Z,N,V 1 DEC Rd 减一操作Rd ← Rd ? 1 Z,N,V 1 TST Rd 测试是否为零或负Rd ← Rd ? Rd Z,N,V 1 CLR Rd 寄存器清零Rd ← Rd ⊕ Rd Z,N,V 1 SER Rd 寄存器置位Rd ← 0xFF None 1 MUL Rd, Rr 无符号数乘法R1:R0 ← Rd x Rr Z,C 2 MULS Rd, Rr 有符号数乘法R1:R0 ← Rd x Rr Z,C 2 MULSU Rd, Rr 有符号数与无符号数乘法 R1:R0 ← Rd x Rr Z,C 2 FMUL Rd, Rr 无符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2 FMULS Rd, Rr 有符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2 FMULSU Rd, Rr 有符号小数与无符号小数乘法R1:R0 ← (Rd x Rr << 1 Z,C 2跳转指令 RJMP k 相对跳转PC ← PC + k + 1 无 2 IJMP 间接跳转到(Z PC ← Z 无 2 RCALL k 相对子程序调用PC ← PC + k + 1 无 3 ICALL 间接调用(Z PC ← Z 无 3 RET 子程序返回PC ← STACK 无 4 RETI 中断返回PC ← STACK I 4

微机原理与接口技术汇编语言指令详解吐血版

第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过 程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及 有效地址的计算。 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码 操作数 …… 操作数 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。 例如:MOV AX ,3000H

立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄

汇编语言指令分类详解

3.1 8086/8088寻址方式 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在 操作码的后面,与操作码一起放在代码段区域中。 如图所示。 例如:MOV AX,3000H 立即数可以是8位的,也可以是16位的。若 是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如:MOV AX,DS:[2000H];

图2-2 (对DS来讲可以省略成MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以 分成两种情况: (1)以SI、DI、BX间接寻址,则 通常操作数在现行数据段区域 中,即数据段寄存器(DS)*16 加上SI、DI、BX中的16位偏移 量,为操作数的地址, 例如:MOV AX,[SI] 操作数地址是:(DS)*16+(SI) (2)以寄存器BP间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS)*16与BP的内容相加作为操作数的地址, 例如:MOV AX,[BP] 操作数地址是:(SS)*16+(BP)若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。 例如:MOV AX,DS:[BP] 操作数地址是:(DS)*16+(BP)5.变址寻址 由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个

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

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 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:

(整理)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

汇编符号大全

80X86 汇编指令符号大全 +、-、*、/∶算术运算符。 &∶宏处理操作符。宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了。 $∶地址计数器的值——记录正在被汇编程序翻译的语句地址。每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。 ?∶操作数。在数据定义语句中,操作数用?,其作用是分配并保留存储空间,但不存入确定的数据。 =∶等号伪指令——符号定义。对符号进行定义和赋值,功能与EQU相似,但允许(重复)再定义。 :∶修改属性运算符(操作符)——段操作符。用来临时给变量、标号或地址表达式指定一个段属性(不用缺省的段寄存器),自动生成一个“跨段前缀字节”。注意,段寄存器CS和ES不能被跨越,堆栈操作时也不能跨越SS。 ;∶注释符号。 %∶特殊宏操作符,用来将其后的表达式(通常是符号常数,不能是变量名和寄存器名)转换成它所代表的数值,并将此数值的ASCII码嵌入到宏扩展中。 ( )∶1.运算符——用来改变运算符的优先级别。2.教材符号,表示括号内存储单元(或寄存器)的内容。 < >∶宏调用时用来将带间隔符(如空格,逗号等)的字符串(作为实参)括起来。[ ]∶1.运算符。方括号括起来的数是数组变量的下标或地址表达式。带方括号的地址表达式必须遵循下列原则,①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;②BX或BP可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内,但不允许BX 和BP出现在同一个方括号内;③SI和DI可以单独出现在各方括号内,也可以与常数、BP 或BX一起出现在方括号内,但不允许SI和DI出现在同一个方括号内;④一个方括号内包含多个寄存器时,它们只能作加法运算;⑤若方括号内包含基址指针BP,则隐含使用堆栈段寄存器SS提供段基址,否则均隐含使用数据段寄存器DS提供段基址。2.教材符号,表示其中的内容可省略。 .LIST∶伪指令。用于打开列表文件输出。 .RADIX∶伪指令。把缺省的基数改为2-16范围内的任意基数。.RADIX不影响DD、DQ、DT伪指令,在这些伪指令中,输入的数值只要没有加上数据类型就认为是十进制数。 .XLIST∶伪指令。用于关闭列表文件输出。 %OUT∶伪指令。在汇编时显示其后的信息。 AAA∶指令助记符——加法运算后的ASCII调整(非压缩的BCD码)。无操作数,调整的加法结果在AL中。AF和CF的状态改变说明结果大于9。检查AL的低四位是否为合法的BCD码(0-9),如果合法就清除AL的高四位以及AF和CF标志。当AL的低四位表示的数大于9或AF=1时,将AL加6,AH加1 ,并使AF和CF置位,清除AL中的高四位。任何一个A—F之间的数加上6 以后,都会使AL低4位产生0-9之间的数,从而达到调整的目的。 AAD∶指令助记符——除法的ASCII调整(非压缩的BCD码)。在执行除法操作前,必须利用AAD指令将非压缩型BCD码表示的数转换成二进制数送AL。步骤是,先将被除数的高位数(AH中的内容)乘以10,然后加到AL的低位数中,接着将AH清零。 AAM∶指令助记符——乘法的ASCII调整(非压缩的BCD码)。用于将字节乘法的积转换成两个合法的十进制非压缩码。AAM不带操作数,假定成绩在AH和AL中,并将调整后的非压缩码送回AH和AL。为了保证AAM得到正确的结果,原乘数和被乘数必须是合法

相关文档