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 |
调整选择符的特权级 |