第三章 Pentium微处理器的指令系统
3.1 概述
3.2 Pentium微处理器的寻址方式
3.3 数据传送指令
3.4 算术运算指令
3.5 逻辑运算指令
3.6 串操作指令
3.7 程序控制指令
3.8 保护模式的系统控制指令
3.9 浮点运算指令
3.10 MMX指令简介
3.1 概述
?指令是微处理器执行某种操作的命令,微处理器全
部指令的集合称为指令系统。
?指令有两种书写格式:机器指令和符号指令。
?符号指令是用规定的助记符和规定的书写格式书写
的指令。符号指令的书写格式为:
操作码助记符 操作数助记符
MOV AL,1
10110000 00000001
3.2 Pentium微处理器的寻址方式
寻址方式:寻找指令中操作数地址的方式。
操作数有三种可能的存放方式:
?直接包含在指令中
立即数
立即数寻址
?包含在某个寄存器中
寄存器操作数
寄存器寻址
?在内存中
存储器操作数(内存操作数)
存储器寻址
内存实际地址由两部分组成:存储单元所在段的基
地址 /段内偏移地址(偏移量)
MOV ES:[3000H],AL
段内偏移地址可以由如下四个部分组成(称为偏移
地址四元素):
?基址寄存器内容
?变址寄存器内容
?比例因子
?位移量
由四元素组合形成的偏移地址称为有效地址 EA:
EA=基址 +(变址 ?比例因子 )+位移量
对于实模式( 16位寻址):
基址寄存器,BX,BP
变址寄存器,SI,DI
比例因子,0,1
位移量,0,8,16位
对于保护模式( 32位寻址):
基址寄存器:任何 32位通用寄存器
变址寄存器:除 ESP外的任何 32位通用寄存器
比例因子,1,2,4,8
位移量,0,8,32位
由四元素可组合出 9种存储器寻址方式。
Pentium微处理器共有 11种寻址方式:
1,立即数寻址
操作数作为立即数直接存在指令中,可为字节、字、
双字
MOV ECX,12345678H 低地址
高地址
CS段
操作码
78H
56H
34H
12H
78H56H34H12HECX
2,寄存器寻址
操作数包含在指令规定的 8位,16位,32位寄存器

