微机原理(五)—80x86指令格式

8086指令系统采用了一种灵活的, 由1-6个字节组成的变字长的指令格式, 包括操作码, 寻址方式以及操作数三个部分

1.指令格式

通常指令的第一字节为操作码字节(OPCODE), 规定指令的操作类型. 第二字节为寻址方式字节(MOD), 规定操作数的寻址方式; 接着以后的3-6字节依据指令的不同而取舍

微机原理(五)—80x86指令格式_第1张图片

第一字节为操作码, 它指出指令所要进行的操作. 其中

  • W指示操作数类型 : W=0为字节, W=1为字;
  • D指示REG操作数的传送方向: D=0表示REG操作数为源操作数, D=1表示REG操作数为目的操作数

第二字节为寻址方式, 它指出所用的两个操作数存放的位置.其中 :

  • REG字段规定一个寄存器操作数, 它作为源操作数还是目的操作数已由第一个字节中的D位规定.

  • MOD字段用来区分另一个操作数在寄存器中(寄存器寻址)还是在存储器中(存储器寻址), 在存储器寻址的情况下, 还用来指出该字节后面有无偏移量, 有多少偏移量

  • R/M字段受MOD字段控制; 若MOD=11为寄存器方式, R/M字段将指出第二操作数所在寄存器编号; MOD=00,01,10为存储器方式R/M则指出如何计算计算机存储器中操作数的偏移地址.

2.8086指令的寻址方式

1> 操作数的种类

指令中操作的对象称为操作数. 8086指令中操作数的种类分为数据操作数和地址操作数两种

(1)数据操作数

数据操作数与数据有关的操作数,即指令中操作的对象是数据, 可以分为

  • 立即数操作数, 即指令中要操作的数包含在指令中
  • 寄存器操作数, 即指令中要操作的数据存放在指定的寄存器中
  • 存储器操作数,即指令中要操作的数据存放在指定的存储单元中
  • I/O操作数,即指令中要操作的数据来自或送到I/O端口
(2)地址操作数

地址操作数是与程序转移地址有关的操作数. 即指令中操作的对象不是数据, 而是要转移的目标地址, 其也可以分为上面的几种种类, 分别代表其存储位置的地址

对于数据操作数,有的指令有两个操作数, 一个叫源操作数, 一个叫目的操作数. 有的只有一个操作数. 有的没有操作数, 有的指令有一个隐含或两个隐含操作数

对于地址操作数, 指令只有一目的操作数, 它是一个供程序转移的目标地址

2>寻址方式

所谓寻址方式, 就是指令中所给出的寻找操作数(包括数据操作数和地址操作数)的方法

