收藏 分享(赏)

微机原理第15章.ppt

上传人:天天快乐 文档编号:1462334 上传时间:2018-07-19 格式:PPT 页数:33 大小:279KB
下载 相关 举报
微机原理第15章.ppt_第1页
第1页 / 共33页
微机原理第15章.ppt_第2页
第2页 / 共33页
微机原理第15章.ppt_第3页
第3页 / 共33页
微机原理第15章.ppt_第4页
第4页 / 共33页
微机原理第15章.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、第15章 Windows 汇编语言编程初步,15.1 Windows基础,15.2 Win32汇编源程序的格式,15.3 Win32汇编可执行文件的生成,15.4 Win32汇编基本语法,15.5 创建Windows下的窗口程序,15.1 Windows基础,1. Windows的内存管理,Windows操作系统为每一个应用程序建立一个4GB的线性空间。线性空间中只包含该应用程序的数据段和代码段,操作系统使用的代码和数据(如全局描述符表GDT,局部描述符表LDT与页表等)以及一些共享代码和数据等。,2Win32汇编的内存寻址,与实模式的汇编相比,Win32汇编对内存数据的访问更加方便。,(2)

2、Windows操作系统不仅已经预先为要运行的用户应用程序的代码段、数据段和堆栈段设置好描述符,规定这些段的的段基址都为0,段界限都为FFFFFFFFH。而且程序开始执行时,CS,DS,ES,SS里存放的选择子已经指向正确的描述符,程序员不需要给这些段寄存器赋值。在整个程序运行期间,程序员也不应该修改这些段寄存器的值。,(1)在Windows系统中,每个应用程序的整个4GB线性地址空间都作为一个段。代码段和数据段/堆栈段的空间统一的,都是00000000HFFFFFFFFH。在这个4GB的地址空间中,一部分用来存放程序,一部分作为数据区,一部分作为堆栈,另外还有一部分被系统使用。这些部分的地址区

3、域是不重合的。,3Windows下的中断和异常,(1)为了系统的安全,运行在特权级3的应用程序是不能像工作在实模式下一样,自己来编写中断服务子程序,也不能通过修改中断描述符表来调用系统提供的中断服务子程序。,(2)在Windows操作系统中,使用Windows提供的应用程序编程接口(API)来代替中断服务子程序提供的系统功能,4Windows系统下的I/O保护,应用程序执行时,对端口是不能直接进行访问的,也不能使用STI,CLI中断允许和禁止指令。,15.2 Win32汇编源程序的格式,15.2.1 源程序结构,1.方式选择伪指令.586是一个汇编语言伪指令,含义和DOS汇编相同.,2内存模式

4、选择伪指令.MODEL 是用来指定内存模式的伪指令。.MODEL FLAT 汇编程序自动为各种段寄存器做如下段约定:ASSUME CS:FLAT,DS:FLAT,SS:FLAT,ES:FLATSTDCALL告诉汇编程序参数的传递约定。Win32汇编语言采用STDCALL格式。STDCALL格式参数传递顺序是从右到左,即最右边的参数最先压栈,由被调用者(子程序)恢复堆栈指针。,3.OPTION语句OPTION CASEMAP:TYPE说明程序中的变量和子程序名是否对大小写敏感,即区分大小写。由于Windows API函数是区分大小写,选项应设置为“OPTION CASEMAP:NONE”。,4段

5、定义伪指令WIN32中只包含代码段和数据段:DATA和CODE其中数据段又分为三种.DATA .DATA? .CONST.DATA 定义已初始化的变量。这些变量的值在程序的执行中可以被更改。.DATA? 定义未初始化的变量。.CONST定义常量,这些常量在程序运行过程中是不能更改的.CODE 定义代码段。,格式:END标号 功能:通知汇编程序,源程序到此结束,标号所对应的指令是程序的启动指令。,5汇编结束语句,Win32汇编语言经典源程序例子,.586 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE INCLUDE WINDOWS.INC INCLUDE KER

6、NEL32.INC INCLUDELIB KERNEL32.LIB INCLUDE USER32.INC INCLUDELIB USER32.LIB .DATA MsgBoxCaption DB Example of win32,0 ;消息框标题显示字符串MsgBoxText DB Hello,你好!,0 ;消息框内显示字符串.CODE START: INVOKE MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK INVOKE ExitProcess, NULL END START,15.3 Win32汇编可执行文件的生成

