【汇编程序】最全80x86指令详解

声明:博主原创,禁止转载。邮箱:qxlxi@qq.com测试

8086指令系统

传送寻址方式

寻址特色:spa

    计算机的指令一般包含操做码和操做数部分。3d

当即寻址方式

Mov al,32指针

当即数只能做源操做数,不能做目的操做数。(遇到A-F开头的数字出如今指令中时,要加上一个数字0  Mov AX,0FF00H)blog

寄存器寻址方式

在寄存器寻址方式下,操做数包含在寄存器中,内存

对于16位操做数,AX.BX CX DX SI DI SP BPci

对于8位操做数,则用寄存器AH AL BH BL CH CL DH DL字符串

MOV DX,AX同步

注意:源操做数的长度必须与目的操做数一致字符串处理

直接寻址方式

    默认使用的段寄存器为数据段寄存器DS

    MOV AX,[2000]

寄存器间接寻址方式

基址寄存器BX BP 变址寄存器SI DI

BX、SI、DI 默认数据段中

BP 默认堆栈段中

MOV BX,[SI]

寄存器相对寻址方式

MOV COUNT[SI]

基址变址寻址方式

机制寄存器(BX、BP)和变址寄存器(SI、DI)

MOV AX,[BX][SI]

相对基址变址寻址方式

Bx为寄存器时,使用DS作段寄存器

BP为寄存器时,使用SS作段寄存器

有关[]须要注意的就是

  1. 当即数能够出如今方括号中,表示直接地址。例如[2000]
  2. 只有Bx,Bp SI Di这个四个寄存器能够出如今[]内,他们能够单出现,也能够由几个寄存器组合起来。但Bx和bp寄存器不容许出如今同一个[]内,Si和di也不能同时出现。

数据传送指令

通用数据传送指令

MOV 传送指令

指令格式 MOV 目的、源

指令功能:将源操做数(一个字节或一个字)传送到目的操做数

例如:mov al,10

Cs不能作目的操做数

Mov指令容许在cpu的寄存器之间、存储器和寄存器之间。也能够将当即数送到寄存器或存储器中,Ip寄存器不能作源操做数或目的操做数。目的操做数也不容许用cs寄存器 另外,除了源操做数外,两个操做数中必须有一个是寄存器。但不能都是段寄存器。Mov指令不能再两个存储单元之间直接传送数据。也不能在两个段寄存器之间直接传送数据。

push进栈指令

指令格式:push 源

指令功能:将源操做数推入堆栈

源操做数能够是16位通用寄存器,端寄存器或存储器中的数据字,但不能是当即数。堆栈区的段地址由SS段寄存器的内容肯定,堆栈的最大容量为64K,既一个段的最大容量。堆栈指针SP始终指向栈顶。

执行push sp>sp-2

pop出现指令

指令格式:pop 目的

指令功能:把当前sp所指向的堆栈顶部的一个字送到指定的目的操做数中。

目的操做数能够是16位通用寄存器 段寄存器 或存储单元 但cs不能作目的操做数,每执行一次出现操做,sp>sp+2

XCHG交换指令

指令格式:XCHG 目的 源

指令功能:把一个字或字节的源操做数和目的操做数相互交换。

交换能够在寄存器之间,寄存器与存储器之间进行,但段寄存器不能做为操做数,也不能直接交换两个存储单元中的内容。

XCHG AX,[BX+200H]

XLAT表转换指令

指令格式 XLAT 转换表

输入输出指令

输入输出指令用来完成i/o端口与累加器之间的数据传送,指令中给出io端口地址值。当执行输入指令时,把指定端口中的数据读入累加器中,当执行输出指令时,则把累加器中的数据写入指定的端口中。

IN输入指令

IN AL,端口地址

8位-Al  16位AX.

IN指令有两种格式,第一种格式 端口地址00-FF直接包含在IN指令里寻址256个端口,因为8086cpu能够直接访问地址0000-FFFFH的64k个i/o端口,当端口地址大于FFH,必须使用第二种寻址方式,先将端口号送入DX寄存器执行输入操做。

OUT 输出指令

OUT 端口地址,al

指令功能:将AL中的一个字节写到一个8位端口,或把AX中的一个字写到一个16位端口。

地址目标传送指令

 这是一类用于传送地址码的指令,用来传送操做数的段地址和偏移地址。

LEA取有效地址指令

指令格式:LEA  目的,源

指令功能:取源操做数地址的偏移量,并把她传送到目的操做数所在的单元

LEA指令要求源操做数必需要是存储单元,目的操做数必须是一个除段寄存器以外的16位寄存器。

    LEA BX,[SI]

LDS将双字指针送到寄存器和DS指令

指令格式:LDS 目的,源