(1)数据寻址方式
  • 立即数寻址方式: 所提供的操作数直接包含在指令中,紧跟在操作码之后,这种操作数称为立即数, 例如:

    MOV BL, 80H
    MOV AX, 1090H
    
  • 寄存器寻址方式

    寄存器寻址方式的操作数存放在指令规定的寄存器中, 寄存器的名字在指令中指出.例如

    MOV CL, DL
    MOV AX, BX
    
  • 存储器寻址方式

    存储器寻址方式的操作数都存放在存储单元中, 而操作数在存储器中的物理地址是由段地址左移4位与操作数在段内偏移地址相加得到的. 段地址在实模式和保护模式下可以通过不同途径取得. 那我们是如何取得段内偏移地址(有效地址),有效地址可以由以下三种地址分量组成

    1.位移量,一个8位或16位的数,是一个地址

    2.基址:存放在基址寄存器BX或BP中的内容

    3.变址:存放在变址寄存器中SI或DI中的内容

    //1.直接寻址方式,只包含位移量一种分量(默认段地址为DS)
    MOV AL, [1064H]
    //也可以修改数据段
    MOV AL, ES:[1064H]
    //2.寄存器间接寻址方式
    /**
      寄存器间接寻址方式的操作数有效地址只包含基址寄存器(BX)的内容或变址寄存器(SI,DI)的内容一种分量
      操作数的有效地址在某个寄存器中, 而操作数本身则在存储器的数据段内
      默认段寄存器:DS(数据段寄存器)
    */
    MOV  AX, [SI]
    MOV [BX], AL
    //越段
    MOV ES:[DI], AX
    
    //3.寄存器相对寻址方式
    //其实就是在寄存器简介寻址的基础上, 可以使用基址寄存器BP,并且可以与给定的8位或16位位移量相加
    //BX,SI,DI默认段寄存器为DS; BP默认段寄存器是SS
    MOV [SI+10H], AX
    MOV CX, [BX+COUNT]
    //也可以像下面这样书写
    MOV AL, [BP+TABLE]; MOV AL, [BP]+TABLE; MOV TABLE[BP]
    
    //4.基址变址寻址方式
    //基址变址寻址方式的操作数有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和
    //BX对应数据段DS  BP对应堆栈段SS
    MOV [BX+DI], AX
    MOV  AH, [BP][SI]
    
    //5.基址变址相对寻址方式
    //在基址变址寻址方式的基础上加上了一个8位或16位的位移量
    MOV AX, [BX+SI+COUNT]
    MOV AX, [BX][SI+COUNT]
    MOV AX, [BX][SI]+COUNT
    MOV AX, [BX+SI]+COUNT
    MOV AX, [BX][SI]COUNT
    
  • I/O端口寻址方式

    1.端口直接寻址方式

    这种寻址方式的端口地址用8位立即数表示,例如

    IN AL, 21H
    

    表示从地址为21H的端口中读取数据送到AL中

    2.端口间接寻址方式

    当I/O端口地址大于FFH时,必须事先将端口地址存放在DX寄存器中, 例如

    MOV DX, 120H
    OUT DX, AX
    
(2)地址寻址方式

在8086指令系统中,有一组指令被用来控制程序的执行顺序. 程序的执行顺序是由CS和IP的内容所决定的. 通常情况下,BIU完成一次取指令周期后, 就自动改变IP的内容以指向下一条指令的地址, 使程序按预先存放在程序存储器中的指令的次序, 从低地址到高地址顺序执行. 如果要改变程序的执行顺序, 转移到所要求的指令地址再顺序执行, 可以安排一条程序转移指令,并按指令的要求修改IP内容或者同时修改IP和CS的内容.

转移地址可以在段内,也可以跨段.寻求转移地址的方法称为地址寻址方式

  • 段内直接寻址方式

    也称为相对寻址方式,转移的地址是(IP+一个8位或16位的相对位移量). 这个位移量是下一条指令到目标地址之间的相对位移量, 例如

    //PROGIA和QUEST都是转向的目标地址,用位移量表示
    //位移量为16位的写法,近转移
    JMP NEAR PTR PROGIA
    //位移量为8位的写法,短转移
    JMP SHORT QUEST
    
  • 段内间接寻址方式

    程序的转移地址存放在寄存器或存储单元中, 用指定的寄存器或存储器中的值取代当前IP的内容.

    这条指令和后面的两个段间寻址方式都不能用于条件转移指令,也就是说条件转移指令只能使用段内直接寻址的8位位移量

    JMP BX
    //WORD PTR表示气候所取得的地址是一个字的有效地址
    JMP WORD PTR [BP+TABLE]
    
  • 段间直接寻址方式

    这种寻址方式是在指令中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP的内容,例如

    //LABEL_NAME是一个在另外的代码段内已经定义的远标号,作用是用标号的偏移地址取代IP,段地址取代CS
    JMP LABEL_NAME
    //利用运算符标号FAR将NEXTROUTINT的属性定义为FAR
    JMP FAR PTR NEXTROUTINT
    
  • 段间简介寻址方式

    由指令中给出的存储器寻址方式求出存放转移地址的四个连续内存单元; 前两个单元送给IP, 后两个单元送给CS

    //VAR_DOUBLEWORD是一个已经定义为32位的存储器变量
    JMP VAR_DOUBLEWORD
    //运算符PTR将操作数的类型定义为DWORD(双字)
    JMP DWORD PTR[BP][DI]
    

你可能感兴趣的:(微机原理)