第 5 章教学重点在 16位 8086指令系统基础上,我们扩展到 32位 80x86
指令系统 。 重点掌握:
32位编程环境
32位寻址方式
32位指令编程方法第 5章 IA-32结构的指令系统
整数指令集
16位整数指令集
32位整数指令集
浮点指令集
MMX指令集
SSE指令集
SSE2指令集主要指令集在
16
指令基础上形成的
32
位整数指令集第 5章 5.1 32位指令的运行环境实地址方式保护方式虚拟 8086方式
16位逻辑段,段地址和偏移地址都是 16位
—— 段地址左移 4位加偏移地址形成 20位物理地址
32位逻辑段,段地址和偏移地址都是 32位
—— 段地址加偏移地址形成 32位线性地址第 5章 5.1.1 32位寄存器组
8个 32位通用寄存器:
EAX EBX ECX EDX
ESI EDI EBP ESP
6个 16位段寄存器:
CS SS DS ES FS GS
32位指令指针寄存器,EIP
32位标志寄存器,EFLAGS
其他的 32位系统用寄存器在原有
16
位寄存器基础上扩展成为
32

5.1.2 32位存储器寻址方式
32位有效地址=
基址寄存器 + ( 变址寄存器 × 比例 ) + 位移量
基址寄存器 —— 任何 8个 32位通用寄存器之一
变址寄存器 —— 除 ESP之外的任何 32
位通用寄存器之一
比例 —— 可以是 1/ 2 / 4 / 8
位移量 —— 可以是 8/ 32位值第 5章第 5章 32位存储器寻址方式
⑴ mov eax,44332211h
⑵ mov eax,ebx
⑶ mov eax,[1234h]
⑷ mov eax,[ebx]
⑸ mov eax,[ebx+80h]
⑹ mov eax,[ebx+esi]
⑺ mov eax,[ebx+esi+80h]
⑻ mov eax,[esi*2]
⑼ mov eax,[ebx+esi*4]
⑽ mov eax,[ebx+esi*8+80h]
第 5章 5.2 32位扩展指令
16位指令系统从两个方面向 32位扩展
⑴ 支持 32位操作数
⑵ 支持 32位寻址方式
mov ax,bx ;16位操作数
mov eax,ebx ;32位操作数
mov ax,[ebx] ;16位操作数,32位寻址方式
mov eax,[ebx] ;32位操作数,32位寻址方式
有些指令扩大了工作范围,或指令功能实现了向 32位的自然增强将 立即数压入堆栈
PUSHi8/i16/i32;把 16位或 32位立即数 i16/i32压入堆栈 。 若是 8
位立即数 i8,经符号扩展成 16位后再压入堆栈
push 1234h ;压入 16位立即数
push 87654321h ;压入 16位立即数
call helloabc
add sp,6 ;平衡堆栈第 5章通用寄存器全部进出栈
PUSHA;顺序将 AX/CX/DX/BX/SP/BP/SI/DI压入堆栈
POPA;顺序从堆栈弹出 DI/SI/BP/SP/BX/DX/CX/AX
( 与 PUSHA相反 );其中应进入 SP的值被舍弃,并不进入 SP,SP
通过增加 16来恢复第 5章符号扩展
MOVSXr16,r8/m8;把 r8/m8符号扩展并传送至 r16
MOVSXr32,r8/m8/r16/m16;把 r8/m8/r16/m16符号扩展并传送至 r32
MOVZX r16,r8/m8;把 r8/m8零位扩展并传送至 r16
MOVZX r32,r8/m8/r16/m16;把 r8/m8/r16/m16零位扩展并传送至 r32
mov bl,92h
movsx ax,bl ;ax=ff92h
movsx esi,bl ;esi=ffffff92h
movzx edi,ax ;edi=0000ff92h
第 5章串输入 /输出
INS ; I/O串输入;存储单元 ES:[(E)DI] ← I/O端口 [DX]; (E)DI←(E)DI ± 1/2/4
第 5章
OUTS ; I/O串输出; I/O端口 [DX] ← 存储单元 DS:[(E)SI]; (E)SI←( E)SI± 1/2/4
串指令能以双字为传送单位 ( ± 4)
在 16位段,采用 SI,DI,CX
在 32位段,采用 ESI,EDI,ECX
条件转移
Jcc label;cc为真,转移到 label指定的段内偏移地址处
JECXZ label;ECX=0,转移到 label指定的段内偏移地址处
LOOP/LOOPZ/LOOPNZ label;循环指令,32位段采用 ECX作为计数器第 5章转移范围可达到 32位全偏移转移范围仍为短转移
mov ecx,16
mov bx,ax
next,shr ax,1
rcr edx,1
shr bx,1
rcr edx,1
loop next
mov eax,edx
例 5.1
第 5章 5.3 32位指令的程序设计
指定汇编程序识别新指令
处理 16位段和 32位段
注意有些指令在 16位逻辑段和 32位逻辑段的差别
DOS环境 ( 实地址方式和虚拟 8086方式 ),
只能使用 16位段
Windows 32位保护方式,可以使用 32位段例 5.5- 1/2
.model small
.386 ;采用 32位指令
.stack
.data
qvar dq 1234567887654321h ;数据定义
.code
.startup
mov eax,dword ptr qvar
mov edx,dword ptr qvar[4]
例 5.5- 2/2
mov ecx,8
start1,shl eax,1
rcl edx,1
loop start1
mov dword ptr qvar,eax
mov dword ptr qvar[4],edx
.exit 0
end
例 5.6- 1/10
.model small
.386 ;采用 32位指令
.stack
.data
count equ 10
darray dd 20,4500h,3f40h,-1,7f000080h
dd 81000000h,0fffffff1h
dd -45000011,12345678
dd 87654321
.code
.startup
例 5.6- 2/10
xor esi,esi
mov si,offset darray ;原序显示
mov ecx,count
start1,mov eax,[esi]
call EAXdisp
add esi,4
dec ecx
jz start2
mov dl,’,’ ;用逗号分隔数据
mov ah,2
int 21h
jmp start1
例 5.6- 3/10
start2,mov dl,0dh ;回车和换行
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
xor esi,esi
mov si,offset darray ;排序
mov ecx,count
call sorting
例 5.6- 4/10
xor esi,esi
mov si,offset darray ;降序显示
mov ecx,count
start3,mov eax,[esi]
call EAXdisp
add esi,4
dec ecx
jz start4
mov dl,’,’
mov ah,2
int 21h
jmp start3
start4,.exit 0
例 5.6- 5/10;32位有符号数据的排序子程序 ( 降序 );入口参数,DS:ESI=缓冲区首地址,ECX=个数
sorting proc
push eax
push edx
dec ecx
outlp,mov edx,0
inlp,cmp edx,ecx;内循环,使最高地址存储单元具有最小数据
jae short botm
mov eax,[esi+edx*4+4]
cmp [esi+edx*4],eax;比较前后两个数据的大小例 5.6- 6/10
jge short nswap
xchg [esi+edx*4],eax
mov [esi+edx*4+4],eax
nswap,inc edx
jmp inlp
botm,loop outlp
pop edx
pop eax
ret
sorting endp
例 5.6- 7/10;以十进制形式显示 32位有符号数据的子程序;入口参数,EAX=有符号数据
EAXdisp proc
push ebx
push edx
test eax,eax ;判断是零,正或负
jnz eaxdisp0
mov dl,’0’ ;为零,显示,0”
mov ah,2
int 21h
jmp eaxdisp4
例 5.6- 8/10
eaxdisp0,jns eaxdisp1
neg eax ;为负数,求绝对值
mov ebx,eax
mov dl,’-’ ;则显示一个符号,-”
mov ah,2
int 21h
mov eax,ebx
eaxdisp1,mov ebx,10
push bx ;压入 10作为结束标志
eaxdisp2,cmp eax,0
jz eaxdisp3;EAX=0( 数据为 0),则退出例 5.6- 9/10
sub edx,edx ;edx=0
div ebx ;EDX.EAX÷ EBX( 10)
add dl,30h ;余数转换为 ASCII码
push dx;将除 10得到的各位数依次压入堆栈
jmp eaxdisp2
eaxdisp3,pop dx ;将各位数依次出栈
cmp dl,10
je eaxdisp4;是结束标志 ( 10),则退出例 5.6- 10/10
mov ah,2 ;显示
int 21h
jmp eaxdisp3
eaxdisp4,pop edx
pop ebx
ret
EAXdisp endp
end
第 5章 5.4 80386新增指令
80386的执行单元可以实现快速 移位操作,80386新增的指令主要就是有关位操作的
80386还增加了条件设置指令,以及对控制,调试和测试寄存器的传送指令
MASM5.0开始支持 80386指令系统位测试指令
BT dest,src ;把目的操作数 dest中由源操作数 src指定的位送 CF标志
BTCdest,src ;把 dest中由 src指定的位送
CF标志,然后对那一位求反
BTRdest,src ;把 dest中由 src指定的位送
CF标志,然后对那一位复位
BTSdest,src ;把 dest中由 src指定的位送
CF标志,然后对那一位置位
mov eax,12345678h ;EAX=12345678h
bt eax,5 ;EAX=12345678h,CF← 1=EAX的 D5位
btc eax,10 ;EAX=12345278h,CF← 1=EAX的 D10位
btreax,20 ;EAX=12245278h,CF← 1=EAX的 D20位
btseax,34 ;EAX=1224527Ch,CF← 0=EAX的 D2位第 5章条件设置指令
SETccr8/m8;若条件 cc成立,则 r8/m8为 1;否则,为 0
第 5章
cmp eax,32h
jge L00
mov ebx,0C1h
jmp L01
L00,mov ebx,0C2h
L01,...
xor ebx,ebx
cmp eax,32h
setge bl
dec ebx
and ebx,(0C1h-0C2h)
add ebx,0C2h
第 5章 5.5 80486新增指令
80486的指令系统是在 80386指令集的基础上增加了 6条新指令,新增的指令主要用于对多处理器系统和片上高速缓冲存储器的支持
为了让汇编程序汇编这些指令,源程序中必须具有,486或,486P伪指令
MASM6.0开始支持 80486指令系统字节交换指令
BSWAP r32 ;将 32位通用寄存器值的第
1和 4字节,第 2和 3字节互换第 5章
mov eax,00112233h ;EAX=00112233h
bswap eax ;EAX=33221100h
交换加指令
XADD reg/mem,reg;reg/mem←→ reg,reg/mem← reg+reg/mem
第 5章
mov bl,12h
mov dl,02h
xadd bl,dl ;BL=14h,DL=12h
比较交换指令
CMPXCHG reg/mem,reg;AL/AX/EAX- reg/mem;相等,ZF=1,reg/mem←reg;不等,ZF=0,AL/AX/EAX←reg/mem
第 5章
mov al,12h
mov bl,12h
mov dl,02h
cmpxchg bl,dl ;AL=12h,BL← DL=02h,ZF=1
cmpxchg bl,dl ;AL← BL=02h,DL=02h,ZF=0
第 5章 5.6 Pentium新增指令
Pentium新增了几条非常实用的特权指令
源程序中必须具有,586或,586P伪指令
MASM6.11开始支持 Pentium指令系统
较低版本的汇编程序可以定义宏实现:
CPU_ID MACRO ;;CPUID指令的机器代码
DB 0FH,0A2H ;;0F A2
ENDM
也可以直接在该指令处用:
DB 0FH,0A2H
这样,无需新版本汇编程序就可以开发最新生产的微处理器程序比较交换指令
CMPXCHG reg/mem,reg;AL/AX/EAX- reg/mem;相等,ZF=1,reg/mem←reg;不等,ZF=0,AL/AX/EAX←reg/mem
第 5章
mov al,12h
mov bl,12h
mov dl,02h
cmpxchg bl,dl ;AL=12h,BL← DL=02h,ZF=1
cmpxchg bl,dl ;AL← BL=02h,DL=02h,ZF=0
第 5章 5.7 Pentium Pro新增指令
Pentium Pro指令系统新增 3条实用的指令
程序中必须具有,686或,686P伪指令
MASM6.12开始支持 PentiumPro指令条件传送指令
CMOVccr16,r16/m16 ;若条件 cc成立,
则 r16←r 16/m16;否则,不传送
CMOVccr32,r32/m32 ;若条件 cc成立,
则 r32←r 32/m32;否则,不传送
test ecx,ecx;判断 ECX是否等于 0
jne IH
mov eax,ebx;ECX=0,则 EAX←EBX
IH,..,;ECX≠0
test ecx,ecx;CMOVeq 有 条 件 地 将
EBX传送到 EAX
cmoveq eax,ebx;可以代替 JNE与 MOV指令,从而消除分支第 5章第 5章 教学要求 ( 1)
1,熟悉 32位 80x86CPU的 3种工作方式和 32
位寄存器组
2,掌握 32位寻址方式
3,理解 16位指令如何实现 32位扩展,熟悉常用 16位指令的 32位扩展功能及应用,
其中新增指令:
PUSHA/ POPA,MOVSX/ MOVZX
INS/ OUTS,JECXZ
第 5章 教学要求 ( 2)
4,掌握 32位指令编程方法
5,了解常用的 32位新增指令
BT/ BTC/ BTR/ BTS,SETcc
BSWAP/ XADD/ CMPXCHG
CPUID,CMOVcc
Take a Rest