汇编学习笔记(15) - 80386 从16位32位

简述

  80386相比于8086 地址线从20位扩展为32位,这意味着80386可以最多访问4G的内存,同时所有的寄存器都扩展为32位寄存器,80386扩展了原来的寄存器,增加了一些新的指令,并增加了新的寄存器

  80386的寄存器主要分如下几类:通用寄存器,段寄存器,指令寄存器,标志位寄存器,系统地址寄存器,控制寄存器,测试寄存器,调试寄存器。

  80386的指令集也大多集成8086的指令集,只是将其扩充为32位寄存器而已。

寄存器

通用寄存器

通用寄存器是在8086的8个通用寄存器(AX,BX,CX,DX,BP,SP,SI,DI)的基础上将其扩展了32位寄存器,名称为在原先的名字前面加了个E, 分别为EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI

原先的16位和8位寄存器即 AX, AL ,AH等都还是可以使用的,同时AX 是EAX的低16位,类似于 AX和AL的关系,EAX的高16位无法单独使用。

段寄存器

段寄存器也从原先的16位扩展为32位,但是名字未变,同时增加了FS 和 GS两个新的段寄存器(这两寄存器的全称是啥没查到)

指针寄存器

扩展为32位,改名为EIP,IP仍然有效,是EIP的低16位

标记寄存器

标志寄存器也扩展为32位,并层架如下四个标志位

    IO 特权(IOPL): 当执行IO指令的时候需要IO的特权级小于等于此标志位,占2位

    嵌套任务标志(NT): 用来指示中断返回指令 IRET的工作方式

    重启标志(RF): 与故障和调试有关

    虚拟8086标志(VM): 表示当前工作在虚拟8086模式下

系统地址寄存器,控制寄存器,测试寄存器,调试寄存器

  系统地址寄存器与保护模式,这些寄存器在之后介绍

寻址方式的扩展

  8086的寻址方式还是都支持,并做了一些扩展,主要是内存寻址方面

  [内存寻址公式] = [基址寄存器 + 变址寄存器 * 比例因子(可以是 1,2,4,8) + 常数]

  1. 3个元素可以任意搭配,任选其一,任选其二,或都用

  2. 基址寄存器不在局限于 EBX(BX)/EBP(BP), 可以是8个通用寄存器的任意一个

  3. 变址寄存器不在局限于 ESI(SI)/EDI(DI), 可以是除ESP寄存器外剩余的7个通用寄存器的任意一个

  4. 变址寄存器可以乘上一个比例因子,只能是 1 2 4 8 中的一个

指令

所有8086的指令都还支持,并且将其扩充为支持32位寄存器。其中还增加了部分指令以增强功能

  

MOVSX,MOVZX

    是MOV指令的高级版,相比与MOV 指令他们能支持不同长度数据的复制比如 MOVSX AX, AL

    MOVSX和MOVZX的不同之处是多出来的数据位的填充方式, SX填充为原操作数的符号位, ZX填充0,所以目的操作数的位宽不能小于源操作数

    举例:

      mov dl,92h

      movsx ax, dl ; ax= ff92h

      movzx ax, dl ; ax=0092h

PUSHA, POPA, PUSHAD, POPAD

    PUSHA:  8个16位通用寄存器入栈

    POPA:     8个16位通用寄存器出栈

    PUSHAD:  8个32位通用寄存器入栈

    POPAD:  8个32位通用寄存器出栈

    

LFS、LGS、LSS

    地址传送指令LEA的扩展版本,之前有LDS, LES,这次新增了LFS、LGS、LSS, 主要就是将段地址存到了不同的段寄存器中

PUSHFD、POPFD

    32位标记寄存器的出栈入栈,是PUSHF和POPF的扩展指令

  

LODSD、STOSD

    字符串指令的扩展板,支持32位双字节的比较,和LODSB、LODSW等是一个系列的函数,只不过扩展为32位。

ENTER、LEAVE

    在NASM汇编阅读笔记中介绍过,主要是做一些堆栈平衡的功能和预留堆栈的作用

SETXX系列

    条件设置指令

    格式: SETXX  OPRD1

    其中的XX是条件的意思,比如SETZ, SETNZ, SETA等等,和条件转跳指令JXXX(JZ,JNZ,JA,JB)等是一样的逻辑,只不过条件专挑是满足指令转跳,不满指令啥也不做,

    而条件设置呢就是满足条件设置 OPRD1的值为1 ,不满足则设OPRD1的值为2

  

BT、BTC、BTR、BTS

    位操作指令

    格式: BT OPRD1, OPRD2 

    BT 位测试, 影响标志位
    BTC 位测试并取反
    BTR 位测试并复位 即设置为0
    BTS 位测试并置位 即设置为1

    OPRD1是寄存器寄存器的情况

      那个测试位号 是 OPRD2/ OPRD1 寄存器的长度的余数,所以就不会出现超出范围的情况
      BT AX, 1 那么就是测试1号位
      BT AX, 17 因为AX总共16位所以测17 肯定超过范围,所以实际测试的是 17%16 =1 所有还是1号位


    OPRD1是内存地址的情况

      BT [word 1234], 17 那么实际测试的 [1234+ 17/16 = 1235 ] 的 第 17%16 = 1 位的内存     

BSF、BSR

  位扫描指令

  格式: BSF OPRD1, OPRD2

  扫描OPRD2并把扫描到的第一个为1的位的位号 送到OPRD1

  BSF顺向未扫描,从右向左
  BSR 逆向位扫描 ,从左向右
  影响标志位ZF

LOCK

内存锁前缀

格式: LOCK 其他指令

保证目的操作数的内存地址(目的操作数必须是内存地址,不能是寄存器)的院子操作,用于多处理器同步的
只能用于以下指令
1. XCHG
2. 加减指令:   ADD,ADC,INC,SUB,SBB,DEC,NEG
3. 逻辑运算:  OR, AND,XOR,NOT
4. 位测试:      BT,BTS,BTR,BTC

  

   

猜你喜欢

转载自www.cnblogs.com/alwaysking/p/12324353.html