zoukankan      html  css  js  c++  java
  • 【汇编程序】最全80x86指令详解

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

    8086指令系统

    传送寻址方式

    寻址特点:

        计算机的指令通常包含操作码和操作数部分。

    立即寻址方式

    Mov al,32

    立即数只能作源操作数,不能作目的操作数。(遇到A-F开头的数字出现在指令中时,要加上一个数字0  Mov AX,0FF00H)

    寄存器寻址方式

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

    对于16位操作数,AX.BX CX DX SI DI SP BP

    对于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空操作和无操作指令

  • 相关阅读:
    【mysql优化1】表的优化与列类型选择
    mysql 各数据类型的 大小及长度
    android如何建立数据库。(如何重写SQLiteOpenHelper)
    PHP中统计目录中文件以及目录中目录的大小
    如何下载coursera视频
    JAVAEE filter总结
    zookeeper安装
    如何从硬盘安装fedora 19 (How to install fedora 19 from hard drive, Fedora-19-i386-DVD.iso)
    WCF 项目应用连载[3]
    POJ1184-------操作分离的BFS
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860893.html
Copyright © 2011-2022 走看看