7、,汇编源程序,*.asm,资源脚本文件,*.rc,汇编程序,资源编译程序,目标程序,*.obj,资源文件,*.res,链接程序,Win32可执行文件,*.exe,Win32汇编软件的开发可分源程序开发和资源开发两部分,汇编链接步骤(以教材例15.1为例),(1)汇编源程序hello.asm ml /c /coff hello.asm,(2)链接目标程序hello.obj link /subsystem:windows hello.obj,(3)运行可执行程序 hello.exe hello.exe,注意:如果该程序有资源文件hello.res,则应该用link将hello.obj和hello.

8、res链接成hello.exe。,15.4 Win32汇编基本语法15.4.1 标号和变量,Win32汇编使用的高版本汇编中,标号的作用域是当前的子程序。在同一个子程序中的标号不能同名,但在不同的子程序中可以有相同名称的标号。,1.标号,Win32汇编中变量的类型很多,根据变量的作用域可分为全局变量和局部变量。,(1)全局变量用数据定义伪指令在.DATA或.DATA?段定义全局变量。全局变量的作用域是整个程序。,2变量,(2)局部变量,例:LOCAL VAR1:WORD LOCAL VAR2 LOCAL VAR310:BYTE,注意:LOCAL伪指令必须紧跟在子程序定伪指令PROC之后,其它指

9、令之前。局部变量不能和全局变量同名。,局部变量的作用域是当前的子程序。定义格式: LOCAL 变量1重复数量1:类型, 变量2重复数量2:类型,3. 获取变量地址,获取全局变量地址使用OFFSET运算符。例:MOVBX,OFFSET 变量名,注意:ADDR伪操作符只能在INVOKE的参数中使用。,对于局部变量,MASM对此有一个专用的伪操作符ADDR。格式:ADDR局部变量名和全局变量名,例:INVOKE MessageBox, NULL, ADDR MsgBoxText, ADDR MsgBoxCaption, MB_OK,15.4.2 结构,1结构的定义格式:结构名 STRUCT 字段1

10、类型? 字段2 类型? 结构名 ENDS,例:定义一个名为STUDENT的结构,该结构有3个字段。 STUDENT STRUCT NUM BYTE ? SEX BYTE ? RECORD WORD ? STUDENT ENDS,2结构变量的定义结构变量的定义格式如下:变量名 结构名 格式一或 变量名 结构名 格式二,例:定义结构变量STU1 STUDENT STU2 STUDENT ,3结构变量的访问在汇编中,结构变量的访问的两种较简单的方法:,(1)MOV AX,STU2.RECORD 表示把RECORD字段的值放入AX中去。,(2)MOV ESI,OFFSET STU2 使用指针存取数据结

11、构,15.4.3 子程序,格式:子程序名 PROC 语言类型可视区域USES 寄存器列表 ,参数:类型.VARARG LOCAL 局部变量列表 RET子程序名ENDP,(1)语言类型表示参数的使用方式和堆栈平衡的方式,Win32约定的类型是STDCALL。参数传递顺序是从右到左,由子程序恢复堆栈指针。,(2)可视区域PRIVATE表示子程序只对本模块可见;PUBLIC表示对所有的模块可见;EXPORT表示是导出的函数。默认的设置是PUBLIC。,(3)USES寄存器列表表示CPU在进入子程序后自动执行PUSH这些寄存器的指令,在RET子程序返回前自动执行POP指令,用于保护现场。 (4)参数和

12、类型参数指参数的名称,在定义参数名的时候不能跟全局变量和子程序中的局部变量重名。对于类型,由于Win32中的参数类型只有32位(DWORD)一种类型,所以可以省略。(5)VARARG表示在已确定的参数后还可以跟多个数量不确定的参数。,完成了子程序定义之后,可以用CALL指令或更方便的INVOKE伪指令来调用子程序。,例:利用子程序完成三数相加N1+N2+N3,假设N1=1122H,N2=3344H,N3=5566H,.586 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE INCLUDE KERNEL32.INC INCLUDELIB KERNEL32.LIB

13、INCLUDE WINDOWS.INC COMPUTE PROTO PARA1:DWORD ;计算子程序声明.DATA N1 DW 1122H N2 DW 3344HN3 DW 5566H.DATA?SUM DW ? ;计算结果,.CODE START: ;调用计算子程序,将数据存放的起始地址作为传递的参数 INVOKE COMPUTE,ADDR N1 MOV SUM,AX ;保存计算结果 INVOKE ExitProcess, NULL ;结束执行程序 COMPUTE PROC USES EAX EBX,PARA1:DWORD MOV EBX,PARA1 MOV EAX,0 ;求和寄存器清0

