1、CompanyLOGO第六章第六章第六章第六章 3232位位位位80 x8680 x86汇编汇编汇编汇编 电子工业出版社第六章第六章第六章第六章 3232位位位位80 x8680 x86汇编汇编汇编汇编6.180386系统结构16.280 x86CPU的工作方式26.332位扩展指令36.432位程序设计46.1 803866.1 80386系统结构系统结构系统结构系统结构 8086CPU的寻址空间仍然远远不能满足实际应用的需求,解决办法:其一,扩大CPU段寄存器的字长,由16位扩展为32位;其二,改变由段寄存器直接指定段基址构造段地址的方式,给出一种全新的地址描述和构造方法。6.1 8038
2、66.1 80386系统结构系统结构系统结构系统结构80386CPU是32位的CPU,对内、对外的数据总线都是32位,地址总线有32根,所以可直接寻址的空间为232B=4096MB=4GB。80386由以下4个主要特点:(1)支持多任务。(2)支持存储器的段式管理和页式管理,为操作系统实现虚拟存储系统提供了条件。6.1.1 80386 CPU的逻辑结构的逻辑结构 6.1 803866.1 80386系统结构系统结构系统结构系统结构(3)具有保护功能,包括存储器保护、任务特权级保护和任务之间的保护。80386将任务分为4个等级,称为特权级RING,分别是0、1、2、3。(4)硬件支持调试功能。6
3、.1 803866.1 80386系统结构系统结构系统结构系统结构6.1.1 32位微处理器基本寄存器组位微处理器基本寄存器组 通用寄存器描述符高速缓存器用户不可见图6-1 Pentium基本结构寄存器组BAXEBXECXEDXESIEDIEBPESP31160158 7AHALBHBLCHCLDHDLSIBPDISPEIP31161150段寄存器150CSDSESFSGSSS52 516320 190段基地址段界指令指针IP6.1 803866.1 80386系统结构系统结构系统结构系统结构1通用寄存器EAX,EBX,ECX,EDX,ESI,EDI,EBP和ESP,是由原来相应的16位寄存器
4、扩展来的。这些寄存器的低16位可作为16位寄存器单独使用,它们是AX,BX,CX,DX,SI,DI,BP和SP,使用时不影响高16位的值。2段寄存器:除了CS、DS、SS和ES外,又增加了两个段寄存器FS和GS,每个段寄存器都有一个相应的64位描述符高速缓存器,这些高速缓存器是用户不可见的。6.1 803866.1 80386系统结构系统结构系统结构系统结构在保护模式下,段寄存器的内容是选择符。在保护模式下,段寄存器的内容是选择符。b1、b0位为请求特权级位为请求特权级RPL,b2 为表指示位为表指示位 TI,为,为 1 时访问局部描述符表时访问局部描述符表 LDT,为,为 0时访问全局描述符
5、表时访问全局描述符表GDT;b3b15为选择子,这为选择子,这13位选择子(位选择子(8)为访问)为访问描述符表的索引值。不论什么时候改变了段寄存描述符表的索引值。不论什么时候改变了段寄存器的内容,与该选择符对应的器的内容,与该选择符对应的8字节(字节(64位)描述位)描述符就被分段部件自动从位于内存的描述符表取来,符就被分段部件自动从位于内存的描述符表取来,装载到相应的描述符高速缓存器中的段访问都去装载到相应的描述符高速缓存器中的段访问都去查内存汇总的描述符表,加快了访问速度。查内存汇总的描述符表,加快了访问速度。6.1 803866.1 80386系统结构系统结构系统结构系统结构3指令指针
6、和标志寄存器EIP以代码段寄存器CS的描述符高速缓存器中的基地址位代码段基地址,它存放下一条指令相对于基地址的偏移量,以产生实际的32位指令线性地址;EIP的低16位名为IP,是16位的指令指针,供16位寻址时使用。6.1 803866.1 80386系统结构系统结构系统结构系统结构标志寄存器EFLAGS是一个32位寄存器,低16位名为FLAGS,也是在16位寻址方式时使用。CF=进位标志(S),PF奇偶校验标志(S),AF=辅助进位标志(S),ZF=零标志(S),SF=符号标志(S),TF=陷阱标志(X),IF=中断允许标志(X),DF方向标志(C),OF=溢出标志(S0)。ID VIPVI
7、FACVM RF0 NT IOPL OF DF IF TF SF ZF0 AF 0PF0 CFIOPL21 20 19 18 17 16 15 14 13 1211 1098765432103122图6-2 标志寄存器EFLAGS6.1 803866.1 80386系统结构系统结构系统结构系统结构IOPL(b13,b12)=IO特权值(X),用于指明在保护模式下不产生异常中断13而执行IO指令所要求的最大CPL(当前特权级)的允许值。NT(b14)=嵌套任务标志(X),该位置位指明当前任务嵌套在另一个任务中执行,用于保护模式。NT=1时执行IRAT指令引起TSS反向链装入TR,返回父任务,否则
8、返回同任务。6.1 803866.1 80386系统结构系统结构系统结构系统结构RF(b16)恢复标志(X)Z,是与调试寄存器的断点操作一起使用的标志。该位置位时即使遇到断点或调试故障,也不产生异常中断1。在成功地执行每条指令时,RF自动被复位。一进入断点处理程序先将此位置1,然后压入堆栈,断点处理完毕时,将其弹出,使以后的指令不按断点指令执行。VM(b17)V86模式标志(X),该位置位时表明当前工作在虚拟86(V86)模式下。AC(b18)=对准检查标志(X)。所谓对准是访问字数据(16bit)时地址应为偶数,访问双字数据(32bit)时地址应为4的倍数,访问4字数据(64bit)时地址应
9、为8的倍数。6.1 803866.1 80386系统结构系统结构系统结构系统结构VIF(b19)虚拟中断标志(X)VIP(b20)=虚拟中断挂起标志(X)虚拟中断(virtualinterrupt)用于多任务环境中,虚拟中断标志是所用中断标志的虚拟映象,虚拟中断挂起标志指示虚拟中断是否被挂起。ID(b21)=识别标志(X),若这位能被置位和复位,则指明这个处理器能支持CPUID指令。该指令能提供处理器的厂商、系列和模式等信息。VIF、VIP和ID这三个标志位是Pentium比之80486新增加的标志位。6.1 803866.1 80386系统结构系统结构系统结构系统结构4调试寄存器和测试寄存器
10、DR0DR7,用来进行程序调试。DR0DR3用来容纳4个32位的断点地址,DR4、DR5保留DR6是断点状态寄存器DR7是断点控制寄存器。另外还有两个32位测试寄存器TR(TestRegister),分别命名为:TR6于TR7。其中TR6位测试命令寄存器,用于存放测试时使用的标记信息和控制信息;TR7为测试数据寄存器,容纳用于TLB测试的数据。6.1 803866.1 80386系统结构系统结构系统结构系统结构6.1.1 80386微处理器系统级寄存器组微处理器系统级寄存器组 6.1 803866.1 80386系统结构系统结构系统结构系统结构系统级寄存器组包括4个表(或段)的系统地址寄存器G
11、DTR、IDTR、LDTR、TR和5个控制寄存器CR0,CR1,CR2,CR3,CR4。1系统地址寄存器80386中设置了4个系统地址寄存器GDTR、IDTR、LDTR、TR,用来管理位于主存的4类系统表(或段),它们是全局描述符表GDT、中断描述符表IDT,局部描述符表LDT和任务状态段TSS。6.1 803866.1 80386系统结构系统结构系统结构系统结构IDT存放中断门描述符、陷阱门描述符和任务门描述符。TSS保存有任务的环境,缺省时只有104字节,LDT和TSS是每个任务各一个,系统中可以存在多个LDT和TSS。任何时候系统只有一个GDT和一个IDT。GDT的存储位置由全局描述表寄
12、存器GDTR指向,IDT的存储位置由中断描述表寄存器IDTR指向,两个表基地址寄存器还有16位的表限字段,即表最大长度为64KB。而多个的LDT和TSS,每个的表(或段)的基地址、表(或段)限、属性等又以描述符的形式登记在GDT中。6.1 803866.1 80386系统结构系统结构系统结构系统结构当前使用的当前使用的LDT和和TSS,分别由局部描述符表寄存器,分别由局部描述符表寄存器LDTR和任务寄存器和任务寄存器TR(各为(各为16位长)以选择符形式指出,位长)以选择符形式指出,即以指定的选择符查找即以指定的选择符查找GDT,读取相应的描述符并装入各,读取相应的描述符并装入各自相应的描述符
13、高速缓存器,才得到当前自相应的描述符高速缓存器,才得到当前LDT和和TSS的基的基地址及界限和属性等信息。地址及界限和属性等信息。2控制寄容器控制寄容器 80386 CPU开始具有开始具有CR0 CR3四个控制器,用来保存四个控制器,用来保存全局性和任务无关的机器状态,它们的长度为全局性和任务无关的机器状态,它们的长度为32位。位。CR0:机器控制寄存器,有:机器控制寄存器,有6位预定义的标志位。第位预定义的标志位。第31位位(PG)允许分页,第)允许分页,第0位(位(PE)保护允许位,为)保护允许位,为0时提供时提供实模式方式,为实模式方式,为1时则保护模式启动。由时则保护模式启动。由PG位
14、和位和PE位定位定义的四种操作环境如表义的四种操作环境如表6-1所示。所示。6.1 803866.1 80386系统结构系统结构系统结构系统结构PGPE方式方式00实模式,实模式,8086/8088操作操作01保护模式,但不允许分页保护模式,但不允许分页10出错,目前尚未定义出错,目前尚未定义11允许分页的保护模式允许分页的保护模式CR1:保留,以备将来使用。CR2:页故障线性地址寄存器,保存最后出现故障的32位线性地址。CR3:页目录基址寄存器,保存页目录表的物理基地址,其中第3112位为页目录表的物理基地址。页目录表总是放在以4KB为单位的存储器地址边界尚,因此,它的地址的低12位总为0,
15、不起作用。6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式 80 x86有三种工作方式:实模式,保护模式和虚拟8086模式。如表6-2所示,通过指令对控制寄存器CR0的PG、PE位和标志寄存器EFLAGS的VM位的设置,可以使80386CPU在3种工作模式中进行切换和选择。PGPEVM工作模式工作模式00N/A实模式,和实模式,和8086兼容兼容010保护模式,不分页保护模式,不分页011保护模式下虚拟保护模式下虚拟8086模式模式110保护模式,分页保护模式,分页111保护模式下虚拟保护模式下虚拟8086模式,模式,分页分页6.2 80 x86CP
16、U6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式1实模式实模式是自8086一直延续继承下来的16位模式。逻辑地址形式为段地址:偏移地址,二者均是16位。将段名所指定的段寄存器的内容乘以16(即左移4位),得到20位段基址,加上16位偏移即得20位物理地址。实模式使用A0A19的20根地址线,最大物理地址空间为1MB。6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式2保护模式受保护的虚拟地址模式(ProtectedVirtualAddressMode)简称为保护模式。这是80386才具备并一直延续下来的32位模式。80386的存储管
17、理部件MMU设有分段部件SU和分页部件PU,允许SU、PU单独工作或同时工作。于是保护模式又细分为如下三种模式:6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式1)分段不分页模式本模式下的虚拟地址(或逻辑地址)采用段式映象产生,虚拟地址由一个16位的段参照和一个32位的偏移组成。段参照的最低2位与保护机构打交道,高14位用于指定具体的段。一个进程可拥有的最大虚拟地址空间是214+32=246=64TB。2)分段分页模式这是一种在分段基础上添加分页存储管理的模式。即将分段部件SU转换后的32位线性地址看成由页目录、页表和页内偏移三个字段组成,由分页部件
18、PU完成两级页表的查找将其转换成32位物理地址。6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式3)不分段分页模式这个模式下分段部件SU不工作,只是分页部件PU工作。程序也不提供段选择符,以寄存器提供的32位地址,该地址被看成是由页目录、页表和页内偏移三个字段组成。由分页部件PU完成虚拟地址到物理地址的转换。进程所拥有的最大虚拟空间是232=4GB。6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式页面表(Page Tables)虚拟设备驱动程序(VxD)VMM(Virtual Machine Manager
19、)System DLL(User32 dll,Kernel32 dll.etc)内存映射文件(Memory-mapped Files)Win 16 应用程序全局区的高端Win 32 应用程序的Code,Data,ResourcesWin 16应用程序全局区的低端MS-DOS4GB3GB2GB4MB0系统内存区环0级共享应用程序共享内存区环3级共享应用程序局部内存区(环3级)(独立的线性地址空间)DOS内存区(环3级)图6-4 Win95线性地址空间3平展模式及其线性空间6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式1)DOS内存区(04MB)2)W
20、in32应用程序的代码(4MB2GB)3)共享内存区(2GB3GB)这部分对应的内存空间我们称之为“应用程序共享内存区”,这里存放着环3级应用程序需要共享的数据和代码。4)系统内存区(3GB4GB)这部分内存空间称为系统内存区。只有环0级的VMM和VxD可以访问这部分内存空间。6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式4虚拟86模式在32位保护模式下支持16位实模式应用程序运行的特殊保护模式,简称V86模式。CPU中EFLAG寄存器的VM位(b17位)即为V86模式位,已经工作在保护模式下的CPU,若VM=1,则CPU运行V86模式,否则运行一
21、般保护模式。这种相互切换由任务转换或中断来完成。6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式V86模式也是将段寄存器的内容乘以16作为段的基地址,再加上16位偏移量而得到访问存储器的线性地址,这与实模式形成物理地址的方式相同。尽管实方式下80386以及后续的80 x86的功能要大大超过其先前的处理器(8086/8088,80186,80286),但只有在保护方式下,80 x86才能真正发挥更大的作用。主要表现在以下几个方面:6.2 80 x86CPU6.2 80 x86CPU的工作方式的工作方式的工作方式的工作方式在保护方式下,80 x86的全部
22、32条地址线都有效,可寻址高达4G字节的物理地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;支持虚拟8086方式,便于执行8086程序。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令 80 x86指令在寻址时,逻辑地址(即偏移地址或有效地址)可有两种方法产生:由基址(变址*比例)位移量基址、变址、比例及位移量中部分项组合计算 其中基址是任何通用寄存器的
23、内容,包括EAX、EBX、ECX、EDX、ESI、EDI、EBP及ESP,这些寄存器可以存放数据,也可以存放地址;变址是除ESP以外的任何通用寄存器的内容,通常用来访问阵列中的元素或字符串;比例是与变址寄存器相乘的因子1、2、4或8;位移量是8位、16位、32位的立即数。6.3.1 新增的寻址方式新增的寻址方式 6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令DS是默认的数据段寄存器,例如:MOVEAX,12345678H;默认DS为数据段寄存器。SS是默认的堆栈段的段寄存器,在使用EBP、ESP作为指针访问堆栈时,即BP或EBP或ESP出现在方括号内时操作数均被认为在堆栈内,
24、默认的段寄存器是SS。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令80 x86的寻址方式增加的寻址方式(1)比例变址寻址汇编格式:XEIR*比例功能:逻辑地址X(EIR)*比例说明:X为位移量,EIR代表变址寄存器。例如:MOV EBX,ADR EDI*4源操作数EA=(EDI)*4+ADR(2)基址比例变址寻址汇编格式:EBREIR*比例功能:逻辑地址(KBR)(E1R)*比例说明:EBR代表基址寄存器。例如:MOV EBX,EBP*8EAX源操作数EA=(EBP)*8+(EAX)6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(3)带位移的基址比例变址寻
25、址汇编格式:XXBREIR*比例功能:逻辑地址(EBR)(EIR)*比例X例如;MOV ECX,XEBP ESI*4源操作数EA=(ESI*4)+(ESP)+X6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令1、数据传送*(1)数据传送指令格式:MOVSX/MOVZXopt1,opt2功能:将8位带符号数扩展成16位或32位数,16位带符号数扩展成32位数再传送。说明:MOVSX实现有符号数扩展传送,用源操作数的符号位填充高位,MOVZX实现无符号数扩展传送(用0填充高位);6.3.2 常用常用32位扩展指令位扩展指令 6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩
26、展指令例如:MOVSXEAX,BL执行的操作:将BL内容带符号扩展成32位送入EAX中。如果两操作数位数相等,则仅实现传送。实例:将一个8位或16位寄存器/存储器的值传送到一个寄存器中,这个寄存器要用符号扩充到16位或32位。执行前BH的值为8F(符号为1),CL的值为0F8H。MOVSXAX,BH;AX=FF8FMOVZXDX,CL;DX=00F8HMOVSXEBX,CL;EBX=0FFFFFFF8HMOVSXEBX,DX;EBX=0000000F8HMOVSXAX,DX;AX=00F8H(仅传送)6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(2)地址传送指令1)LEA指
27、令格式:LEAopt1,opt2功能:将存储器的偏移地址送32位寄存器说明:opt1为32位寄存器,opt2为存储器2)LDS格式:LDSopt1,opt2功能:48位存储器32位寄存器,48位存棕器4DS说明:将48位存储器相继6个字节内容送到指定的32位寄存器和DS。opt1为32位寄存器,opt2为48位存储器3)LES格式:LESopt1,opt2功能:与LDS类似,只是将段址送ES说明:opt1为32位寄存器,opt2为48位存储器6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(3)堆栈操作1)PUSHopt功能:将l6位或32位立即数压人堆栈,非16或32位数据将
28、自动作相应扩展。说明:opt为16位立即数或PUSH32位立即数2)PUSHA功能:将通用寄存器AX、CX、DX、BX、SP、BP、SI及DI顺序压入堆栈。*3)PUSHAD功能:将通用寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI及EDI顺序压入堆栈。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令4)POPA功能:将SP指示的内容顺序弹至通用寄存器DI、SI、BP、SP、BX、DX、CX、AX中。*5)POPAD功能:将ESP指示内容顺序弹出至通用寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX中。实例:在中断服务程序中,一般都必须要保护中
29、断程序要用到的寄存器(即保护现场)。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令IntHandlerprocfar;定义一个过程stipushapopairetIntHandlerendp比较以前学过得的PUSH/POP指令,以上的程序变得非常的简洁。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令2、算术运算*(1)XADD(交换加)格式:XADDopt1,opt2功能:opt1opt1opt2,opt2原opt1。说明:opt1可以是存储器与寄存器;opt2只能是寄存器。例:若(AH)11H,(AL)01H则执行XADDAH,AL后(AH)12H,(AL
30、)11H。*(2)CMPXCHG(比较传送)格式:CMPXCHGopt1,opt2功能:由opt1opt2置ZF位,若ZF=1,则opt1opt2;若ZF=0,则opt1送AL/AX/EAX。说明:opt1可以是寄存器或存储器,opt2只能是寄存器。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(3)IMUL有符号数乘法格式一:IMULopt1,opt2功能:寄存器寄存器*立即数,乘后的结果限制为16位的有符号数,如果溢出,则丢掉超过部分并置CFOF1。说明:opt1为位寄存器,opt2为立即数例:IMULCX,4;CXCX*4格式二:IMULopt1,opt2,opt3或I
31、MULopt1,opt2,opt3功能:寄存器存储器*立即数或寄存器寄存器*立即数说明:opt1是寄存器,opt2是存储器,opt3是立即数。例:IMULBX,BUF,2;BXBUF*26.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(4)CWDE与CDQ有符号数扩展指令功能:CWDE将AX中有符号数的符号扩展到EAX的高位部分。CDQ将EAX中有符号数的符号扩展到EDX。3、移位指令(1)SAL算术左移格式:SALopt,COUNT功能:与SALopt,CL相同说明:当COUNT1时,使用SALopt,1称为算术左移1位指令。6.3 326.3 32位扩展指令位扩展指令位扩展
32、指令位扩展指令(2)SAR算术右移格式:SARopt,COUNT功能;与SARopt,CL相同说明:当COUNT1时,使用SARopt,1称为算术右移1位指令。(3)SHL逻辑左移格式:SHLopt,COUNT功能:与SHLopt,COUNT相同说明:当COUNT1时,使用SHLopt,1称为逻辑左移1位指令。(4)SHR逻辑右移格式:SHRopt,COUNT功能:与SHRopt,CL相同说明:当COUNT1时使用SHRopt,1称为逻辑右移1位指令。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(5)RCL进位循环左移格式;ECLopt,COUNT功能:opt内容连同CF左
33、移COUNT位。说明:(1)CF有变化OF不确定opt可以是寄存器也可以是存储器;(2)当COUNTl时,称进位循环左移1位指令,即使用RCRopt,1格式。如果移位前后最高位不等,则OF1,否则OF0,CF,OF均有变化。(6)RCR进位循环右移格式:RCRopt,COUNT功能:opt连同OF右移COUNT位说明:(1)CF有变化OF不确定,(2)当COUNT1时,称进位循环右移1位指令,即使用RCRopt,1。如果移位前后的最高2位不等,则OF1,否则OF0,此时CF,OF有变化。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令*(7)SHLD联合左移格式:SHLDopt
34、1,opt2,COUNT功能:CF与optl联合左移COUNT次,右边移空的位用opt2从左边开始顺序提供说明:AF不确定,CF、OF、PF、SF、ZF有变化。*(8)SHRD联合右移格式;SHRDoptl,opt2,COUNT功能:将opt1右移COUNT次,左边空出的位用opt2从右边顺序读出补充,第二操作数不变。说明;AF、OF不确定,CF、PF、SF、ZF有变化6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令4、字符串操作源串指针放在SI或ESI中,目的串指针应放在DI或EDI中。对双字操作时,指针增减4。*(1)MOVSD串传送功能:将SI或ESI所指源串中的双字传送
35、到DI或EDI所指的目的串中,此操作不影响标志位。*(2)LODSD串装入功能:将SIESI所指源串中的一个双字元素送EAX中,该指令对标志位无影响。*(3)STOSD串存储功能:将EAX中的内容存入DIEDI所指目的串中,对标志位无影响。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令*(4)CMPSD串比较功能:将SIESI所指源串中的双字元素的值与DIEDI所指目的串中的元素进行比较。对标志位的影响同CMP。*(5)SCASD串扫描功能:在目的串中的扫描EAX中的内容,对标志位的影响同CMP。格式:INSBINSWINSopt,DX例:LESDI,DESTMOVDX,30
36、1HMOVECX,8REPINSB6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令*(6)INSD串输入功能:从DX给出的端口地址读入一个字符或双字,并送DIEDI所指向的目的串中,对标志位无影响。格式:OUTSDx,optOUTSBOUTSW例:LEAESI,SOURCEMOVDX,300HMOVECX,8REPOUTSB*(7)OUTSD串输出功能:将SIESI所指源串的一个字符字双字元素从DX寄存器给出端口地址中输出。该指令对标志位无影响。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令5、转移指令(1)段内直接调用格式:CALL32位地址的近标号功能:对
37、32位地址,ESPESP4,SS:ESPEIP,EIPOFFSET近标号。(2)段内间接调用格式:CALLOPD32功能:对32位的地址,ESPESP4,SS:ESPEIP,EIP一32位地址变量。说明:OPD32可以是32位的寄存器或存储器。(3)段间直接调用格式:对32位地址,ESPESP4,SS:ESPCS;ESPESP4,SS:ESPEIP;CSSEG远标号,EIPOFFSET远标号。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(4)段间间接调用格式:CALL32位的存储器功能:对32位地址,ESPESP4,ES:ESPCS;ESPESP4,SS:ESPEIP;CS
38、48位的存储器4,EIP48位的存储器。(5)段内返回格式:RETNRET空16位立即数32位立即数功能:对16位操作数,IPSS:SP,SPSP十2,或SPSP十2十16位立即数对32位操作数,EIPSS:ESP,ESPESP十4,或ESPESP十4十32位立即数。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(6)段间返回格式:RERFRET空16位立即数32位立即数功能:对16位操作数:IPSS:SP,SPSP十2或SPSP十2十16位立即数CSSS:SP,SPSP十2或SPSP十2十16位立即数对32位操作数:EIPSS:ESP,ESPESP十4或ESPESP十4十3
39、2位立即数。CSSS:ESP,ESPESP十4或ESPESP十4十32位立即数。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令*6、移位指令以下各指令其后均可以是8位的寄存器或8位的存储器操作数。(1)SETASETNBE高于设置功能:如果CF0,ZF0即高于或不低于等于,则地址变量1,否则地址变量为0。(2)SETAESETNB,高于等于设置功能:如果CF0,即高于等于不低于,则地址变量1、否则地址变量为0。(3)SETSETNAE低于设置功能:如果CF1即低于或不高于等于,则地址变量1,否则地址变量0。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(4)
40、SETBESETNA低于等于功能:如果CF1或ZF1,即低于等于或不高于,则地址变量1,否则地址变量为0。(5)SETNESETNZ不等于设置功能:如果ZF0,即不等于或不为0,则地址变量1,否则地址变量0。(6)SETGSETNLE大于设置功能:如果ZF0或SF0,即大于或不小于等于,则地址变量1,否则地址变量=0。(7)SETGESETNL大于等于设置功能:如果SFOF,即大于等于或不小于,则地址变量=1,否则地址变量=0。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(8)SETLSETNGE小于设置功能:如果SFOF,即小于或不大于等于,则地址变量=1,否则地址变量=
41、0。(9)SETLESETGE小于等于设置功能:如果ZF1或SFOF,即小于等于或不大于等于,则地址变量1,否则地址变量0。(10)SETNO无溢出设置功能:如果OF0,即无溢出,则地址变量1,否则地址变量0。(11)SETNS正号设置功能:如果SF0,即为正号,则地址变量1,否则地址变量0。6.3 326.3 32位扩展指令位扩展指令位扩展指令位扩展指令(12)SETO溢出设置功能:如果OF1,即溢出,则地址变量1,否则地址变量0。(13)SETPSETPE偶校验设置功能:如果PF1,即偶校验,则地址变量1,否则地址0。(14)负号设置功能:如果SF1,即负号,则地址变量1,否则地址变量0。
42、6.4 326.4 32位程序设计位程序设计位程序设计位程序设计 (1)指定汇编程序识别新指令MASM缺省情况下只接受8086指令集,要使用80186及其以后的微处理器指令,必须使用处理器选择伪指令。例如处理器选择伪指令.386指明MASM接受80386指令(特权指令除外)。(2)处理16位段和32位段针对32位80 x86CPU,编写DOS环境(实模式)的可执行程序,尽管可以利用处理器的32位寄存器、32位寻址方式,但程序的逻辑段必须是16位段,即最大64KB的物理段。只有进入保护方式,才可以使用32位段。采用.386及以上的处理器选择伪指令,在简化段定义格式中,应注意它的位置。当处理器选择
43、伪指令在.model语句之后,程序采用16位段模式;当处理器选择伪指令在.model语句之前,程序采用32位段模式。在完整段定义格式中,段字属性USE16和USE32分别确定16位和32位段模式。6.4 326.4 32位程序设计位程序设计位程序设计位程序设计(3)16位段和32位段中指令有差别由于16位段和32位段的属性不同,有些指令在16位段和32位段的操作会有差别。例如,串操作指令在16位段采用SI/DI指示地址、CX表达个数;而在32位段采用ESI/EDI指示地址、ECX表达个数。另外,由于处理32位数据,变量定义伪指令常采用DWORD属性。6.4 326.4 32位程序设计位程序设计
44、位程序设计位程序设计利用MASM32编制32位汇编程序时有两种工作方式:(1)MASM32编辑器(2)命令行方式汇编命令的一般格式是:ml/c/cofffilename.asm其中参数/c告诉MASM只汇编不链接。参数/coff告诉MASM生成coff格式的目标代码。当汇编成功后会产生filename.obj文件。链接命令是:link/SUBSYSTEM:WINDOWS/LIBPATH:MASM32LIBfilename.obj6.4.1 32位汇编开发环境位汇编开发环境 6.4 326.4 32位程序设计位程序设计位程序设计位程序设计(3)ml命令选项介绍ML/optionsfilelist
45、/linklinkoptions“/options”参数有:/AT允许微小模式(即生成.COM文件)/Bl使用预备链接/c只汇编不链接/Cp保护用户定义的符号,主要起到区分大小写的作用/Cu将所有定义的符号转换为大写字母/Cx保护公共及外部符号/coff生成coff格式的目标代码/D=text定义文本宏/EP由标准输出设备输出预处理列表/F设置堆栈大小(单位:字节)6.4 326.4 32位程序设计位程序设计位程序设计位程序设计/Fe指定可执行文件名/Flfile产生汇编列表信息到指定文件/Fmfile产生映像图到指定文件/Fo指定目标文件名/Fpi生成80 x87仿真代码/Frfile产生受
46、限浏览信息到指定文件/FRfile产生完整浏览信息/G使用Pascal,C,或Stdcall调用/H设置最大外部名长度/I添加库文件路径/link汇编后同时进行链接6.4 326.4 32位程序设计位程序设计位程序设计位程序设计/nologo屏蔽著作权信息/Sa最大化源码表/Sc在列表中产生时间信息/Sf产生第一次通过的列表/Sl设置行宽/Sn禁止符号表列表/Sp设置页长度/Ss设置副标题/St设置标题/Sx列举条件错误/Ta汇编非.ASM文件6.4 326.4 32位程序设计位程序设计位程序设计位程序设计/WX将警告视为错误/W设置警告级别/w与/W0,/WX相同/XI忽略库文件路径/Zd在
47、debug信息中添加行号/Zf建立所有的公共符号/Zi添加符号化的debug信息/Zm与MASM5.10兼容/Zpn设置结构队列/Zs只进行语法检查6.4 326.4 32位程序设计位程序设计位程序设计位程序设计(1)源程序开始可定义方式选择方式选择伪指令为小数点(.),一般格式为:.如果不定义方式选择,默认为实地址模式,可选的工作方式有:.286选择80286指令系统.286P选择保护模式的80286指令系统.386选择80386指令系统.386P选择保护模式的80386指令系统.486选择80486指令系统.486P选择保护模式的80486指令系统.586选择Pentinum指令系统6.4
48、.2 源程序结构源程序结构 6.4 326.4 32位程序设计位程序设计位程序设计位程序设计.586P选择保护模式的Pentinum指令系统.287选择80287数字协处理器.387选择80387数字协处理器.8086选择让Pentinum工作在实地址模式(2)在段定义中允许说明段的使用类型段定义伪指令格式如下:段名SEGMENT其中有两种使用类型:USER16,段地址为16位,位移量也为16位,段的最大长度为64KB,和8086/8088的定义相同。USER32,段地址为16位,位移量为32位,段的最大长度为4GB,只有当源程序中使用工作方式伪指令.586或.586P时,该设置才有效。6.4
49、 326.4 32位程序设计位程序设计位程序设计位程序设计(3)使用简化段定义时增加存储模式FLAT使用这种存储模式将使该程序仅含一个包括程序数据和代码的32位段,该程序类型位EXE。在程序中代码与数据位距缺省值均为NEAR,子程序的类型也是NEAR,并且标识符Codesize、Datasize和Model的值分别为0、0和7。程序将不使用段寄存器FS和GS。段寄存器说明语句如下例:ASSUMECS:FLAT,DS:FLAT,SS:FLAT,ES:FLAT,FS:ERROR,GS:ERROR(4)在非FLAT模式时,源程序可使用6个段寄存器源程序中可使用6个段寄存器CS、DS、SS、ES、FS
50、和GS。6.4 326.4 32位程序设计位程序设计位程序设计位程序设计1、实模式下的段定义格式在8086下定义一个段的完整格式是:段名定位类型组合类型类别80X86下定义一个段的完整格式是:段名定位类型组合类型类别属性类型说明:在80 x86下属性类型有两种:USE32和USE16,USE32表示32位段,USE16表示16位段。如果程序中用到伪指令.386,那么默认的属性类型就是USE32(32位段),如果没有用伪指令指定CPU的类型,那么默认的属性类型就是USE16,在实方式下只能使用16位段,即用USE16。6.4.3 实模式下的编程实模式下的编程 6.4 326.4 32位程序设计位