X86汇编语言

  • 常见X86汇编语言类型
    • ASM
    • MASM
    • TASM
    • OPTASM

Intel 8086的汇编语言指令

  • Intel 8086的指令
    • 概述
      • 117条基本指令
        • 6个功能组
          • 数据传送类指令
            • MOV/XCHG,PUSH/POP,LEA
          • 算数运算类指令
            • ADD/ADC/INC,SUB/SBB/DEC/CMP/NEG,MUL/IMUL,DIV/IDIV
          • 位操作类指令
            • AND/OR/XOR/NOT/TEST
          • 串操作类指令
          • 控制转移类指令
            • JMP/JCC/LOOP,CALL/RET,INT n
          • 处理机控制类指令
            • NOP
      • 其他
        • 伪指令

数据传送类指令

  • 数据传送类指令
    • 概述:计算机中最基本,最重要的一种操作,传送指令也是最常用的一类指令
    • 作用:传送指令把数据从一个位置传送到另一个位置。
    • 特点:除标志寄存器传送指令外,均不影响标志位
    • 包含:MOV XCHG PUSH POP LEA
      • 传送指令MOV
        • 把一个字节或操作数从源地址传送至目的地址
      • 交换指令XCHG
        • 把两个地方的数据进行互换
          • 寄存器与寄存器之间对换数据
          • 寄存器与存储器之间对换数据
          • 不能在存储器与存储器之间对换数据
      • 进栈指令PUSH
        • PUSH
          • Push r16/m16/seg 操作过程:1. SP<-SP-2 2.SS:[SP]<-r16/m16
        • POP
          • 出栈指令,操作与PUSH相反
        • 算数运算类指令
          • 概述:四则运算计算机经常进行的一种操作
          • 作用:实现二进制(十进制)数据的四则运算
          • 特点:算术运算类指令往往对标志有影响
          • 建议
            • 掌握 ADD/ADC/INC , SUB/SBB/DEC/NEG/CMP
            • 熟悉 MUL/IMUL , DIV/IDIV
            • 理解 CBW/CWD , DAA/DAS , AAA/AAS/AAM/AAD
          • 包含
            • 加法指令ADD
              • 功能:ADD指令将源与目的操作数相加,结果送到目的操作数
                • ADD指令按状态标志的定义相应设置状态标志
              • 语法:
                • ADD reg, imm/reg/mem reg<-reg+imm/reg/mem
            • 带进位加法指令ADC
              • 功能:ADC指令将源与目的的操作数相加,在加上进位CF标志,结果送到目的操作数
                • ADC指令按状态标志的定义相应设置状态标志
              • 用途:ADC指令主要与ADD配合,实现多精度加法运算
              • 语法
                • ADD reg , imm/reg/mem
                • ADC mem , imm/reg
            • 增量指令INC
              • 功能:对操作数加1(增量)
                • 不影响进位CF标志,按定义设置其他状态标志
              • 语法
                • INC reg/mem reg/mem<-reg/mem+1
            • 减法指令SUB
              • 功能:将目的操作数减去源操作数,结果送到目的操作数
                • 按照定义相应设置状态标志
              • 语法
                • SUB reg , imm/reg/mem reg<-reg-imm/reg/mem
            • 带借位减法指令SBB
              • 功能:SBB指令将目的操作数减去源操作数,在减去借位CF(进位),结果送到目的操作数
              • 用途:SBB指令主要与SUB配合,实现多精度减法运算
              • 语法:SBB reg , imm/reg/mem reg<-reg-imm/reg/mem-CF
            • 减量指令DEC
              • 功能:DEC指令对操作数减1(减量)
              • 语法:DEC reg/mem reg/mem<-reg/mem-1
              • 说明:INC指令和DEC指令都是单操作数指令,主要用于对计数器和地址指针的调整
            • 求补指令NEG
              • 功能:NEG指令对操作数执行求补运算:用0减去操作数,然后结果返回操作数,求补运算也可以表达成,将操作数按位取反后加1
                • NEG指令对标志的影响与用0作减法的SUB指令一样
              • 语法:NEG reg/mem reg/mem<-0-reg/mem
            • 比较指令CMP
              • 功能:将目的操作数减去源操作数
                • 按照定义相应设置状态标志
              • 说明:执行的功能与SUB指令类似,但结果不回送目的操作数
              • 语法:CMP reg , imm/reg/mem reg—imm/reg/mem

位操作类指令

  • 位操作类指令
    • 概述:以二进制为基本单位进行数据的操作。一类常用的指令
    • 包含
      • 逻辑运算指令
        • ADD(与)
          • 功能:对两个操作数执行逻辑与运算,结果送到目的操作数。
          • 语法:ADD des , src des<-des^src
        • OR(或)
          • 功能:对两个操作数执行逻辑或运算,结果送到目的操作数
          • 语法:OR dest , src dest<-destv src
        • XOR(异或)
          • 功能:对两个操作数执行逻辑异或运算,结果送到目的操作数
          • 语法:XOR dest , src
        • NOT(非)
          • 功能:对一个操作数执行逻辑非运算
            • 按位取反,原来的0的位变1,原来的1的位变0
          • 语法:NOT reg/mem
        • TEST(测试)
      • 移位指令
        • SHL(逻辑左移)
        • SHR(逻辑右移)
        • SAL(算术左移)
        • SAR(算术右移)
      • 循环移位指令
        • ROL(左循环移位)
        • ROR(右循环移位)
        • RCL(带进位左循环移位)
        • RCR(带进位右循环移位)

