实地址模式 + 保护虚地址模式。
1 实地址: 存储器20位物理地址;1MB;LMSW指令设置机器状态字 MSW中的PE状态,可使 80286进入保护虚地址模式。
2 保护虚地址模式:
设计用来增强 多工 和系统稳定度,像是 内存保护,分页 系统,以及硬件支援的 虚拟内存。大部分的现今 x86 操作系统 都在保护模式下运行,包含 Linux、FreeBSD、以及 微软 Windows 2.0 和之后版本
指令:
【1】 push 16位立即数 | .286 ;需要在编码开头加 push -32767 push 0bh push 'a' | masm6.0在金山快盘里有,已经可以通过ml来替代make 和 link,很方便。 |
【2】PUSHA POPA | pusha popa | pusha 将ax,cx,dx,bx,sp,bp,si,di压栈 popa 相反方向出栈。但是sp是所有通用寄存器弹出后,堆栈指针指向的真实的值,而不是栈中保存的值,即该指令执行后,SP+16. PUSHA POPA均不影响标志位 【子程序调用时非常方便】 |
【有符号整数乘法】 1 . IMUL 16位寄存器, 立即数 | CF为1. IMUL DX,9 | 乘积范围(-32768~32767)溢出部分丢失,并置OF, |
2 IMUL 16位寄存器,16位寄存器,立即数 | mov byte ptr DS:[100], 11h;可以通过-d ds:64查看 (100->64) IMUL DX, DS:[100], 02h | 将16位存储器操作数作为被乘数与立即数相乘,并送16位寄存器。 |
移位指令 | mov ax, 0035h ROL ax, 5 SHL word ptr ds:[bx], 18 | 8086中移位次数大于1时,需要放入cl。但80286中修改了限制,移位次数为1-31时,允许使用立即数。 |
支持高级语言的指令 | ||
内存范围检查指令 | .286 DATA SEGMENT BOTTOM EQU 0 TOP EQU 19 ANS LABEL DWORD WANS DW BOTTOM, TOP BOFF DB TOP+1 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: mov si, 02h BOUND SI, ANS MOV DX, BOFF[SI] INT 21H CODE ENDS END START | BOUND 16位寄存器,32位存储器 大概是这个样子,但是没有调通 |
设置堆栈指令空间 | ENTER 6, 0 | ENTER 16位立即数, 8位立即数 16位立即数表示堆栈空间的大小,也即表示给当前过程分配多少字节的堆栈空间,8位立即数表示在高级语言内(如pascal语言)调用自身的次数,也即嵌套次数 【该指令使用BP寄存器而非SP作为栈基址】 |
撤销 | LEAVE eg: ;调用子程序的过程,参数存入堆栈中 ENTER 4,0 MOV AX, Number1 MOV [BP-4], ax MOV AX, Number mov [BP-2], AX CALL COURSE MOV AX, [BP-4] MOV Number1, AX MOV AX, [BP-2] MOV Number2, AX LEAVE ... ... COURSE PROC NEAR PUSHA MOV AX, [BP-4] MOV DX, [BP-2] ... ;参数处理 ... MOV [BP-4], AX MOV [BP-2], DX POPA RET COURSE ENDP | 该指令无操作数,撤销由ENTER指令建立的堆栈空间 |
80386增强和扩展指令:
80386是80*86系列发展中的里程碑。提供了32位寻址方式,可对32位数据直接操作。所有16位指令均可扩展为32位指令。8个32位通用寄存器:
EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
不过他们的低16位也可以作为独立寄存器。
三种模式:
实地址模式;保护虚地址模式和虚拟8086模式。
DOS下只能运行实地址模式,可作为超高速8086芯片使用。
数据段寄存器,增加了两个FS和GS。
标志寄存器扩展到了32位,某些位没有定义。在实地址模式下有9个标志位可用,保护虚地址模式下可有13个标志位可用。扩展后的标志寄存器可称为E标志寄存器:EFR
数据传送和扩展指令 | ||
MOVSX 寄存器, 寄存器/存储器 | movsx eax, cx | 目的操作数可以16或者32,源可是寄存器或者存储器,位数应小于或者等于目的操作数。当少于时,目的操作数高位用源的符号位填充。【适用于有符号数的传送与扩展,不影响状态为】 |
MOVZX 寄存器, 寄存器/存储器 | 与MOVSX唯一的区别是,高位用0填充,适用于无符号数的传送与扩展 | |
堆栈操作指令 | ||
PUSH 32位立即数 | push 12h ;8 pushw 15h ;16 pushd 20h ;32 | |
pushad | 将所有通用寄存器EAX, ECX,....ESP,EBP,ESI,EDI顺序压入堆栈,压入的ESP值是指令执行前值,执行后,ESP-32 | |
popad | 与上相反 | |
pushfd | 将32位标志寄存器压入堆栈 | |
popfd | 与pushfd相反 | |
地址传送指令 | ||
LFS | LFS bx, ds:[0010] | 如果目的操作符为16位,将4字节的存储器操作数中的低两字节送寄存器,高两字节送FS (32位时,6字节,低4字节,高2字节) |
LGS | 把上面的FS换为GS | |
LSS | SS | |
有符号数乘法算法 | ||
IMUL 寄存器, 寄存器/存储器 | IMUL 寄存器, 寄存器/存储器 两操作数位数一致 IMUL 寄存器, 寄存器/存储器,立即数 与286指令类似,只不过支持32位寄存器。 | |
符号扩展指令 | ||
CWDE CDQ | mov word ptr ds:[data1], -5 mov dword ptr ds:[data2], -7 mov ax, data1 cwde mov eax, data2 cdq |
|
SHLD | mov ax, 8321h mov dx, 5678h shld ax, dx, 1 shld ax, dx, 2 | SHLD 寄存器/存储器, 寄存器, CL/立即数 第一操作数左移若干位,空出位用第二操作数高位部分填充(第二操作数不变), |
SHRD | mov ax, 4bo2h mov bx, 6040h shrd ax, bx, 7 | 相反(右,低) |
位操作指令 | ||
BT | BT [bx],cx jc swhereBT === mov ax, [bx] test ax, 10h jnz swhere | BT 寄存器/存储器地址, 寄存器/立即数 第一寄存器(16/32)指定被测试对象,第二操作数指定要测试的位(从左往右数) 然后把被测位值不变放入cf |
BTC | BT指令基础上,将其取反 | |
BTR | BT指令基础上,将其清零 | |
BTS | BT指令基础上,将其置1 | |
位扫描指令 | 用于找出reg或者memory中第一个或者最后一个是1的位,可用来检查是否为0 | |
BSF | mov ax, 0 bsf ax, cx mov eax, 01234567h bsr ecx, eax bsf ax, cx | 对第二操作数从最低到最高搜索,第一个扫描的1的位号送第一操作数,且使zf为0,若第二操作数均为0,zf=1. |
BSR | 从最高到最低。 | |
条件设置指令 | 80386特有的指令用于测试指定标志位状态 | |
SET | SETZ Al SETNC BYTE PTR ds:[BX] | ;当zf=1, 则(al)=1, else =0 ; 当cf=0, 则bx所指字节单元为1 |
80486 与386差别不大,只增加个别指令:
字节交换指令 | |
BSWAP 寄存器 | 将32位寄存器以字节为单位高低字节交换 |
互换并相加指令 | |
XADD 寄存器/存储器, 寄存器 | 将两操作数互换,并将之和放入第一个操作数 |
比较并交换指令 | |
CMPXCHG 寄存器/存储器, 寄存器 | 将第一操作数内容与对应长度的累加器比较,相等zf=1,并将第二操作数送第一操作数;否则zf=0,将第一个操作数送累加器。 |
Cache管理指令 | |
INVD | st:整个片内Cache无效 |
WBINVD | 写回并使Cache无效指令, 该指令功能与INVD相似 |
INVLPG | 使TLB无效 |
Pentium 新增指令
8字节比较交换指令 | cmpxchg8b | 将edx:eax中的8字节与制定存储器操作数中8字节比较,相等->zf=1, 且ecx:ebx送存储器;否则zf=0,将制定的8字节存储器操作数送edx:eax |
处理器特征识别指令 | CPUID | 根据EAX中的参数,将处理器说明信息送EAX,特征标志字送EDX |
读时间标记计数器指令 | RDTSC | 将pentium中64位时间标记计数器高32送EDX,低32送EAX |
读模型专用寄存器指令 | RDMSR | ECX对应的模型专用寄存器->edx:eax |
写模型专用寄存器指令 | WRMSP | edx:eax->ECX对应的模型专用寄存器 |