您的位置: 网站首页 > 程序开发 > 汇编语言与微机原理教程 > 第9章 80x86的寻址方式与指令系统 > 【9.3.8 80x86的一般扩展指令系统】

9.3.8 80x86的一般扩展指令系统

 

9.3.8  80x86的一般扩展指令系统

32位80x86微机存储器寻址空间大大扩展(可达4GB或64GB),操作数宽度也扩展至32位,指令功能进一步丰富,因此指令长度也有所扩展,达1~12个字节:1~2个字节操作码字段,0~2个字节寻址方式码字段,0、1、2、4个字节的偏移量字段,0、1、2、4个字节的立即数字段,不超过4个字节的前缀码段。

80x86指令集在基本集基础上扩展而来,依次是286(16位处理器)、386、486指令集,在代码级保持向上兼容。扩展主要表现在32位寻址和32位操作,还体现在指令种类增多、功能增强,如浮点数运算指令、操作系统型指令,指令操作数也扩展到3个等。

80x86常用扩展指令如表9-7所示。

表9-7  80x86常用扩展指令

指令格式

主要功能及说明

MOVSX Dst,Src

MOVZ Dst,Src

将Src符号位扩展,使其与Dst字长相同,再传送到Dst。Dst为16或32位的Reg、Mem,Src为不超过Dst字长的Reg、Mem、Im。其中,MOVSX表示有符号数16或32位传送,MOVZ表示无符号数16或32位传送

PUSH/POP

该指令表示操作数入栈/出栈。操作数可为16或32位的Reg、Mem和Im(仅入栈)

PUSHA,POPA

将AX、CX、DX、BX、SP、BP、SI、DI依次入栈/出栈

PUSHAD/POPAD

将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI依次依入栈/出栈

LFS Dst,Src

LGS Dst,Src

LSS Dst,Src

取48位地址指针送FS和ESI寄存器

取48位地址指针送GS和ESI寄存器

取48位地址指针送SS和ESP寄存器

续上表

指令格式

主要功能及说明

PUSHFD/POPFD

32位标志寄存器入栈/出栈

IN/OUT

在端口与EAX、AX、AL之间输入/输出32、16、8位数据

ADD/ADC/SUB/SBB

32、16、8位操作数加/减运算

MUL Dst,Sre

IMUL Dst,Src1,Src2

32×32位:被乘数在EAX,64位积在EDX:EAX  ;Src为Reg/Mem

Dst←Src1×Sre2  ;Dst为Reg8/16/32,Src1为Reg/Mem,Src2为Im

DIV DWORD

IDIV ECX

EDX:EAX/DS:DWORD

EDX:EAX/ECX

CWDE

CDQ

AX的符号扩展到EAX的高位部分

EAX的符号扩展到EDX的所有位

SHLD Dst,Src1,Src2

SHRD Dst,Src1,Src2

按Src2的次数将Src1左移到Dst,Dst左移到CF,Src2不变

按Src2的次数将Src1右移到Dst,Dst右移到CF,Src2不变

<REP>MOVSD

<REPZ/REPNZ>CMPSD

<REPZ/REPNZ>SCASD

LODSD

<REP>STOSD

DS:ESI源串双字传送到目的串ES:EDI

DS:ESI源串双字与目的串ES:EDI比较

在目的串ES:EDI中搜索EAX的内容

DS:ESI指定的串双字元素装入EAX

EAX中的双字送入ES:EDI目的串中

<REP>INSB

<REP>INSW

<REP>INSD

从DX指向的端口读入字节串送入ES:DI中

从DX指向的端口(偶数)读入字串送入ES:DI中

从DX指向的端口(4的整数倍)读入双字串送入ES:DI中

<REP>OUTSB

<ReP>OUTSW

<REP>OUTSD

DS:SI源串中的字节串向DX指向的端口输出

DS:SI源串中的字串向DX指向的端口(偶数)输出

DS:SI源串中的双字串向DX指向的端口(4的整数倍)输出

JECXZ  TARGET

若ECX=0则转移

CALL<EBX>

CALL FAR PTR<ESI>

段内间接32位的调用

段间间接32位的调用

IRETD

中断返回,从栈中依次弹出CS、EIP及EFLAGS寄存器内容

BT Dst,Src

BTC Dst,Src

BTS Dst,Src

BTR Dst,Src

源操作数指定目标操作数的某一位移入CF并进行测试,目标操作数不变

类似BT,对指定的位测试,测完后将指定位变反

类似BT,对指定的位测试,测完后将指定位置1

类似BT,对指定的位测试,测完后将指定位清零

Dst为Reg或Mem操作数,Src为Reg或Im(作为串下标)