串操作类指令

  • 串操作类指令

控制转移类指令

  • 控制转移类指令
    • 概述:用于实现分支,循环,过程等程序结构,是仅次于传送指令的常用指令
    • 建议:
      • 重点掌握:JMP/JCC/LOOP、CALL/RET、INT n/IRET 常用系统功能调用
      • 一般了解:LOOPZ/LOOPNZ INTO
    • 包含
      • 无条件转移指令JMP
        • 语法:JMP label
        • 作用:
          • 程序转向label标号指定的地址(标号要在程序其他位置标出)
        • 说明:
          • 只要执行无条件转移指令JMP,不需要任何条件,就使程序转到指定的目的地址处,从目标地址
          • 操作数是要转移到的目标地址开始执行指令
        • 原理
          • 程序的执行地址,是由段寄存器CS和指令指针IP共同确定的,即当前指令的地址为CS:IP
          • 程序的跳转是通过修改CS和IP的值来实现的
      • 条件转移指令JCC
        • 语法:Jcc label
          • 条件满足,发生转移:IP<-IP+8位位移量
          • 条件不满足,顺序执行
        • 说明:
          • 指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令,条件不成立,则程序将顺序执行下一条指令
          • 操作数label是短转移指令,要跳转的地址必须距当前IP地址-128~+127个单元的范围之内
          • Jcc指令不影响标志
            • 但要利用标志
              • 根据利用的标志位不同,16条指令分为3种情况
                • 判断单个标志位状态
                • 比较无符号数高低
                • 比较有符号数大小
      • 循环指令LOOP
        • 语法:LOOP label
        • 功能:循环指令是一种特殊的转移指令,当满足某条件时,反复执行一系列操作,知道不满足为止
        • 说明:循环指令利用CX寄存器作为计数器
      • 子程序指令
        • 语法:
          • 4种类型
            • CALL label; 段内调用,相对寻址。
            • CALL r16/m16;段内调用,间接寻址
            • CALL far ptr label;段间调用,直接寻址
            • CALL far ptr mem;段间调用,间接寻址
        • 原理:
          • 子程序是完成特定功能的一段程序
          • 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行
          • 当运行完子程序功能后,采用RET返回指令回到主程序继续执行
        • 说明
          • 子程序通常是与主程序分开完成特定功能的一段程序,程序中有时要反复的实现相同的功能只不过参数不同而已,把仅参数不同功能重复的程序编写成为子程序,执行这个功能时,就可以调用该子程序,执行完成后在返回主程序。
      • 中断指令
        • 语法=中断指令:INT
          • 举例:
            • INT i8
          • 特殊:
            • IRET:中断返回指令,实现中断返回
            • INTO:溢出中断指令
        • 作用:中断是一种改变程序执行顺序的方法,在程序运行时,遇到某些需要紧急处理的情况,如停电,数据的实时接收,溢出等,处理器暂停主程序的执行,转去执行中断处理程序。
        • 分类
          • 内部中断
          • 外部中断

处理机控制类指令

  • 处理机控制类指令
    • 概述:对CPU状态进行控制的指令
    • 包含
      • 空操作指令NOP
        • 语法:
          • NOP CS:SS:DS:ES
        • 作用:不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期。
        • 用途
          • NOP常用于程序调试
            • 在需要预留指令空间时用NOP填充
          • 代码空间多余时也可以用NOP填充
          • 还可以用NOP实现软件延时
      • 其他
        • LOCK HLT ESC WAIT
    • 说明
      • 事实上,NOP和XCHG,AX,的指令代码一样都是90H
      • 段超越前缀指令:在允许段超越的存储器操作数之前,使用段超越前缀指令,将采用指定的段寄存器寻址操作数
        • CS:使用代码段的数据
        • SS:使用堆栈段的数据
        • DS:使用数据段的数据
        • ES:使用附加段的数据

伪指令

  • 伪指令
    • 概述:
      • 没有对应的机器码的指令,最终不被CPU所执行
      • 伪指令是由编译器来执行的指令
        • 编译器根据伪指令来进行相关的编译工作
    • 语法
      • segment和ends是一对成对使用的伪指令
        • 这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令
      • segment和ends的功能是定义一个段
        • segment说明一个段开始
          • 语法:段名 segment
        • ends说明一个段结束
          • 语法:段名 ends
    • 说明
      • 一个汇编程序是由多个段组成的,这些段被用来存放代码,数据或当作栈空间来使用
      • 一个有意义的汇编程序中至少要有一个段,这个段用来存放代码
    • 注意
      • 不要搞混end和ends
        • end是汇编语言的结束
          • 一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译
        • ends是伪指令的结束

results matching ""

    No results matching ""