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和DI„32位时:除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,0FBB853FFH„MOVEBX,1100111000B2006年3月31日南京大学计算机系俞建新第21讲第10页寄存器寻址方式„指令的德操作书放在寄存器中,该寄存器号作为指令代码的一部分存放在代码段中。„对32位操作数,寄存器可以是EAX,EBX,ECX,EDX,ESI,ESP和EBP„例如:„MOVEAX,EBX2006年3月31日南京大学计算机系俞建新第21讲第11页直接寻址方式„指令中直接提供源操作数的偏移地址,它作为指令代码的一部分存放在代码段中。„地址除了用立即数表示外,还可以用符号表示,这样可以方便地访问内存变量。„例如„MOVAL,DS:[00404000H]„MOVCL,ByteVar„MOVmemVar,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]„转向的地址是一个寄存器或者一个存储单元的内容„例如„JMPEBX„JMPDWORDPTR[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-2„32位:ESP=ESP-4„POP出栈„16位:ESP=ESP+2„32位:ESP=ESP+42006年3月31日南京大学计算机系俞建新第21讲第27页数据传送指令—PUSH和POP指令(2)„主要有以下组合格式:„16位/32位通用寄存器入栈和出栈„POPreg,PUSHreg„段寄存器入栈和出栈„段寄存器不能选择CS寄存器„存储器操作数入栈和出栈„必须确定操作数的长度。„立即数入栈2006年3月31日南京大学计算机系俞建新第21讲第28页数据传送指令—PUSH和POP指令(3)„多个16位寄存器入栈和出栈„PUSHAPOPA„PUSHA把16位通用寄存器全部压入堆栈,入栈顺序为AX,CX,DX,BX,SP,BP,SI,DI,其中SP寄存器的内容是指令前的值。„(ESP)=(ESP)-16„POPA出栈。2006年3月31日南京大学计算机系俞建新第21讲第29页数据传送指令—PUSH和POP指令(4)„多个32位寄存器入栈和出栈„PUSHADPOPAD„PUSHAD把32位通用寄存器全部入栈,入栈顺序为EAX,ECX,EDX,EBX,指令执行前的ESP,EBP,ESI,EDI。„(ESP)=(ESP)–322006年3月31日南京大学计算机系俞建新第21讲第30页数据传送指令—PUSH和POP指令(5)„16位标志寄存器入栈和出栈„PUSHFPOPF„32位标志寄存器入栈和出栈„PUSHFDPOPFD„从堆栈中弹出标志寄存器时,只有在当前特权级为0时,I/O特权级标志位IOP才能被替换。否则,IOP不能被替换,也不产生异常。2006年3月31日南京大学计算机系俞建新第21讲第31页数据传送指令—PUSH和POP指令(6)„ENTER和LEAVE指令„ENTERimmediate16,immediate8„LEAVE„LAHF和SAHF指令„LAHF„SAHF2006年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日

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功