8086指令系统

发布时间 2023-04-07 18:34:30作者: 次林梦叶

 《8086寻址方式》

  寻址主要可以分为3类:

    数据寻址

    程序转移地址寻址(即查找下一条指令的地址)

    端口寻址

  解释一下端口:

    

 

       端口也要编址,其编址方式有两种:

      1.集中编址

      

 

 

           即端口在内存中,占内存的空间进行编址

     2.独立编址

      

 

 

           端口独立与内存之外

      这样有个好处是内存的空间更大了

      但是在寻址的时候为了区分是端口的地址还是内存地址

      我们要单独地再添加两条指令(在8086中就是IN与OUT)

      其作用就是访问端口

      与访问内存的指令区分开来

  《寻址方式的划分》

    根据数据的位置可以分为:

    立即寻址(数据在指令中)

    寄存器寻址(数据在寄存器中)

    内存寻址(数据在内存中)

 

   如果用寄存器进行间接寻址,那么能够使用的寄存器只有

    SI 源变址寄存器

    DI 目的变址寄存器

    BX 基址寄存器

    BP 基址指针寄存器

      计算物理地址时,如果使用的是BX,SI,DI,则段基值隐含由DS提供

    BP,由SS提供

     

  《基址变址寻址》

    操作数的偏移地址EA 为指令中基址寄存器 BR 内容 和 变址寄存器 IR 内容 之和

    即[BR][IR]

    注意 基址寄存器只有 BX BP

       变址寄存器只有 SI DI
     然后两两组合
   

 

 

 

《程序转移地址的寻址方式》

  首先回顾一下 指令指针寄存器IP,用于存放下一条执行指令

  这里直接寻址是指直接给出数据,

  这里间接寻址是指用了寄存器来给出数据

 

 

  在汇编语言上会看到这样的代码:

    JMP WORD PTR [BX]

  这里说明一下 PTR 与 WORD:

    具体看此博客<-------

    

 

 

         

 

 

 

 

  《段内寻址》

 

 

    段内直接寻址 JMP SHORT NEXT(NEXT 为变量或者是标注,名字可变)

            ....

            ....

          NEXT:ADDAL,[BX]

    这个就是直接跳转到了 这里

 

 

     

 

    段内间接寻址 JMP WORD PTR TABLE[BX] (TABLE 也是变量)

 

   比如

 

        TABLE[BX] 计算出的 物理地址为232F8H 

    其中的数据为3280H 这个数据直接给 IP

 

 

  《段间寻址》

    用指令中提供的转向段地址 和 偏移地址 取代原先的CS 和 IP

    即运用在不同两段代码之间的跳转

    由于需要 新的CS和IP (均为16位的数据,即要两个16位的数据),而寄存器只有一个16位

    所以到寄存器中寻找数据是不行的

    一定是在内存中找数据

 

    如段间间接寻址:

      JMP DWORD PTR [INTERS+BX]

      这里DWORD是双字,低位字给IP,高位字给CS

    具体看书P25

    

    

 

《8086的指令系统》

 《数据传送类指令》

 具体看书P26

  偏移地址(Offset Address)或有效地址(EA,Effective Address)
  段地址 PA
  
  逻辑地址:PA:EA
  物理地址:PA*16+EA
  
  知道了上面这些来看下如下几个指令:
 
    MOV  BP  3[BX+SI]
    这个指令的含义为:将 DS:[BX+SI+3] 这个逻辑地址转化为物理地址后
    将其保存的数据copy到寄存器BP中

 

   
       

   地址传送指令

  (1)传送偏移地址指令 LEA

    LEA  OPD  OPS

    指令含义为将偏移地址送入指定寄存器

    如:

      MOV  BX, 0100H

      MOV  SI, 0210H

      LEA  BX,1234[BX+SI]

    本来我们是要将 DS:[BX+SI+1234]这个逻辑地址转化为物理地址后,将其中保存的数放到BX中

    但是这里这条指令LEA (注意后面EA,即偏移地址)

    就是要将偏移地址放到指定寄存器中(这里即为BX)

    所以我们不要转化 直接将 (BX+SI+1234)算出的结果放到 BX中

 

 

    输入/输出指令

    输入指令IN,输出指令OUT

    IN AL, PORT

    这条指令的含义为将端口号为PORT的这个端口中的内容交给AL这个寄存器

    需要注意的是:

      端口地址在0000h~00FFh范围内时,用8位地址值直接寻址即可;

      只有端口地址在0100h~FFFFh范围内时,才必须通过DX寄存器间接寻址。

  

    如:

    MOV DX , 383H

    IN  AX,DX

    383H 是16位的(其实他省略了前面的0,其实是0383H)

    其要先将值交给DX,再用DX当做端口号,将端口的值输入到AX中

 

    在0000h~00FFh范围内,端口地址使用8位地址值直接寻址即可,因为这个范围是I/O端口的常用地址范围。

    这种直接寻址方式又被称为“端口地址空间”。

 

    由于端口地址不属于内存地址空间,不能像访问内存一样直接寻址。

    相反,需要通过DX寄存器来进行间接寻址。

    具体来说,在执行IN或OUT指令时,DX寄存器中存储的值会被用作端口地址,从而实现对I/O端口的读写操作。