指令功能:从源操做数指定的存储单元中,取出一个变量的4个字节地址指针,送进一对目的寄存器,其中 前两个字节送到指令中指定的目的寄存器中,后两个字节送到DS寄存器。目的操做是16位寄存器,一般使用SI寄存器,可是不能使用段寄存器。

LES将双字指针送到寄存机和ES指令

指令格式:LES 目的,源

指令功能:这指令与LDS指令的操做接本相同,所不一样的是要将源操做数地址指针中的段地址部分送到ES寄存器中,而不是DS寄存器,目的操做数经常使用DI寄存器。

标志传送指令

LAHF标志位到AH指令

格式指令:LAHF

指令功能:把寄存器SF ZF AF PF CF分别传送到AH寄存器对应位置上

执行这条指令后,标志位自己不受影响。AH相同于8080的标志寄存器,从而对8080程序进行切换

SAHF AH送到标志寄存器

指令格式:SAHF

指令功能:把AH内存存入标志寄存器,这条指令与LAHF的操做相反,它把寄存器AH中的送入标志寄存器。高位标志OF DF TF不受影响

PUSHF 标志入栈指令

指令格式:PUSHF

指令功能:把整个标志寄存器的内容推入堆栈,同时修改堆栈指针,使Sp<-sp-2

注意:这条指令执行后对标志位无影响。

POPF 标志出现指令

指令格式:POPF

指令功能:把当前堆栈指针Sp所指的一个字,传送给标志寄存器FLAGS并修改堆栈指针 Sp<-sp+2

注意点:成对的使用pushf和popf这两条指令,可对标志寄存器进行保护和恢复经常使用在过程(子过程)调用和中断程序的开头与结尾处,对进行过程调用或发生中断时主程序的状态进行保护。

算数运算指令

算数运算指令可处理4种类型的数,无符号二进制整数,带符号二进制整数、无符号压缩十进制整数和无符号非压缩十进制整数。

例如:

   非压缩十进制数58

    压缩十进制数0101 1000B

    非压缩十进制数 0000 0101B 和 0000 1000B

加法

ADD加法指令

指令格式:ADD 目的,源

指令功能:将源操做数和目的操做数相加,结果送回到目的操做数中

 既 目的ß- 源+ 目的

ADC带进位的加法指令

指令格式:ADC 目的,源

指令功能:目的ß- 源+目的+CF

注意:这两条指令的源操做数能够是寄存器 存储器或当即数

目的操做数只能用寄存器和存储单元

Add 和 Adc指令影响的标志位Cf Of Pf Sf Zf Af

INC增量指令

指令格式:INC 目的

指令功能:对目的操做数加1 结果送回到操做数

目的ß- 目的+1

该指令主要用在循环程序中,对地址指和循环计数器等进行修改。指令执行后影响AF OF PF SF ZF 但进位标志CF 不影响

注意:因为该指令只有一个操做数,若是要是内存单元的内容增1 则程序中必需要说明存储单元是字仍是字节的符号

    INC BYTE PTR[BX]

    BYTE à说明是字节

    WORD à说明是字

AAA加法的ASCLL调整指令

指令格式:AAA

指令功能:运算结果以存在AL的状况下,用此指令将AL寄存器中的运算结构调整为1位非压缩十进制数,仍保留在AL中,AF=1表示有进位

DAA加法的十进制数调整指令

指令格式:DAA

指令功能:将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。相加后的数必须在AL中,才能使用DAA指令。

减法

SUB减法指令

指令格式:SUB 目的 源

指令功能:将目的操做数减去源操做数,结果送回到目的操做数

目的ß- 目的-源

SUB AX,BX

SBB带借位的减法指令

指令格式:SBB 目的 源

指令功能:与SBB相似,只是在两个操做数相减后,还要减去进位/借位CF的值

SBB AL,CL Alß- AL-CL-CF

DEC减量指令

指令格式:DEC 目的

指令功能:对指定的目的操做数减1 结果送回到此操做数。

DEC BX;  BXß- Bx-1

NEG取负指令

指令格式:NEG 目的

指令功能:对目的操做数取负,既用零减去操做数,在把结果送回到目的操做数

NEG AX;  将Ax中的数取负(正数变负数,负数变整数)

CMP比较指令

指令格式:CMP 目的,源

指令功能:将目的操做数减去源操做数,但结果不给目的操做数。仅将结果反映在标志位上。

AAS减法的ASCLL调整指令

DAS减法的十进制调整指令

乘法

MUL无符号数乘法指令

指令格式:MUL 源

指令功能:把源操做数和累加器中的数都当成无符号数 而后将两数相乘,源操做数能够是字节或字

字节 AXß-- AL*

字  DX AXß- AX*

当源操做数是存储单元时,必须在操做数前加BYTE或WORD说明是字仍是字节

字节

IMUL整数乘法指令

指令格式:IMUL 源