14、 MOV AX,WORD PTR EBX ;AX=N1 ADD AX, WORD PTR EBX+2 ;AX=N1+N2 ADD AX, WORD PTR EBX+4 ;AX=N1+N2+N3 RET COMPUTE ENDP END START,15.4.4 高级语法,Win32的高版本MASM中新引入了一系列的伪指令,涉及条件测试、分支和循环语句。利用它们,汇编语言有了和高级语言一样的结构,配合局部变量和调用参数,为使用Win32汇编编写大规模的Windows应用程序奠定了基础。,1条件测试表达式,在所有的分支和循环语句首先要进行条件测试。条件测试表达式: 寄存器或变量操作符 操作数,两个

15、以上的表达式可以用逻辑运算符连接 CPU标志寄存器一些标志位的状态,相当于一个表达式。,允许的操作符、逻辑运算符和标志位状态见教材表15.4。,例:X=10 ;X等于10为真EAX!=0 ;EAX不等于0为真SBYTE PTR AL=8 ;AL大于等于8时为真,AL为有符号数(X=100)&ECX ;X大于等于100且ECX为非零时为真(EAX= =EBX) & ZERO? ;EAX等于EBX且Z标志=1为真,分支语句的语法如下:.IF条件表达式1 表达式1为“真”时执行的指令.ELSEIF 条件表达式2 表达式2为“真”时执行的指令.ELSEIF 条件表达式3 表达式3为“真”时执行的指令.

16、ELSE 所有表达式为“否”时执行的指令.ENDIF,2分支语句,注意:关键字IF/ELSEIF/ELSE/ENDIF的前面有个小数点。,例:设NUMBER单元的数X以及数值N1,N2均为单字节无符号数,请判断X的大小,并根据判断结果分别显示:N1N2,【例15.4.2】.586 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE INCLUDE KERNEL32.INC INCLUDE WINDOWS.INC INCLUDELIB KERNEL32.LIB INCLUDE USER32.INC INCLUDELIB USER32.LIB .DATA N1 DB 2

17、2N2 DB 88MESG1 DB N1=X=N2,0MESG2 DB XN2,0MsgBoxCaption DB EXAMPLE OF WIN32,0 .DATA?NUMBER DB ?.CODE START: MOV AL,NUMBER .IF(AL=N1 XN2 MOV EBX,OFFSET MESG3 .ENDIF INVOKE MessageBox, NULL, EBX, ADDR MsgBoxCaption, MB_OK INVOKE ExitProcess, NULL END START,3循环语句,(1)循环结构语法一 .WHILE条件测试表达式 指令 .BREAK .IF 退

18、出条件 .CONTINUE .ENDW(2)循环结构语法二 .REPEAT 指令 .BREAK .IF 退出条件 .CONTINUE .UNTIL条件测试表达式 (或.UNTILCXZ 条件测试表达式),例:假设从BUF单元开始为一个ASCII码字符串,找出其中的最大数送屏幕显示。,【例15.4.3】.586 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE INCLUDE KERNEL32.INC INCLUDE WINDOWS.INC INCLUDELIB KERNEL32.LIB INCLUDE USER32.INC INCLUDELIB USER32.LI

19、B .DATA BUF DB QWERYTUIOP123COUNT EQU $-BUFMAX DB Max=,?,0MsgBoxCaption DB Example of win32,0,.CODE START: MOV ECX,0 MOV EBX,OFFSET BUF ;字符串首址偏移-EBX MOV AL,0 ;最小数-AL .WHILE ECXAL) ;比较 MOV AL,DL ;大数-AL .ENDIF INC EBX ;调整字符串首址偏移 INC ECX .ENDW MOV MAX+4,AL ;保存最大值 INVOKE MessageBox, NULL, ADDR MAX, ADDR

20、 MsgBoxCaption, MB_OK INVOKE ExitProcess, NULL END START,15.5 创建Windows下的窗口程序,窗口程序的运行过程,应用程序A消息队列,应用程序A,消息循环过程,GetMessage()TranslateMessage()DispatchMessage(),窗口过程,ret,系统消息队列 所有消息,各种用户操作,其它应用程序消息队列,传递消息,回调窗口过程,返回,15.5.2 窗口程序示例在Windows操作系统下创建并显示一个窗口程序的编程步骤为:,(1)调用GetModuleHandle函数获得应用程序的句柄。,(2)可以根据需要从命令行得到参数。,(3)如果不是使用Windows 预定义的窗口类,如 MessageBox 或 dialog box ,必须先填写用户自定义窗口注册类的结构(WNDCLASSEX的)变量参数,再调用RegisterClassEx函数注册窗口类。,(4)调用ShowWindow函数显示窗口。,(5)调用UpdateWindows函数刷新窗口客户区。,(6)进入消息循环。,(7)如果有消息到达,则由该窗口的窗口回调函数,即用户写的窗口过程,对消息进行处理。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报