微型计算机原理与接口技术-第14章ppt课件_第1页
微型计算机原理与接口技术-第14章ppt课件_第2页
微型计算机原理与接口技术-第14章ppt课件_第3页
微型计算机原理与接口技术-第14章ppt课件_第4页
微型计算机原理与接口技术-第14章ppt课件_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第14章Windows汇编语言编程初步,14.1Windows基础,14.2Win32汇编源程序的格式,14.3Win32汇编可执行文件的生成,14.4Win32汇编基本语法,14.5创建Windows下的窗口程序,14.1Windows基础,1.Windows的内存管理,Windows操作系统为每一个应用程序建立一个4GB的线性空间。线性空间中只包含该应用程序的数据段和代码段,操作系统使用的代码和数据(如全局描述符表GDT,局部描述符表LDT与页表等)以及一些共享代码和数据等。,2Win32汇编的内存寻址,与实模式的汇编相比,Win32汇编对内存数据的访问更加方便。,(2)Windows操作系统不仅已经预先为要运行的用户应用程序的代码段、数据段和堆栈段设置好描述符,规定这些段的的段基址都为0,段界限都为FFFFFFFFH。而且程序开始执行时,CS,DS,ES,SS里存放的选择子已经指向正确的描述符,程序员不需要给这些段寄存器赋值。在整个程序运行期间,程序员也不应该修改这些段寄存器的值。,(1)在Windows系统中,每个应用程序的整个4GB线性地址空间都作为一个段。代码段和数据段/堆栈段的空间统一的,都是00000000HFFFFFFFFH。在这个4GB的地址空间中,一部分用来存放程序,一部分作为数据区,一部分作为堆栈,另外还有一部分被系统使用。这些部分的地址区域是不重合的。,3Windows下的中断和异常,(1)为了系统的安全,运行在特权级3的应用程序是不能像工作在实模式下一样,自己来编写中断服务子程序,也不能通过修改中断描述符表来调用系统提供的中断服务子程序。,(2)在Windows操作系统中,使用Windows提供的应用程序编程接口(API)来代替中断服务子程序提供的系统功能,4Windows系统下的I/O保护,应用程序执行时,对端口是不能直接进行访问的,也不能使用STI,CLI中断允许和禁止指令。,14.2Win32汇编源程序的格式,14.2.1源程序结构,1.方式选择伪指令.586是一个汇编语言伪指令,含义和DOS汇编相同.,2内存模式选择伪指令.MODEL是用来指定内存模式的伪指令。.MODELFLAT汇编程序自动为各种段寄存器做如下段约定:ASSUMECS:FLAT,DS:FLAT,SS:FLAT,ES:FLATSTDCALL告诉汇编程序参数的传递约定。Win32汇编语言采用STDCALL格式。STDCALL格式参数传递顺序是从右到左,即最右边的参数最先压栈,由被调用者(子程序)恢复堆栈指针。,3.OPTION语句OPTIONCASEMAP:TYPE说明程序中的变量和子程序名是否对大小写敏感,即区分大小写。由于WindowsAPI函数是区分大小写,选项应设置为“OPTIONCASEMAP:NONE”。,4段定义伪指令WIN32中只包含代码段和数据段:DATA和CODE其中数据段又分为三种.DATA.DATA?.CONST.DATA定义已初始化的变量。这些变量的值在程序的执行中可以被更改。.DATA?定义未初始化的变量。.CONST定义常量,这些常量在程序运行过程中是不能更改的.CODE定义代码段。,格式:END标号功能:通知汇编程序,源程序到此结束,标号所对应的指令是程序的启动指令。,5汇编结束语句,Win32汇编语言经典源程序例子,.586.MODELFLAT,STDCALLOPTIONCASEMAP:NONEINCLUDEWINDOWS.INCINCLUDEKERNEL32.INCINCLUDELIBKERNEL32.LIBINCLUDEUSER32.INCINCLUDELIBUSER32.LIB.DATAMsgBoxCaptionDBExampleofwin32,0;消息框标题显示字符串MsgBoxTextDBHello,你好!,0;消息框内显示字符串.CODESTART:INVOKEMessageBox,NULL,addrMsgBoxText,addrMsgBoxCaption,MB_OKINVOKEExitProcess,NULLENDSTART,14.3Win32汇编可执行文件的生成,汇编源程序,*.asm,资源脚本文件,*.rc,汇编程序,资源编译程序,目标程序,*.obj,资源文件,*.res,链接程序,Win32可执行文件,*.exe,Win32汇编软件的开发可分源程序开发和资源开发两部分,汇编链接步骤(以教材例15.1为例),(1)汇编源程序hello.asmml/c/coffhello.asm,(2)链接目标程序hello.objlink/subsystem:windowshello.obj,(3)运行可执行程序hello.exehello.exe,注意:如果该程序有资源文件hello.res,则应该用link将hello.obj和hello.res链接成hello.exe。,14.4Win32汇编基本语法15.4.1标号和变量,Win32汇编使用的高版本汇编中,标号的作用域是当前的子程序。在同一个子程序中的标号不能同名,但在不同的子程序中可以有相同名称的标号。,1.标号,Win32汇编中变量的类型很多,根据变量的作用域可分为全局变量和局部变量。,(1)全局变量用数据定义伪指令在.DATA或.DATA?段定义全局变量。全局变量的作用域是整个程序。,2变量,(2)局部变量,例:LOCALVAR1:WORDLOCALVAR2LOCALVAR310:BYTE,注意:LOCAL伪指令必须紧跟在子程序定伪指令PROC之后,其它指令之前。局部变量不能和全局变量同名。,局部变量的作用域是当前的子程序。定义格式:LOCAL变量1重复数量1:类型,变量2重复数量2:类型,3.获取变量地址,获取全局变量地址使用OFFSET运算符。例:MOVBX,OFFSET变量名,注意:ADDR伪操作符只能在INVOKE的参数中使用。,对于局部变量,MASM对此有一个专用的伪操作符ADDR。格式:ADDR局部变量名和全局变量名,例:INVOKEMessageBox,NULL,ADDRMsgBoxText,ADDRMsgBoxCaption,MB_OK,14.4.2结构,1结构的定义格式:结构名STRUCT字段1类型?字段2类型?结构名ENDS,例:定义一个名为STUDENT的结构,该结构有3个字段。STUDENTSTRUCTNUMBYTE?SEXBYTE?RECORDWORD?STUDENTENDS,2结构变量的定义结构变量的定义格式如下:变量名结构名格式一或变量名结构名格式二,例:定义结构变量STU1STUDENTSTU2STUDENT,3结构变量的访问在汇编中,结构变量的访问的两种较简单的方法:,(1)MOVAX,STU2.RECORD表示把RECORD字段的值放入AX中去。,(2)MOVESI,OFFSETSTU2使用指针存取数据结构,14.4.3子程序,格式:子程序名PROC语言类型可视区域USES寄存器列表,参数:类型.VARARGLOCAL局部变量列表RET子程序名ENDP,(1)语言类型表示参数的使用方式和堆栈平衡的方式,Win32约定的类型是STDCALL。参数传递顺序是从右到左,由子程序恢复堆栈指针。,(2)可视区域PRIVATE表示子程序只对本模块可见;PUBLIC表示对所有的模块可见;EXPORT表示是导出的函数。默认的设置是PUBLIC。,(3)USES寄存器列表表示CPU在进入子程序后自动执行PUSH这些寄存器的指令,在RET子程序返回前自动执行POP指令,用于保护现场。(4)参数和类型参数指参数的名称,在定义参数名的时候不能跟全局变量和子程序中的局部变量重名。对于类型,由于Win32中的参数类型只有32位(DWORD)一种类型,所以可以省略。(5)VARARG表示在已确定的参数后还可以跟多个数量不确定的参数。,完成了子程序定义之后,可以用CALL指令或更方便的INVOKE伪指令来调用子程序。,例:利用子程序完成三数相加N1+N2+N3,假设N1=1122H,N2=3344H,N3=5566H,.586.MODELFLAT,STDCALLOPTIONCASEMAP:NONEINCLUDEKERNEL32.INCINCLUDELIBKERNEL32.LIBINCLUDEWINDOWS.INCCOMPUTEPROTOPARA1:DWORD;计算子程序声明.DATAN1DW1122HN2DW3344HN3DW5566H.DATA?SUMDW?;计算结果,.CODESTART:;调用计算子程序,将数据存放的起始地址作为传递的参数INVOKECOMPUTE,ADDRN1MOVSUM,AX;保存计算结果INVOKEExitProcess,NULL;结束执行程序COMPUTEPROCUSESEAXEBX,PARA1:DWORDMOVEBX,PARA1MOVEAX,0;求和寄存器清0MOVAX,WORDPTREBX;AX=N1ADDAX,WORDPTREBX+2;AX=N1+N2ADDAX,WORDPTREBX+4;AX=N1+N2+N3RETCOMPUTEENDPENDSTART,14.4.4高级语法,Win32的高版本MASM中新引入了一系列的伪指令,涉及条件测试、分支和循环语句。利用它们,汇编语言有了和高级语言一样的结构,配合局部变量和调用参数,为使用Win32汇编编写大规模的Windows应用程序奠定了基础。,1条件测试表达式,在所有的分支和循环语句首先要进行条件测试。条件测试表达式:寄存器或变量操作符操作数,两个以上的表达式可以用逻辑运算符连接CPU标志寄存器一些标志位的状态,相当于一个表达式。,允许的操作符、逻辑运算符和标志位状态见教材表15.4。,例:X=10;X等于10为真EAX!=0;EAX不等于0为真SBYTEPTRAL=8;AL大于等于8时为真,AL为有符号数(X=100)字符串首址偏移-EBXMOVAL,0;最小数-AL.WHILEECXAL);比较MOVAL,DL;大数-AL.ENDIFINCEBX;调整字符串首址偏移INCECX.ENDWMOVMAX+4,AL;保存最大值INVOKEMessageBox,NULL,ADDRMAX,ADDRMsgBoxCaption,MB_OKINVOKEExitProcess,NULLENDSTART,14.5创建Windows下的窗口程序,窗口程序的运行过程,应用程序A消息队列,应用程序A,消息循环过程,GetMessage()TranslateMessage()DispatchMessage(),窗口过程,ret,系统消息队列所有消息,各种用户操作,其它应用程序消息队列,传递消息,回调窗口过程,返回,14.5.2窗口程序示例在Windows操作系统下创建并显示一个窗口程序的编程步骤为:,(1)调用GetModuleHandle函数获得应用程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论