1 / 41

第 6 章

第 6 章. 教学重点. 在 16 位 8086 指令系统基础上,我们扩展到 32 位 80x86 指令系统。重点掌握: 32 位编程环境 32 位寻址方式 32 位指令编程方法. IA-32 结构的指令系统. 整数指令集 16 位整数指令集 32 位整数指令集 浮点指令集 MMX 指令集 SSE 指令集 SSE2 指令集. 主要指令集 在 16 指令基础上形成的 32 位整数指令集. 6 .1 32 位指令的运行环境. 实地址方式 保护方式 虚拟 8086 方式. 16 位逻辑段: 段地址和偏移地址都是 16 位

awena
Download Presentation

第 6 章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 6 章

  2. 教学重点 在16位8086指令系统基础上,我们扩展到32位80x86指令系统。重点掌握: 32位编程环境 32位寻址方式 32位指令编程方法

  3. IA-32结构的指令系统 • 整数指令集 • 16位整数指令集 • 32位整数指令集 • 浮点指令集 • MMX指令集 • SSE指令集 • SSE2指令集 主要指令集 在16指令基础上形成的 32位整数指令集

  4. 6.1 32位指令的运行环境 • 实地址方式 • 保护方式 • 虚拟8086方式 16位逻辑段:段地址和偏移地址都是16位 ——段地址左移4位加偏移地址形成20位物理地址 32位逻辑段:段地址和偏移地址都是32位 ——段地址加偏移地址形成32位线性地址

  5. 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章 6.1.2 32位存储器寻址方式 32位有效地址= 基址寄存器+(变址寄存器×比例)+位移量 • 基址寄存器——任何8个32位通用寄存器之一 • 变址寄存器——除ESP之外的任何32位通用寄存器之一 • 比例——可以是1 / 2 / 4 / 8 • 位移量——可以是8 / 32位值

  7. 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]

  8. 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位的自然增强

  9. 第6章 push 1234h ;压入16位立即数 push 87654321h ;压入16位立即数 call helloabc add sp,6 ;平衡堆栈 将立即数压入堆栈 PUSH i8/i16/i32 ;把16位或32位立即数i16/i32压入堆栈。若是8位立即数i8,经符号扩展成16位后再压入堆栈

  10. 第6章 通用寄存器全部进出栈 PUSHA ;顺序将AX/CX/DX/BX/SP/BP/SI/DI压入堆栈 POPA ;顺序从堆栈弹出DI/SI/BP/SP/BX/DX/CX/AX(与PUSHA相反) ;其中应进入SP的值被舍弃,并不进入SP,SP通过增加16来恢复

  11. 第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

  12. 第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

  13. 第6章 • 转移范围可达到32位全偏移 • 转移范围仍为短转移 条件转移 Jcc label ;cc为真,转移到label指定的段内偏移地址处 JECXZlabel ;ECX=0,转移到label指定的段内偏移地址处 LOOP/LOOPZ/LOOPNZlabel ;循环指令,32位段采用ECX作为计数器

  14. 例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

  15. 6.3 32位指令的程序设计 • 指定汇编程序识别新指令 • 处理16位段和32位段 • 注意有些指令在16位逻辑段和32位逻辑段的差别 • DOS环境(实地址方式和虚拟8086方式),只能使用16位段 • Windows 32位保护方式,可以使用32位段

  16. 例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]

  17. 例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

  18. 例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

  19. 例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

  20. 例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

  21. 例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

  22. 例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 ;比较前后两个数据的大小

  23. 例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

  24. 例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

  25. 例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),则退出

  26. 例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),则退出

  27. 例6.6-10/10 mov ah,2 ;显示 int 21h jmp eaxdisp3 eaxdisp4: pop edx pop ebx ret EAXdisp endp end

  28. 6.4.1 80386新增指令 • 80386的执行单元可以实现快速移位操作,80386新增的指令主要就是有关位操作的 • 80386还增加了条件设置指令,以及对控制、调试和测试寄存器的传送指令 • MASM 5.0开始支持80386指令系统

  29. 第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位

  30. 第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

  31. 6.4.2 80486新增指令 • 80486的指令系统是在80386指令集的基础上增加了6条新指令,新增的指令主要用于对多处理器系统和片上高速缓冲存储器的支持 • 为了让汇编程序汇编这些指令,源程序中必须具有.486或.486P伪指令 • MASM 6.0开始支持80486指令系统

  32. 第6章 mov eax,00112233h ;EAX=00112233h bswap eax;EAX=33221100h 字节交换指令 BSWAP r32 ;将32位通用寄存器值的第1和4字节、第2和3字节互换

  33. 第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

  34. 第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

  35. 6.4.3 Pentium新增指令 • Pentium新增了几条非常实用的特权指令 • 源程序中必须具有.586或.586P伪指令 • MASM 6.11开始支持Pentium指令系统 • 较低版本的汇编程序可以定义宏实现: CPU_IDMACRO ;;CPUID指令的机器代码 DB 0FH,0A2H ;;0F A2 ENDM • 也可以直接在该指令处用: DB 0FH,0A2H • 这样,无需新版本汇编程序就可以开发最新生产的微处理器程序

  36. 第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

  37. 6.4.4 Pentium Pro新增指令 • Pentium Pro指令系统新增3条实用的指令 • 程序中必须具有.686或.686P伪指令 • MASM 6.12开始支持Pentium Pro指令

  38. 第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;否则,不传送

  39. 第6章 教学要求(1) 熟悉32位80x86CPU的3种工作方式和32位寄存器组 掌握32位寻址方式 理解16位指令如何实现32位扩展,熟悉常用16位指令的32位扩展功能及应用,其中新增指令: PUSHA/POPA、MOVSX/MOVZX INS/OUTS、JECXZ

  40. 第5章 教学要求(2) 掌握32位指令编程方法 了解常用的32位新增指令 BT/BTC/BTR/BTS、SETcc BSWAP/XADD/CMPXCHG CPUID、CMOVcc

  41. Take a Rest

More Related