指令功能:把源操做数和累加器中的数都做为带符号数,进行相乘

字节: AXß- AL*源

字: DX AXß- AX*源

AAM乘法的ASCLL调整指令

指令格式:AAM

指令功能:对已存在AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,使得在AX中获得的正确的非压缩十进制数的乘积。

调整过程:把AL寄存器内容除以10,商放在AH中,余数在AL中

AHß-AL/10所得的数

ALß-AL/10所得的余数

指令执行后 将影响ZF SF PF 但AF CF OF无定义

除法

DIV无符号数除法指令

指令格式:DIV 源

指令功能:对两个无符号二进制数进行除法操做。

ALß-AX/源的商

AHß-AX/源/的余数

IDIV整数除法指令

指令格式:IDIV 源

指令功能:该指令执行的操做与DIV相同,单操做数必须带符号数的商和余数也都是带符号数的。

CBW把字节转换成字指令

指令格式:CBW

指令功能:把寄存器AL中的字节的符号位扩充到AH的全部位

AL D7=0 就将这个0拓展到AH中

AL D7=1 1拓展到AH中

CWB执行后不影响标志位

CWD把字转换成双字指令

指令格式:CWD

指令功能:把AX中的字的符号扩充到DX中

AX D15 = 0 则DX = 0000H

AX D15 = 1  则DX = 1111H

CWD执行后不影响标志位

AAD除法的ASCLL调整指令

指令格式:AAD

指令功能:在作除法前,把BCD码转换成二进制数

逻辑运算和移位指令

逻辑运算指令

NOT取反指令

指令格式:NOT 目的

指令功能:将目的操做数求反,结果送回到目的操做数

目的ß- 目的

存储器数要说明是什么类型字节仍是字

执行后,均将CF和OF清零。SF和PF反映操做结果。AF未定义 源操做数不变

AND逻辑与指令

指令格式:AND 目的,源

指令功能:对两个操做数进行按位逻辑与操做,结果送回到目的操做数

 目的ß- 目的∧源

主要用于使操做数的某些位保留 和1 相与

OR逻辑或指令

指令格式:OR 目的,源

指令功能:对两个操做数进行按位逻辑或操做,结果送回到目的操做数

目的ß-目的∨源

XOR异或操做指令

    指令格式:XOR 目的,源

    指令功能:对两个操做数进行按位逻辑异或运算,结果送回到目的操做数

    目的ß-目的^源

   

TEST测试指令

指令格式: TEST 目的,源

指令功能:对两个操做数进行逻辑与操做,并修改标志位 但不会送结果。

算数逻辑移位指令

SAL算数左移指令(Shift Arithmetic Left)

指令格式: SAL 目的,计数值

SHL逻辑左移指令(Shift Logic Left)

指令格式:SHL 目的,计数值

 

左移 最低位补0 最高位进入CF

若只须要移动一位,可直接将指令中的计数值置1 要是移位次数大于1

应该先将移位次数送入CL寄存器,再把CL放在指令的计数值位置上

SHR逻辑右移指令(Shift Logic Right)

指令格式:SHR 目的,计数值

指令功能:对目的操做数中各个进行右移,最低位进入CF 最高位补0

SAR算术右移指令(Shift Arithmetic Right)

指令格式:SAR 目的,计数值

指令功能:其余和SHR相同 最低位进入CF 可是最高位保持不变 而不是补0

循环移位指令

ROL循环左移指令(Rotote Left)

指令格式:ROL 目的,计数值

ROR循环右移指令(Rotate Right)

指令格式:ROR 目的,计数值

RCL经过进位位循环左移(Rotate through Carray Left)

指令格式:RCL 目的,计数值

RCR 经过进位位循环右移(Rotate througt Carray Right)

指令格式:RCR 目的,计数值

 

 

字符串处理指令

MOV字符传送指令

CMPS字符串比较指令

SCAS字符串扫描指令

LODS数据串转入指令

STOS数据串存储指令

控制转移指令

无条件转移和过程调用指令

1 JMP无条件转移指令

过程调用和返回指令

条件转移指令

循环控制指令

中断指令

处理器控制指令

标志操做指令

 

指令助记符

操做

指令名称

CLC

CFß-0

进位标志清0(Clear Carray)

CMC

CFßCF

进位标志求反(Complement Carray)

STC

CFß1

进位标志置1 (Set Carray)

CLD

DFß0

方向标志位清0(Clear Direction)

STD

DFß1

方向标志位置1(Set Direction)

CLl

IFß0

中断标志位清0(Clear interrupt)

STI

IFß1

中断标志位置1(Set Interrupt)

 

外部同步指令

ESC换码指令

Wait等待指令

LOCK封锁总线指令

停机指令和空操做语句

HLT停机指令

NOP空操做和无操做指令