BSF Dst,Src

 

BSR Dst,Src

对源操作数从最低位D0进行扫描,扫描到第一个1,将其位号送入目标操作数。若位串全为0,则ZF置1,否则为0

对源操作数自最高位扫描,其他与BSF指令相同

续上表

指令格式

主要功能及说明

BSWAP Reg32

XADD Dst,Src

CMPXCHC Dst,Src

INVD

WBINVD

 

INVLPG

将32位通用寄存器的最高字节与最低字节、次高字节与次低字节进行交换源与目标先互换,再相加送目标,Dst和Src等长,为32/16/8位的Reg或Mem将Src与Acc进行比较,若相等则Dst←Src,否则Acc←Dst Acc可为EAX、AX、AL

刷新片内cache,并分配一个专用总线周期刷新外部cache

刷新片内cache,并分配一个专用总线周期将外部cache内容回写到主存,再在此后一个总线周期刷新外部cache

把TLB中某一项作废

FCLEX/FNCLEX

FINIT/FINIT

FLDCW

FLDENV

FSTCW/FNSTCW

FSTENV/FNSTENV

FSTSW/FNSTSW

FSTSW AX/FNSTSW AX

清除异常(清除所有事故/中断请求/忙标志)

初始化处理器

装载控制字

装载环境

存储控制字

存储环境

存储状态字

把状态字存入AX

BOUND Op1,Op2

 

ENTER Op1,Op2

 

LEAVE

数组边界检查:验证Op1中的操作数是否在Op2所指向的两个界限内,Op1为Reg16或Reg32,Op2为Mem操作数(数组名)

进入过程(类似C语言的CRET),为过程参数建立一个堆栈区:Op1为堆栈字节数,Op2为过程嵌套层数

撤销ENTER操作,与后继指令RET N一起清除被调用过程所使用的堆栈参数

F2XM

FCOS

FPATAN

FPTAN

FSIN

FSINCOS

FYL2X

FYL2XP1

计算2x-1

余弦

局部反正切

局部正切

正弦

正弦/余弦

计算Y×log2X

计算Y×log2(X+1)

注:<……>内为重复前缀,表示重复进行字符串操作所有操作自动修改ESI、EDI、ECX。

32位的80x86微机须在保护方式下才能实现对4GB的存储器空间寻址。保护方式牵涉到各类描述符和相关寄存器,以及CPU内部的控制/调试、任务寄存器。与保护方式有关的主要指令如表9-8所示。

表9-8  与保护方式有关的主要指令

指令格式

主要功能和操作数

LGDT Src

装载Src所指定的6个字节到全局描述符表寄存器GDT,Src为Mem操作数

续上表

指令格式

主要功能和操作数

LIDT  Src

装载Src所指定的6个字节到中断描述符表寄存器IDT,Src为Mem操作数

SGDT  Dst

存储GDT内容到Dst所指定的6个字节缓冲区,Dst为Mem操作数

SIDT Dst

存储IDT内容到Dst所指定的6个字节缓冲区,Dst为Mem操作数

LTR  Src

装载Src内容到任务寄存器并置任务状态位为“忙”,Src为Reg或Mem操作数

STR Dst

存储任务寄存器内容到Dst,Dst为Reg或Mem操作数

LMSW Src

装载Src内容到机器状态字MSW中,Src为Reg或Mem操作数

SMSW Dst

存储机器状态字MSW内容到Dst,Dst为Reg或Mem操作数

LLDT Src

装载Src指定的局部描述符(或空选择符)到局部描述符表LDT,Src为Reg或Mem操作数

SIDT Dst

存储局部描述符表内容到Dst,Dst为Reg或Mem操作数

MOV CRn,Src

将Src内容送到控制寄存器CRn(n=0、2、3),Src为Reg32

MOV DRn,Src

将Src内容送到调试寄存器DRn(n=0、1、2、3),Src为Reg32

MOV TRn,Src

将Src内容送到任务寄存器TRn(n=0、7),Src为Reg32

MOV Dst,CRn

将控制寄存器CRn(n=0、2、3)内容送到Dst,Dst为Reg32

MOV Dst,DRn

将调试寄存器DRn(n=0、1、2、3)内容送到Dst,Dst为Reg32

MOV Dst,TRn

将任务寄存器CRn(n=0、7)内容送到Dst,Dst为Reg32

CLTS

清除机器状态字MSW中任务转换标志

LAR Dst,Src

装载访问权限

LSI Dst,Src

装载段界限

VERR Dst

验证段的可读性

VERW Dst

验证段的可写性

ARPL Dst,Src

调整选择符的特权级