1、第10章80X86和Pentium指令系统简介q10.1 指令的特点q10.2 寻址方式q10.3 指令系统第10章80X86和Pentium指令系统简介q10.1 指令的特点q10.2 寻址方式q10.3 指令系统10.1 指令的特点n8086.8088的指令向上与80286及后来的80386、80486、各类Pentium兼容,即8086.8088的程序代码可以在更新的80286上运行,类似地,在低档CPU上的程序代码可以在更新的高档CPU上运行。在实地址方式下,80286与8086.8088的程序代码可直接在80286上运行;在保护的虚地址方式下,8086.8088的程序要经过重新汇编之
2、后,才能在80286上运行。第10章80X86和Pentium指令系统简介q10.1 指令的特点q10.2 寻址方式q10.3 指令系统10.2 寻址方式n80286 CPU的寻址方式n80386 CPU的寻址方式n80486 CPU的寻址方式及Win32程序简介n 80286 CPU的寻址方式10.2 寻址方式n80286CPU有两种工作方式:实地址方式和保护虚地址方式。在实地址方式下,80286与8086.8088地址兼容,由16位段选择字左移4位与16位的偏移地址相加得到20位物理地址,可寻址1MB的地址空间,与8086.8088的寻址方式相同。在保护虚地址方式下,可直接寻址的实存空间扩
3、大到16MB,由A23 A0 形成24位物理地址,可寻址的虚空间扩大到1GB,使用段描述符表来寻址。n 80386 CPU的寻址方式10.2 寻址方式80386CPU有三种工作方式:n实模式n保护模式n虚拟8086模式。n 80386 CPU的寻址方式10.2 寻址方式n在实地址方式下,80386与80286对内存的访问方式相同,与8086.8088地址兼容,可寻址1MB的地址空间。n 80386 CPU的寻址方式10.2 寻址方式n在保护虚地址方式下,由A23 A0 形成24位物理地址,可直接寻址的实存空间扩大到16MB;支持存储器的段页式结构,可寻址的虚空间扩大到4GB,访问存储器需要32
4、位物理地址,由虚地址指示器提供48位地址指针,其中前16位是段选择字,后32位是偏移地址。DOS操作系统和16位的Windows3X操作系统工作在实地址方式下,32位的Windows操作系统工作在保护模式下。32位的Windows操作系统,将每一个Win32应用程序放到分开的虚拟地址空间中去运行,也就是每一个应用程序都拥有其相互独立的4GB地址空间,但不是拥有4GB的物理地址空间,而是能够在4GB的范围内寻址。操作系统将会在应用程序运行时完成4GB的虚拟地址和物理地址间的转换。n 80386 CPU的寻址方式10.2 寻址方式n虚拟8086模式下,处理器的工作方式类似于8086.8088:寻址
5、的地址空间是1MB;段寄存器的内容作为段基值;20位存储单元地址由段基值左移4位加偏移地址构成。在虚拟8086模式下,代码段是可写的,与实模式相同,同样数据段也是可执行的,但这可能引起异常。可见在虚拟8086模式下,可以运行DOS及其平台下的程序。但这种模式毕竟是虚拟8086的一种方式,并不完全等同于8086。n 80486 CPU的寻址方式及Win32程序简介10.2 寻址方式n80486从指令系统、寄存器组和存储器管理方式等方面来看,在体系结构上与80386几乎没有多少区别。n操作模式也同80386一样,有实模式,保护模式和虚拟8086模式。n 80486 CPU的寻址方式及Win32程序
6、简介10.2 寻址方式nWin32程序运行在保护模式下的32位的Windows(Win95、Win98等)操作系统环境中。Windows把每一个Win32应用程序放到分开的虚拟地址空间中去运行,每一个应用程序都拥有其相互独立的4GB地址空间,能够在4GB的地址空间范围内寻址。n在DOS的实地址模式下编写汇编语言程序时,我们可以管理系统的所有资源。n32位的Windows(Win95、Win98等)工作在保护模式下,系统所有的资源对应用程序来说都是被“保护”的。n Win32汇编的有关内容10.2 寻址方式1.Win32ASM编译器nBorland公司的MASM5.0nMicrosoft的MAS
7、M6.11n Win32汇编的有关内容10.2 寻址方式nTASM带了Import库,而MASM没有带,但Steve Hutchesson为MASM建立了一个很全的Import库,基本上包括了Windows绝大部分的API函数,这些库、Include文件和其他工具还有MASM6.14版本一起做成了一个MASM32编译器MASM32V5。MASM32宏汇编器有很多特色,像“invoke”,可简化对API函数的调用并对数据类型进行检查。n Win32汇编的有关内容10.2 寻址方式n使用32位的编译器时,首先要指定内存模式。如要生成.com文件,内存模式应指定为tiny,然后按.com文件的规范写
8、文件;生成.exe文件,内存模式应指定为small等。要生成.com文件十分方便,用ml filename.asm即可完成编译链接,不需要exe2bin转换。与MASM5.0相比,MASM32的伪指令功能十分强大,应用起来特别方便。n Win32汇编的有关内容10.2 寻址方式2.资源编辑器nBorland Resource Workshopn推荐网址:n Win32汇编的有关内容10.2 寻址方式3.文本编辑器nUltraeditn网址:n Win32汇编的有关内容10.2 寻址方式4.参考手册nWin32程序员参考手册n推荐网址:n Win32汇编的有关内容10.2 寻址方式nWin32程
9、序框架:.386.MODEL FLAT,STDCALL.DATA .DATA?.CONST.CODE.end第10章80X86和Pentium指令系统简介q10.1 指令的特点q10.2 寻址方式q10.3 指令系统10.3 指令系统n80286的新增指令n80386的新增指令n80486的新增指令n 80286的新增指令10.3 指令系统1.普通指令 共有四条:PUSHA把8个寄存器值压入堆栈。POPA从堆栈中弹出数据恢复8个寄存器的值。INS字符串输入指令。OUTS字符串输出指令。INS指令的功能是从指定的端口输入一字符串到指定内存地址中去。可以使用REP前缀。n 80286的新增指令10
10、.3 指令系统2.高级指令 共有三条:ENTER进入过程,为过程保留堆栈空间和确定过程嵌套级;LEAVE退出过程,释放过程所占堆栈空间;BOUND检查地址寄存器的值是否在数组边界内。n 80286的新增指令10.3 指令系统3.保护方式指令这类指令用于实地址模式和保护虚地址模式的切换,并完成保护模式下的一些专门操作。共有16条指令:ARPL调整请求和特权级别;CLTS清除任务切换标志位;LAR将段描述符中的存取权限装入寄存器;LGDT将从指定地址开始的6个字节装入全局描述符表寄存器中;LIDT将从指定地址开始的6个字节装入中断描述符表寄存器中;LLDT将16位值装入局部描述符表寄存器;n 80
11、286的新增指令10.3 指令系统LMSW装入机器状态字寄存器;LSL将段描述符中的段限值装入寄存器;LTR将16位值装入任务寄存器;SGDT把全局描述符表寄存器的内容存放到内存6个字节单元;SIDT把中断描述符表寄存器的内容存放到内存6个字节单元;SLDT将局部描述符表的16位值存入内存或寄存器中;SMSW存储机器状态字寄存器的值;VERR校验读访问;VERW校验写访问;STR存储任务寄存器(与LTR方向相反)。n 80386的新增指令10.3 指令系统1.增加的新指令(1)测试与置位类指令(2)位扫描指令(3)数的传送与扩展指令(4)双精度移位指令(5)条件设置类指令n 80386的新增指
12、令10.3 指令系统(1)测试与置位类指令格式1:BT 寄存器.存储器地址,寄存器.立即数功能:位测试指令,用于检查指定位,并将该位复制到进位标志位中。格式2:BTR 寄存器.存储器地址,寄存器.立即数功能:位测试且取反指令,用于检查指定位,将该位复制到进位标志位中,并将原指定位取反再置入位。n 80386的新增指令10.3 指令系统(1)测试与置位类指令格式3:BTR 寄存器.存储器地址,寄存器.立即数功能:位测试且复位指令,用于检查指定位,将该位复制到进位标志位中,并将原指定位复位。格式4:BTS 寄存器.存储器地址,寄存器.立即数功能:位测试且置位指令,用于检查指定位,将该位复制到进位标
13、志位中,并将原指定位置位。n 80386的新增指令10.3 指令系统(2)位扫描指令格式1:BSF 寄存器,寄存器.存储器地址功能:位扫描指令,它从源寄存器.存储器地址中的数的最低位(第0位)开始扫描直到置位位为止,并将该置位位的索引(位号)送入目的寄存器中。格式2:BSR 寄存器,寄存器.存储器地址功能:位扫描指令,它从源寄存器.存储器地址中的数的最高位(第31.15位)开始扫描直到置位位为止,并将该置位位的索引(位号)送入目的寄存器中。n 80386的新增指令10.3 指令系统(3)数的传送与扩展指令格式1:MOVSX 寄存器,寄存器.存储器地址 功能:传送有符号数到目的寄存器中,并将符号
14、扩展到操作数的所有位。格式2:MOVZX 寄存器,寄存器.存储器地址功能:传送无符号数到目的寄存器中,并用0进行扩展。n 80386的新增指令10.3 指令系统(4)双精度移位指令格式1:SHLD 寄存器.存储器地址,寄存器,CL.立即数功能:双精度左移指令,第一个操作数左移N(第三个操作数指出)位,其右边空出位由第二个操作数的左边N位填补,CF保持第一个操作数最后一次的移出位。格式2:SHRD 寄存器.存储器地址,寄存器,CL.立即数 功能:双精度右移指令,参见SHLD。n 80386的新增指令10.3 指令系统(5)条件设置类指令这类指令用于测试指定的标志位所处的状态,根据测试结果,将指定
15、的一个8位寄存器或内存单元置1或0:结果为真,8位寄存器或内存单元置1;结果为假,8位寄存器或内存单元置0。这类指令有:SETA.SETNBE,还有SETAE.SETNC、SETB.SETNAE.SETC、SETNA.SETBE、SETE.SETZ、SETG.SETNLE、SETGE.SETNL、SETL.SETNGE、SETLE.SETNG、SETNE.SETNZ、SETNO、SETNS、SETO、SETP.SETPE、SETPO.SETNP、SETS等。n 80386的新增指令10.3 指令系统格式:SETE 8位寄存器.内存单元功能:如果ZF=1则寄存器.存储器地址=1,否则寄存器.存储
16、器地址=0。n 80386的新增指令10.3 指令系统2.增强功能的指令(1)转换指令(2)字符串操作指令(3)整数乘指令IMUL(4)堆栈操作指令(5)中断返回指令IRETDn 80386的新增指令10.3 指令系统(1)转换指令CDQ:转换在EAX中带符号的双字到EDX,EAX中为带符号的四字。它把EAX中的符号位扩展到EDX中的所有位来实现转换。CWDE:把字转换为双字。它把AX中的符号位扩展到EAX中的其他位来把AX中的字转换成EAX中的双字。n 80386的新增指令10.3 指令系统(2)字符串操作指令字符串操作指令CMPSD、INSD、LODSD、MOVSD、OUTSD、SCASD
17、、STOSD可见它们是在字符串操作指令CMPS、INS、LODS、MOVS、OUTS、SCAS、STOS各指令后加D,变成了对双字的操作,类似于加B对字节操作、加W对字操作。仍然是由寄存器DS:SI指向源串,ES:DI指向目标串。n 80386的新增指令10.3 指令系统(3)整数乘指令IMUL在80286中,IMUL有两种格式:IMUL 16位寄存器,立即数IMUL 16位寄存器,16位存储器,立即数 在80386中,新增一种格式:IMUL 寄存器,寄存器.存储器;注意源和目标操作数位数必须相同n 80386的新增指令10.3 指令系统(4)堆栈操作指令在80286中,PUSHA把8个寄存器
18、值压入堆栈,POPA从堆栈中弹出数据恢复8个寄存器的值。上述两个指令对8个16位的寄存器进行堆栈操作,在80386中要对相应的8个32位寄存器进行堆栈操作,需使用PUSHAD、POPAD指令。在80386中要对32位的标志寄存器EFLAG寄存器进行堆栈操作,需使用PUSHFD、POPFD指令。n 80386的新增指令10.3 指令系统(5)中断返回指令IRETD我们前面学过的IERT指令从堆栈中弹出16位的指针,要从堆栈中弹出32位的指针,必须使用IRETD,以从堆栈中弹出一个双字的指针。n 80486的新增指令10.3 指令系统1.字节交换指令BSWAP2.比较与交换指令CMPXCHG3.交
19、换与相加指令XADD4.cache管理指令n 80486的新增指令10.3 指令系统1.字节交换指令BSWAPn本指令用于将32位通用寄存器的双字以字节为单位,高低字节进行交换。n 80486的新增指令10.3 指令系统2.比较与交换指令CMPXCHGn本指令将存放在8位、16位、32位寄存器或存储器中的第一操作数与累加器AL、AX、EAX的内容进行比较:n如相等,则ZF=1,并将存放8位、16位、32位寄存器中的第二操作数送第一操作数的存储单元;n如不相等,则ZF=0,并将第一操作数送相应累加器。n 80486的新增指令10.3 指令系统3.交换与相加指令XADDn本指令将存放在8位、16位、32位寄存器或存储器中的第一操作数与存放在8位、16位、32位寄存器中的第二操作数相加,结果存入到第一操作数,而将第一操作数存入到第二操作数。n 80486的新增指令10.3 指令系统4.cache管理指令(1)INVD:清洗cache指令(2)WBINVD:回写和清洗cache指令(3)INVLPG:作废TLB项指令