MOV ECX,EDX
78H56H34H12H
ECX
78H56H34H12H
EDX
寄存器寻址由于无需从存储器中取操作数,故执行
速度快
3,直接寻址
指令中的操作数部分直接给出操作数的有效地址
EA,操作数可以是 16位或 32位整数,操作数默认
在 DS段中
MOV AX,[3000H]
低地址
高地址
CS段
操作码
00H
30H
34H
12H34H12HAX
DS段
50000
53000
DS 5000 0
3000
53000
+
如果操作数在 DS以外的其他段( CS,SS,ES,FS,GS)
中,指令中必须指明段寄存器
MOV AX,FS:[3000H]
低地址
高地址
CS段
操作码
00H
30H
34H
12H34H12HAX
FS段
20000
23000
FS 2000 0
3000
23000
+
4,寄存器间接寻址
操作数地址的偏移量(有效地址 EA)存放在寄存
器中
16位寻址:偏移地址放在 SI,DI,BP,BX中
以 SI,DI,BX间接寻址,默认操作数在 DS段中
MOV AX,[SI]
以 BP间接寻址,默认操作数在 SS段中
MOV AX,[BP]
32位寻址:偏移地址放在 8个 32位通用寄存器中
除 ESP,EBP默认段寄存器为 SS外,其余均默认
段寄存器为 DS
MOV EAX,[ESP]
低地址
高地址
CS段
操作码
34H
12H34H12HAX
SS段
70000
73000
SS 7000 0
3000
73000
+
MOV AX,[BP]
BP
5,基址寻址
EA=[基址寄存器 ]+位移量
16位寻址,BP,BX为基址寄存器
BX,DS为默认段寄存器
BP,SS为默认段寄存器
32位寻址,8个 32位通用寄存器均可作为基址寄存
器,除 ESP,EBP默认段寄存器为 SS外,其余均默认
段寄存器为 DS
MOV EAX,[BX+24]
MOV DX,[EAX+1500]
低地址
高地址
CS段
操作码
00H
15H
34H
12H34H12HAX
FS段
70000
73500
BX
1500
73500
+
MOV DX,[BX+1500]
DS 7000 0
2000
6,变址寻址
EA=[变址寄存器 ]+位移量
16位寻址,SI,DI为基址寄存器,DS为默认段寄存器
32位寻址:除 ESP外其余 7个 32位通用寄存器均可
作为变址寄存器,EBP默认 SS为段寄存器,其余均
默认段寄存器为 DS
MOV AH,[SI+5]
变址寻址适用于对一维数组的元素进行操作。
7,比例变址寻址
EA=[变址寄存器 ]?比例因子 +位移量
只适用于 32位寻址
MOV EAX,[ESI*4+50]
比例变址寻址适用于一维数组操作,当数组元素大
小为 2/4/8字节时,它更方便、有效
8,基址加变址寻址
EA=[基址寄存器 ]+[变址寄存器 ]
适用于 16位和 32位寻址
MOV AX,[BX+SI]
MOV EAX,[EDX+EBP]
基址加变址寻址主要用于二维数组操作和二重循环
9,基址加比例变址寻址
EA=[变址寄存器 ] ?比例因子 +[基址寄存器 ]
只适用于 32位寻址
MOV EAX,[EDX*8+EAX]
适用于数组元素大小为 2/4/8字节时二维数组操作
10,带位移的基址加变址寻址
EA=[基址寄存器 ]+[变址寄存器 ]+位移量
适用于 16位和 32位寻址
MOV AX,[BX+SI+50]
MOV EAX,[EDX+EBP+0FFFF000H]
主要用于二维数组操作,位移量为数组起始地址
11,带位移的基址加比例变址寻址
EA=[变址寄存器 ] ?比例因子 +[基址寄存器 ]+位移量
只适用于 32位寻址
MOV AX,[BX+SI+50]
MOV EAX,[EDX+EBP+0FFFF000H]
适用于数组元素大小为 2/4/8字节时二维数组操作,位
移量为数组起始地址
3.3 数据传送指令
执行后不影响标志位,源操作数不变
1,通用数据传送指令
?MOV 目标操作数,源操作数
1)源操作数可以是 8/16/32位的立即数、寄存器操
作数、内存操作数。目标操作数不允许为立即数,
其余同源操作数。源、目不能同时为内存操作数。
2)源、目操作数类型必须匹配
MOV BYTE PTR [BX],12H
3) 不能向段寄存器写立即数
MOV AX,2000
MOV DX,AX
4) 以 CS为目标的一切传送指令都是非法的
?MOVSX 目标寄存器,源操作数
符号扩展传送指令
MOV DL,-16
MOVSX BX,DL
?MOVZX 目标寄存器,源操作数
零扩展传送指令
MOV DL,-16
MOVZX BX,DL
?XCHG 目标操作数,源操作数
交换指令,源、目不能同为内存操作数
XCHG AX,[SI+0400H]
?BSWAP 32位寄存器
字节交换指令,
MOV EAX,12345678H
BSWAP EAX
?XLAT 表头变量名
查表指令,用来取表中某指定数的值
TABLE DB 48,49,50,51,52,53,54,55,56,57
MOV BX,OFFSET TABLE
MOV AL,5
XLAT TABLE
执行后 AL=53
?LAHF
SAHF
标志寄存器传送指令
2,堆栈操作指令
?PUSH 源操作数
进栈指令,先调整堆栈指针,再把源操作数压栈
PUSH AX
PUSH DWORD PTR [SI+5]
?POP 目标操作数
出栈指令,先将栈顶 2/4字节送目标操作数,再调
整堆栈指针
POP AX
POP DWORD PTR [SI+5]
?PUSHF
POPF
16位标志寄存器进栈 /出栈指令
?PUSHFD
POPFD
32位标志寄存器进栈 /出栈指令
?PUSHA
POPA
16位通用寄存器进栈 /出栈指令
?PUSHAD
POPAD
32位通用寄存器进栈 /出栈指令
3,目标地址传送指令
?LEA 目标寄存器,源操作数
有效地址传送指令,源操作数为内存操作数,将
内存单元的有效地址(而不是内容)传送到目标
寄存器
LEA EAX,[SI+5]
?LDS/LES/LFS/LGS/LSS 目标寄存器,源操作数
指针传送指令
ADDR DD 1A2B3C4DH
LDS SI,ADDR
4,I/O数据 传送指令
完成累加器和 I/O端口之间的数据传送
?IN 累加器,端口号
端口号为 8位时,直接寻址,最多可访问 256个端口
IN AX,PORT
端口地址为 16位时,间接寻址,端口地址必须放
在 DX寄存器中,最多可访问 65536个端口
IN AL,DX
?OUT 端口号,累加器
3.4 算术运算指令
加、减、乘、除,运算对象 8/16/32位有符号 /无符号
整数,以及 BCD码
影响标志位
1,加法指令
?ADD 目标操作数,源操作数
源操作数 +目标操作数 —— >目标操作数
?ADC 目标操作数,源操作数
源操作数 +目标操作数 +CF—— >目标操作数
影响 A,C,O,P,S,Z6个标志位
?INC 目标操作数
目标操作数 +1—— >目标操作数
影响 A,O,P,S,Z5个标志位
2,减法指令
?SUB 目标操作数,源操作数
目标操作数 -源操作数 —— >目标操作数
?SBB 目标操作数,源操作数
目标操作数 -源操作数 -CF—— >目标操作数
?DEC 目标操作数
目标操作数 -1—— >目标操作数
?NEG 目标操作数
0-目标操作数 —— >目标操作数
影响 A,C,O,P,S,Z6个标志位
?CMP 目标操作数,源操作数
比较指令
3,乘法指令
?MUL 乘数
无符号乘法
?IMUL 乘数
有符号乘法
4,除法指令
?DIV 除数
无符号除法
?IDIV 除数
有符号除法
5,十进制调整指令
?DAA
加法的压缩 BDC码调整指令
?AAA
加法的非压缩 BDC码调整指令
?DAS
减法的压缩 BDC码调整指令
?AAS
减法的非压缩 BDC码调整指令
?AAM
乘法的非压缩 BDC码调整指令
?AAD
除法的非压缩 BDC码调整指令