410 likes | 629 Views
第 6 章. 教学重点. 在 16 位 8086 指令系统基础上,我们扩展到 32 位 80x86 指令系统。重点掌握: 32 位编程环境 32 位寻址方式 32 位指令编程方法. IA-32 结构的指令系统. 整数指令集 16 位整数指令集 32 位整数指令集 浮点指令集 MMX 指令集 SSE 指令集 SSE2 指令集. 主要指令集 在 16 指令基础上形成的 32 位整数指令集. 6 .1 32 位指令的运行环境. 实地址方式 保护方式 虚拟 8086 方式. 16 位逻辑段: 段地址和偏移地址都是 16 位
E N D
教学重点 在16位8086指令系统基础上,我们扩展到32位80x86指令系统。重点掌握: 32位编程环境 32位寻址方式 32位指令编程方法
IA-32结构的指令系统 • 整数指令集 • 16位整数指令集 • 32位整数指令集 • 浮点指令集 • MMX指令集 • SSE指令集 • SSE2指令集 主要指令集 在16指令基础上形成的 32位整数指令集
6.1 32位指令的运行环境 • 实地址方式 • 保护方式 • 虚拟8086方式 16位逻辑段:段地址和偏移地址都是16位 ——段地址左移4位加偏移地址形成20位物理地址 32位逻辑段:段地址和偏移地址都是32位 ——段地址加偏移地址形成32位线性地址
6.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位
第6章 6.1.2 32位存储器寻址方式 32位有效地址= 基址寄存器+(变址寄存器×比例)+位移量 • 基址寄存器——任何8个32位通用寄存器之一 • 变址寄存器——除ESP之外的任何32位通用寄存器之一 • 比例——可以是1 / 2 / 4 / 8 • 位移量——可以是8 / 32位值
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]
6.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位的自然增强
第6章 push 1234h ;压入16位立即数 push 87654321h ;压入16位立即数 call helloabc add sp,6 ;平衡堆栈 将立即数压入堆栈 PUSH i8/i16/i32 ;把16位或32位立即数i16/i32压入堆栈。若是8位立即数i8,经符号扩展成16位后再压入堆栈
第6章 通用寄存器全部进出栈 PUSHA ;顺序将AX/CX/DX/BX/SP/BP/SI/DI压入堆栈 POPA ;顺序从堆栈弹出DI/SI/BP/SP/BX/DX/CX/AX(与PUSHA相反) ;其中应进入SP的值被舍弃,并不进入SP,SP通过增加16来恢复
第6章 符号扩展 MOVSX r16,r8/m8 ;把r8/m8符号扩展并传送至r16 MOVSX r32,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
第6章 串输入/输出 INS ; I/O串输入 ;存储单元ES:[(E)DI] ← I/O端口[DX] ;(E)DI←(E)DI±1/2/4 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
第6章 • 转移范围可达到32位全偏移 • 转移范围仍为短转移 条件转移 Jcc label ;cc为真,转移到label指定的段内偏移地址处 JECXZlabel ;ECX=0,转移到label指定的段内偏移地址处 LOOP/LOOPZ/LOOPNZlabel ;循环指令,32位段采用ECX作为计数器
例6.1 mov ecx,16 mov bx,ax next: shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx
6.3 32位指令的程序设计 • 指定汇编程序识别新指令 • 处理16位段和32位段 • 注意有些指令在16位逻辑段和32位逻辑段的差别 • DOS环境(实地址方式和虚拟8086方式),只能使用16位段 • Windows 32位保护方式,可以使用32位段
例6.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]
例6.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
例6.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
例6.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
例6.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
例6.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
例6.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 ;比较前后两个数据的大小
例6.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
例6.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
例6.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),则退出
例6.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),则退出
例6.6-10/10 mov ah,2 ;显示 int 21h jmp eaxdisp3 eaxdisp4: pop edx pop ebx ret EAXdisp endp end
6.4.1 80386新增指令 • 80386的执行单元可以实现快速移位操作,80386新增的指令主要就是有关位操作的 • 80386还增加了条件设置指令,以及对控制、调试和测试寄存器的传送指令 • MASM 5.0开始支持80386指令系统
第6章 位测试指令 BT dest,src ;把目的操作数dest中由源操作数src指定的位送CF标志 BTC dest,src;把dest中由src指定的位送CF标志,然后对那一位求反 BTR dest,src ;把dest中由src指定的位送CF标志,然后对那一位复位 BTS dest,src ;把dest中由src指定的位送CF标志,然后对那一位置位 moveax,12345678h ;EAX=12345678h bt eax,5;EAX=12345678h,CF←1=EAX的D5位 btc eax,10;EAX=12345278h,CF←1=EAX的D10位 btr eax,20;EAX=12245278h,CF←1=EAX的D20位 bts eax,34;EAX=1224527Ch,CF←0=EAX的D2位
第6章 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 条件设置指令 SETcc r8/m8 ;若条件cc成立,则r8/m8为1;否则,为0
6.4.2 80486新增指令 • 80486的指令系统是在80386指令集的基础上增加了6条新指令,新增的指令主要用于对多处理器系统和片上高速缓冲存储器的支持 • 为了让汇编程序汇编这些指令,源程序中必须具有.486或.486P伪指令 • MASM 6.0开始支持80486指令系统
第6章 mov eax,00112233h ;EAX=00112233h bswap eax;EAX=33221100h 字节交换指令 BSWAP r32 ;将32位通用寄存器值的第1和4字节、第2和3字节互换
第6章 mov bl,12h mov dl,02h xadd bl,dl;BL=14h,DL=12h 交换加指令 XADD reg/mem,reg ;reg/mem←→reg,reg/mem←reg+reg/mem
第6章 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 比较交换指令 CMPXCHG reg/mem,reg ;AL/AX/EAX-reg/mem ;相等:ZF=1,reg/mem←reg ;不等:ZF=0,AL/AX/EAX←reg/mem
6.4.3 Pentium新增指令 • Pentium新增了几条非常实用的特权指令 • 源程序中必须具有.586或.586P伪指令 • MASM 6.11开始支持Pentium指令系统 • 较低版本的汇编程序可以定义宏实现: CPU_IDMACRO ;;CPUID指令的机器代码 DB 0FH,0A2H ;;0F A2 ENDM • 也可以直接在该指令处用: DB 0FH,0A2H • 这样,无需新版本汇编程序就可以开发最新生产的微处理器程序
第6章 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 比较交换指令 CMPXCHG reg/mem,reg ;AL/AX/EAX-reg/mem ;相等:ZF=1,reg/mem←reg ;不等:ZF=0,AL/AX/EAX←reg/mem
6.4.4 Pentium Pro新增指令 • Pentium Pro指令系统新增3条实用的指令 • 程序中必须具有.686或.686P伪指令 • MASM 6.12开始支持Pentium Pro指令
第6章 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指令,从而消除分支 条件传送指令 CMOVcc r16,r16/m16;若条件cc成立,则r16←r16/m16;否则,不传送 CMOVcc r32,r32/m32;若条件cc成立,则r32←r32/m32;否则,不传送
第6章 教学要求(1) 熟悉32位80x86CPU的3种工作方式和32位寄存器组 掌握32位寻址方式 理解16位指令如何实现32位扩展,熟悉常用16位指令的32位扩展功能及应用,其中新增指令: PUSHA/POPA、MOVSX/MOVZX INS/OUTS、JECXZ
第5章 教学要求(2) 掌握32位指令编程方法 了解常用的32位新增指令 BT/BTC/BTR/BTS、SETcc BSWAP/XADD/CMPXCHG CPUID、CMOVcc