80*86 指令

实地址模式 + 保护虚地址模式。

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
  • al符号位到ah:cbw
  • ax到dx:cwd
  • ax到eax cwde
  • eax-> edx: cdq 使之成为64位有符号数
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对应的模型专用寄存器































你可能感兴趣的:(80*86 指令)