您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 12第21讲第08章1.33版_88_060603_Win32汇编指令系统和寻址方式
《微机原理与接口技术》本科课程2006年春季第21讲南京大学计算机系俞建新主讲2006年3月31日2006年3月31日南京大学计算机系俞建新第21讲第2页第8章Win32汇编语言程序设计入门本章介绍以下内容扩充的x86指令系统与寻址方式Win32汇编语言程序设计基本要点Win32汇编语言程序设计举例2006年3月31日南京大学计算机系俞建新第21讲第3页8.1Win32指令系统32位寻址方式与数据相关的寻址方式与转移地址相关的寻址方式指令系统包括数据传送指令,转换指令,算术指令,逻辑、移位、旋转和位操作指令,I/O指令、字符串指令,程序流程控制指令,混杂指令8种。2006年3月31日南京大学计算机系俞建新第21讲第4页Win32有效地址计算(1)位移量位移量可以是一个8位、16位或者是32位的数值和常量2006年3月31日南京大学计算机系俞建新第21讲第5页Win32有效地址计算(2)基址存放在基址寄存器中的内容,它是有效地址中的基址部分。在16位寻址时:基址寄存器可以是BX或者BP;在32位寻址时:任何32位通用寄存器都可以作为基址寄存器基址寄存器的选择影响默认段寄存器的选择,如果基址寄存器是ESP或则EBP,则默认的段寄存器从通常的DS改为SS;如果选择别的基址寄存器或者不试用基址,则DS为默认段寄存器。2006年3月31日南京大学计算机系俞建新第21讲第6页Win32有效地址计算(3)变址存放在变址寄存器中的内容,它是有效地址中的变址部分。16位时:变址寄存器可以是SI和DI32位时:除ESP外的32位通用寄存器都可用作变址寄存器。2006年3月31日南京大学计算机系俞建新第21讲第7页Win32有效地址计算(4)比例因子一个常数,可取值1、2、4或者8;在寻址时,变址寄存器中的内容乘以比例因子来作为EA中的变址部分。2006年3月31日南京大学计算机系俞建新第21讲第8页各种寻址方式有效地址计算示意图基址+(变址×比例因子)+位移量EAXEBXECXEDX----EBPESIEDI无EAXEBXECXEDXESPEBPESIEDI无12488位32位无+×+2006年3月31日南京大学计算机系俞建新第21讲第9页立即寻址方式操作数是一立即数,对立即数的寻址称为立即寻址。80386及其以后的机型,无论工作在实地址方式还是保护方式,立即数可以是8位、16位、32位。例如MOVEAX,0FBB853FFHMOVEBX,1100111000B2006年3月31日南京大学计算机系俞建新第21讲第10页寄存器寻址方式指令的德操作书放在寄存器中,该寄存器号作为指令代码的一部分存放在代码段中。对32位操作数,寄存器可以是EAX,EBX,ECX,EDX,ESI,ESP和EBP例如:MOVEAX,EBX2006年3月31日南京大学计算机系俞建新第21讲第11页直接寻址方式指令中直接提供源操作数的偏移地址,它作为指令代码的一部分存放在代码段中。地址除了用立即数表示外,还可以用符号表示,这样可以方便地访问内存变量。例如MOVAL,DS:[00404000H]MOVCL,ByteVarMOVmemVar,EAX2006年3月31日南京大学计算机系俞建新第21讲第12页寄存器间接寻址方式(1)提供了一种利用寄存器值寻找存储器操作数的方式:操作数的有效地址EA存放在指令指明的寄存器中,即存储器的值就是存放操作时的偏移地址EA。80386种能够用作间接寻址的寄存器有EAX,EBX,ECX,EDX,ESP,EBP,ESI和EDI寄存器。通常用于程序访问存储器中的一维数组或表格。2006年3月31日南京大学计算机系俞建新第21讲第13页寄存器间接寻址方式(2)例如:访问存储器中Array地址开始的10个字节的数据。LEAEBX,Array;把数组的开始地址送EBX寄存器MOVAL,[EBX];访问数组第0个元素,若要访问其他元素,只要增加数组索引EBX的值2006年3月31日南京大学计算机系俞建新第21讲第14页寄存器相对寻址方式有效地址EA等于寄存器R中的内容和位移量X的和,即EA=X+[R]。例如:MOVAX,TblAdrs[ESI]MOVAX,[TblAdrs+ESI]MOVAX,100H[ESI]MOVLIST[EDI+3],AX2006年3月31日南京大学计算机系俞建新第21讲第15页相对基址变址寻址方式有效地址EA等于基址寄存器BR的值加变址寄存器IR的值加位移量X的和,即:EA=X+[BR]+[IR]。通常用于对二维地址的寻址例如:MOVAX,Disp[EBX][EDI]MOVAX,[Disp+EBX+EDI]2006年3月31日南京大学计算机系俞建新第21讲第16页比例变址寻址方式有效地址EA等于位移量X加上变址寄存器IR的内容与比例因子K的乘积之和。即:EA=X+[IR*K]。与寄存器相对寻址相比的优点:对于元素大小为2,4,8字节的数组,可以在变址寄存器中给出下标,由比例因子把下标值转换为变址值。只能在80386及其后继机型使用。2006年3月31日南京大学计算机系俞建新第21讲第17页基址比例变址寻址方式有效地址EA等于基址寄存器BR加上变址寄存器IR的内容与比例因子K的乘积之和。即:EA=[BR]+[IR*K]。只能在80386及其后继机型使用。例如:MOVECX,[EBP][ESI*4]2006年3月31日南京大学计算机系俞建新第21讲第18页相对基址比例变址寻址方式有效地址EA等于位移量X加上基址寄存器BR加上变址寄存器IR的内容与比例因子K的乘积之和。即:EA=X+[BR]+[IR*K]。只能在80386及其后继机型使用。例如MOVAL,00404000H[EBX][ESI*2]2006年3月31日南京大学计算机系俞建新第21讲第19页与转移地址相关的寻址方式用来确定JMP指令及CALL指令的转移地址。段内转移:在指令后附加32位段内偏移地址段内直接寻址方式段内间接寻址方式段间转移:使用48位全指针段间直接寻址方式段间间接寻址方式2006年3月31日南京大学计算机系俞建新第21讲第20页段内直接寻址方式一般格式:JMPLabel转向的有效地址Label是当前EIP寄存器的内容与指令制定的32位偏移量之和。例如:JMPLabel;Label位于后面10字节处执行前:EIP:00404100执行后:EIP:004041102006年3月31日南京大学计算机系俞建新第21讲第21页段内间接寻址方式一般格式:JMPR或者JMP[Addr]转向的地址是一个寄存器或者一个存储单元的内容例如JMPEBXJMPDWORDPTR[EBX]2006年3月31日南京大学计算机系俞建新第21讲第22页段间直接寻址方式一般格式JMPFARPTRLabel根据目标符号地址所在的段得到寄存器和段内偏移地址,用这两个值更新CS和EIP寄存器的值。例如:CALLFARlabel;label=0768:00401000执行前:EIP:00400000ESP:00000100CS:0040执行后:EIP:00401000ESP:000000F80CS:00402006年3月31日南京大学计算机系俞建新第21讲第23页段间间接寻址方式一般格式:JMPFWORDPTR[ADDR]用存储器中ADDR地址的48位内容来取代EIP和CS寄存器的内容。对于存储单元的寻址,可以采用立即数和寄存器寻址方式以外的任何一种寻址方式取得。2006年3月31日南京大学计算机系俞建新第21讲第24页指令系统80X86指令集可以分为以下8组数据传送指令转换指令算数指令逻辑、移位、旋转和位操作指令I/O指令字符串指令程序流控制指令混杂指令2006年3月31日南京大学计算机系俞建新第21讲第25页数据传送指令——LEA指令LEA指令用于向目标寄存器传送源操作数的有效地址EA格式:LEAreg16,memorLEAreg32,mem如果使用16位寄存器作为目标寄存器的话,则把偏移量的低16位保存到目标寄存器中。例如:LEABX,[EAX]LEAEBX,2[EAX]2006年3月31日南京大学计算机系俞建新第21讲第26页数据传送指令—PUSH和POP指令(1)PUSH和POP指令用于操作80X86堆栈。PUSH入栈16位:ESP=ESP-232位:ESP=ESP-4POP出栈16位:ESP=ESP+232位:ESP=ESP+42006年3月31日南京大学计算机系俞建新第21讲第27页数据传送指令—PUSH和POP指令(2)主要有以下组合格式:16位/32位通用寄存器入栈和出栈POPreg,PUSHreg段寄存器入栈和出栈段寄存器不能选择CS寄存器存储器操作数入栈和出栈必须确定操作数的长度。立即数入栈2006年3月31日南京大学计算机系俞建新第21讲第28页数据传送指令—PUSH和POP指令(3)多个16位寄存器入栈和出栈PUSHAPOPAPUSHA把16位通用寄存器全部压入堆栈,入栈顺序为AX,CX,DX,BX,SP,BP,SI,DI,其中SP寄存器的内容是指令前的值。(ESP)=(ESP)-16POPA出栈。2006年3月31日南京大学计算机系俞建新第21讲第29页数据传送指令—PUSH和POP指令(4)多个32位寄存器入栈和出栈PUSHADPOPADPUSHAD把32位通用寄存器全部入栈,入栈顺序为EAX,ECX,EDX,EBX,指令执行前的ESP,EBP,ESI,EDI。(ESP)=(ESP)–322006年3月31日南京大学计算机系俞建新第21讲第30页数据传送指令—PUSH和POP指令(5)16位标志寄存器入栈和出栈PUSHFPOPF32位标志寄存器入栈和出栈PUSHFDPOPFD从堆栈中弹出标志寄存器时,只有在当前特权级为0时,I/O特权级标志位IOP才能被替换。否则,IOP不能被替换,也不产生异常。2006年3月31日南京大学计算机系俞建新第21讲第31页数据传送指令—PUSH和POP指令(6)ENTER和LEAVE指令ENTERimmediate16,immediate8LEAVELAHF和SAHF指令LAHFSAHF2006年3月31日南京大学计算机系俞建新第21讲第32页转换指令(1)字转换位双字命令CWD把AX寄存器的值扩展为32位,并替换DX:AX中的值。CWED把AX寄存器中的值符号扩展到EAX寄存器中。双字节转换为4字指令CDQ把EAX寄存器中的值符号扩展到64位,并替换EDX:EAX中的值。2006年3月31日南京大学计算机系俞建新第21讲第33页转换指令(2)MOVSX完成8位到16位、16位到32位和8位到32位的符号扩展。还可以完成8位到16位或32位的零扩展BSWAP指令BSWAPreg32用于把32位的寄存器以littleendian方式存储的数据转换为bigendian存储方式。只能跟32位的寄存器作为参数,在80486以后的处理器上才有效。2006年3月31日南京大学计算机系俞建新第21讲第34页转换指令(3)XLAT指令把AL寄存器中的值替换成一存储单元的内容,存储单元的地址由EBX+AL指定。2006年3月31日南京大学计算机系俞建新第21讲第35页第21讲结束谢谢大家的使用!欢迎大家提出宝贵意见和建议!俞建新2006年3月30日
本文标题:12第21讲第08章1.33版_88_060603_Win32汇编指令系统和寻址方式
链接地址:https://www.777doc.com/doc-5449604 .html