南京邮电大学微机课件第14章_第1页
南京邮电大学微机课件第14章_第2页
南京邮电大学微机课件第14章_第3页
南京邮电大学微机课件第14章_第4页
南京邮电大学微机课件第14章_第5页
已阅读5页,还剩28页未读, 继续免费阅读

下载本文档

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

文档简介

1、第第1414章章 Windows Windows 汇编语言编程初步汇编语言编程初步 14.1 Windows14.1 Windows基础基础 14.2 Win3214.2 Win32汇编源程序的格式汇编源程序的格式14.3 Win3214.3 Win32汇编可执行文件的生成汇编可执行文件的生成14.4 Win3214.4 Win32汇编基本语法汇编基本语法14.5 14.5 创建创建WindowsWindows下的窗口程序下的窗口程序14.1 Windows14.1 Windows基础基础 1. Windows1. Windows的内存管的内存管理理WindowsWindows操作系统为操作系

2、统为每一个应用程序建立每一个应用程序建立一个一个4GB4GB的的线性空间。线性空间。线性空间中只包含该线性空间中只包含该应用程序的数据段和应用程序的数据段和代码段代码段,操作系统使,操作系统使用的代码和数据(如用的代码和数据(如全局描述符表全局描述符表GDTGDT,局部描述符表局部描述符表LDTLDT与与页表等)以及一些共页表等)以及一些共享代码和数据等。享代码和数据等。2 2Win32Win32汇编的内存寻址汇编的内存寻址与实模式的汇编相比,与实模式的汇编相比,Win32汇编对内存数据的访问更加方便。汇编对内存数据的访问更加方便。(2)Windows操作系统不仅已经预先为要运行的用户应用程操

3、作系统不仅已经预先为要运行的用户应用程序的代码段、数据段和堆栈段设置好描述符,规定这些段的序的代码段、数据段和堆栈段设置好描述符,规定这些段的的段基址都为的段基址都为0,段界限都为,段界限都为FFFFFFFFH。而且程序开始执。而且程序开始执行时,行时,CS,DS,ES,SS里存放的选择子已经指向正确的描里存放的选择子已经指向正确的描述符,述符,程序员不需要给这些段寄存器赋值。在整个程序运行程序员不需要给这些段寄存器赋值。在整个程序运行期间,程序员也不应该修改这些段寄存器的值。期间,程序员也不应该修改这些段寄存器的值。(1)在在Windows系统中,每个应用程序的整个系统中,每个应用程序的整个

4、4GB线性地线性地址空间都作为一个段。址空间都作为一个段。代码段和数据段代码段和数据段/堆栈段的空间统一的,堆栈段的空间统一的,都是都是00000000HFFFFFFFFH。在这个。在这个4GB的地址空间中,的地址空间中,一部分用来存放程序,一部分作为数据区,一部分作为堆栈,一部分用来存放程序,一部分作为数据区,一部分作为堆栈,另外还有一部分被系统使用。这些部分的地址区域是不重合另外还有一部分被系统使用。这些部分的地址区域是不重合的。的。3 3WindowsWindows下的中断和异常下的中断和异常(1)为了系统的安全,运行在特权级)为了系统的安全,运行在特权级3的应用程序是不能的应用程序是不

5、能像工作在实模式下一样,自己来编写中断服务子程序,也像工作在实模式下一样,自己来编写中断服务子程序,也不能通过修改中断描述符表来调用系统提供的中断服务子不能通过修改中断描述符表来调用系统提供的中断服务子程序。程序。(2)在)在Windows操作系统中,使用操作系统中,使用Windows提供的应用程序提供的应用程序编程接口编程接口(API)来代替中断服务子程序提供的系统功能来代替中断服务子程序提供的系统功能4 4WindowsWindows系统下的系统下的I/OI/O保护保护应用程序执行时,对端口是不能直接进行访问的,也不能应用程序执行时,对端口是不能直接进行访问的,也不能使用使用STI,CLI

6、中断允许和禁止指令。中断允许和禁止指令。14.2 Win3214.2 Win32汇编源程序的格式汇编源程序的格式14.2.1 源程序结构源程序结构.586.586 .MODEL FLAT, STDCALL .MODEL FLAT, STDCALL .OPTION CASEMAP:NONE.OPTION CASEMAP:NONE .DATA .DATA .DATA? .DATA? .CONST .CONST .CODE .CODE . . END END 1.1.方式选择伪指令方式选择伪指令.586.586是一个汇编语言伪指令,含义和是一个汇编语言伪指令,含义和DOSDOS汇编相同汇编相同. .

7、2内存模式选择伪指令内存模式选择伪指令.MODEL 是用来指定内存模式的伪指令。是用来指定内存模式的伪指令。.MODEL FLAT 汇编程序自动为各种段寄存器做如下段约定:汇编程序自动为各种段寄存器做如下段约定:ASSUME CS:FLAT,DS:FLAT,SS:FLAT,ES:FLATSTDCALL告诉汇编程序参数的传递约定。告诉汇编程序参数的传递约定。Win32汇编语言采用汇编语言采用STDCALL格式。格式。STDCALL格式参格式参数传递顺序是从右到左,即最右边的参数最先压栈,由数传递顺序是从右到左,即最右边的参数最先压栈,由被调用者(子程序)恢复堆栈指针。被调用者(子程序)恢复堆栈指

8、针。 3.OPTION3.OPTION语句语句OPTION CASEMAP:TYPEOPTION CASEMAP:TYPE说明程序中的变量和子程序名是否对大小写敏感,即区分说明程序中的变量和子程序名是否对大小写敏感,即区分大小写。由于大小写。由于Windows APIWindows API函数是区分大小写,选项应设置为函数是区分大小写,选项应设置为“OPTION CASEMAP:NONEOPTION CASEMAP:NONE”。4 4段定义伪指令段定义伪指令WIN32WIN32中只包含代码段和数据段:中只包含代码段和数据段:DATADATA和和CODECODE其中数据段又分为三种其中数据段又分

9、为三种.DATA .DATA? .CONST.DATA .DATA? .CONST.DATA .DATA 定义已初始化的变量。这些变量的值在程序的执行中定义已初始化的变量。这些变量的值在程序的执行中可以被更改。可以被更改。.DATA? .DATA? 定义未初始化的变量。定义未初始化的变量。.CONST.CONST定义常量,这些常量在程序运行过程中是不能更改的定义常量,这些常量在程序运行过程中是不能更改的.CODE .CODE 定义代码段。定义代码段。 格式:格式:ENDEND标号标号 功能:通知汇编程序,源程序到此结束,标号所对应的指令功能:通知汇编程序,源程序到此结束,标号所对应的指令是程序

10、的启动指令。是程序的启动指令。5汇编结束语句汇编结束语句Win32Win32汇编语言经典源程序例子汇编语言经典源程序例子 .586 .586 .MODEL FLAT,STDCALL .MODEL FLAT,STDCALL OPTION CASEMAP:NONE OPTION CASEMAP:NONE INCLUDE WINDOWS.INC INCLUDE WINDOWS.INC INCLUDE KERNEL32.INC INCLUDE KERNEL32.INC INCLUDELIB KERNEL32.LIB INCLUDELIB KERNEL32.LIB INCLUDE USER32.INC

11、INCLUDE USER32.INC INCLUDELIB USER32.LIB INCLUDELIB USER32.LIB .DATA .DATA MsgBoxCaption DB Example of win32,0 ;MsgBoxCaption DB Example of win32,0 ;消息框标题显示字符串消息框标题显示字符串MsgBoxText DB HelloMsgBoxText DB Hello,你好!,你好!,0 ;,0 ;消息框内显示字符串消息框内显示字符串.CODE .CODE START: START: INVOKE MessageBox, NULL, addr Msg

12、BoxText, addr MsgBoxCaption, INVOKE MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK MB_OK INVOKE ExitProcess, NULL INVOKE ExitProcess, NULL END START END START 14.3 Win3214.3 Win32汇编可执行文件的生成汇编可执行文件的生成汇编源程序汇编源程序* *.asm.asm资源脚本文件资源脚本文件* *.rc.rc汇编程序汇编程序资源编译程序资源编译程序目标程序目标程序* *.obj.obj资源文件资源

13、文件* *.res.res链接链接程序程序Win32Win32可执行文件可执行文件* *.exe.exeWin32Win32汇编软件的开发可分源程序开发和资源开发两部分汇编软件的开发可分源程序开发和资源开发两部分汇编链接步骤汇编链接步骤( (以教材例以教材例15.115.1为例为例) )(1) 汇编源程序汇编源程序hello.asm ml /c /coff hello.asm(2)链接目标程序)链接目标程序hello.obj link /subsystem:windows hello.obj(3)运行可执行程序)运行可执行程序 hello.exe hello.exe注意:如果该程序有资源文件注

14、意:如果该程序有资源文件hello.res,则应该用,则应该用link将将hello.obj和和hello.res链接成链接成hello.exe。15.4 Win3215.4 Win32汇编基本语法汇编基本语法15.4.1 15.4.1 标号和变量标号和变量 Win32Win32汇编使用的高版本汇编中,汇编使用的高版本汇编中,标号的作用域是当前的子程标号的作用域是当前的子程序。序。在同一个子程序中的标号不能同名,但在不同的子程序中在同一个子程序中的标号不能同名,但在不同的子程序中可以有相同名称的标号。可以有相同名称的标号。1.标号标号Win32Win32汇编中变量的类型很多,根据变量的作用域可

15、分汇编中变量的类型很多,根据变量的作用域可分为全局变量和局部变量。为全局变量和局部变量。(1 1)全局变量)全局变量用数据定义伪指令在用数据定义伪指令在.DATA.DATA或或.DATA?.DATA?段定义全局变量。段定义全局变量。全局变量的作用域是整个程序。全局变量的作用域是整个程序。2变量变量(2 2)局部变量)局部变量例:例:LOCAL VAR1:WORD LOCAL VAR1:WORD LOCAL VAR2 LOCAL VAR2 LOCAL VAR310:BYTE LOCAL VAR310:BYTE注意:注意:LOCALLOCAL伪指令必须紧跟在子程序定伪指令伪指令必须紧跟在子程序定伪

16、指令PROCPROC之后,之后,其它指令之前。局部变量不能和全局变量同名。其它指令之前。局部变量不能和全局变量同名。局部变量的作用域是当前的子程序。局部变量的作用域是当前的子程序。定义格式:定义格式: LOCAL 变量变量1重复数量重复数量1:类型:类型, 变量变量2重复数量重复数量2:类型:类型 3. 3. 获取变量地址获取变量地址获取全局变量地址使用获取全局变量地址使用OFFSETOFFSET运算符。运算符。例:例:MOVMOVBX,OFFSET BX,OFFSET 变量名变量名注意:注意:ADDRADDR伪操作符只能在伪操作符只能在INVOKEINVOKE的参数中使用。的参数中使用。对于

17、局部变量,对于局部变量,MASM对此有一个专用的伪操作符对此有一个专用的伪操作符ADDR。格式:格式:ADDR局部变量名和全局变量名局部变量名和全局变量名例:例:INVOKE MessageBox, NULL, ADDR MsgBoxText, ADDR MsgBoxCaption, MB_OK 14.4.2 14.4.2 结构结构1 1结构的定义结构的定义格式:结构名格式:结构名 STRUCTSTRUCT 字段字段1 1 类型类型? ? 字段字段2 2 类型类型? ? 结构名结构名 ENDSENDS例:定义一个名为例:定义一个名为STUDENT的结构,该结构有的结构,该结构有3个字段。个字段

18、。 STUDENT STRUCT NUM BYTE ? SEX BYTE ? RECORD WORD ? STUDENT ENDS2 2结构变量的定义结构变量的定义结构变量的定义格式如下:结构变量的定义格式如下:变量名变量名 结构名结构名 格式一格式一或或 变量名变量名 结构名结构名 VAR1,VAR2, 格式二格式二例:定义结构变量例:定义结构变量STU1 STUDENT STU2 STUDENT 3 3结构变量的访问结构变量的访问在汇编中,结构变量的访问的两种较简单的方法:在汇编中,结构变量的访问的两种较简单的方法:(1)MOV AX,STU2.RECORD 表示把表示把RECORD字段的

19、值放入字段的值放入AX中去。中去。(2)MOV ESI,OFFSET STU2 使用指针存取数据结构使用指针存取数据结构14.4.3 14.4.3 子程序子程序格式:格式:子程序名子程序名 PROC PROC 语言类型语言类型可视区域可视区域USES USES 寄存器列表寄存器列表 , ,参数参数: :类型类型.VARARG.VARARG LOCAL LOCAL 局部变量列表局部变量列表 RET RET子程序名子程序名ENDPENDP(1)语言类型语言类型表示参数的使用方式和堆栈平衡的方式,表示参数的使用方式和堆栈平衡的方式,Win32约定的类型是约定的类型是STDCALL。参数传递顺序是从右

20、到左,由子程序恢复堆栈指针。参数传递顺序是从右到左,由子程序恢复堆栈指针。 (2)(2)可视区域可视区域PRIVATEPRIVATE表示子程序只对本模块可见;表示子程序只对本模块可见;PUBLICPUBLIC表示对所有的模块可见;表示对所有的模块可见;EXPORTEXPORT表示是导出的函数。默认的设置是表示是导出的函数。默认的设置是PUBLICPUBLIC。(3)USES(3)USES寄存器列表寄存器列表表示表示CPUCPU在进入子程序后自动执行在进入子程序后自动执行PUSHPUSH这些寄存器的指令,这些寄存器的指令,在在RETRET子程序返回前自动执行子程序返回前自动执行POPPOP指令,

21、用于保护现场。指令,用于保护现场。 (4)(4)参数和类型参数和类型参数指参数的名称,在定义参数名的时候不能跟全局变量参数指参数的名称,在定义参数名的时候不能跟全局变量和子程序中的局部变量重名。对于类型,由于和子程序中的局部变量重名。对于类型,由于Win32Win32中的参中的参数类型只有数类型只有3232位(位(DWORDDWORD)一种类型,所以可以省略。)一种类型,所以可以省略。(5)VARARG(5)VARARG表示在已确定的参数后还可以跟多个数量不确定的参数。表示在已确定的参数后还可以跟多个数量不确定的参数。完成了子程序定义之后,可以用完成了子程序定义之后,可以用CALL指令或更方便

22、的指令或更方便的INVOKE伪指令来调用子程序。伪指令来调用子程序。例 : 利 用 子 程 序 完 成 三 数 相 加例 : 利 用 子 程 序 完 成 三 数 相 加 N 1 + N 2 + N 3N 1 + N 2 + N 3 , 假 设, 假 设N1=1122H,N2=3344H,N3=5566HN1=1122H,N2=3344H,N3=5566H.586 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE INCLUDE KERNEL32.INC INCLUDELIB KERNEL32.LIB INCLUDE WINDOWS.INC COMPUTE PROT

23、O PARA1:DWORD ;计算子程序声明计算子程序声明.DATA N1 DW 1122H N2 DW 3344HN3 DW 5566H.DATA?SUM DW ? ;计算结果计算结果 .CODE .CODE START: START: ; ;调用计算子程序,将数据存放的起始地址作为传递的参数调用计算子程序,将数据存放的起始地址作为传递的参数 INVOKE COMPUTE,ADDR N1 INVOKE COMPUTE,ADDR N1 MOV SUM,AX ; MOV SUM,AX ;保存计算结果保存计算结果 INVOKE ExitProcess, NULL ;INVOKE ExitProce

24、ss, NULL ;结束执行程序结束执行程序 COMPUTE PROC USES EAX EBX,PARA1:DWORD COMPUTE PROC USES EAX EBX,PARA1:DWORD MOV EBX,PARA1 MOV EBX,PARA1 MOV EAX,0 ; MOV EAX,0 ;求和寄存器清求和寄存器清0 0 MOV AX,WORD PTR EBX ;AX=N1 MOV AX,WORD PTR EBX ;AX=N1 ADD AX, WORD PTR EBX+2 ;AX=N1+N2 ADD AX, WORD PTR EBX+2 ;AX=N1+N2 ADD AX, WORD P

25、TR EBX+4 ;AX=N1+N2+N3 ADD AX, WORD PTR EBX+4 ;AX=N1+N2+N3 RET RET COMPUTE ENDP COMPUTE ENDP END START END START14.4.4 14.4.4 高级语法高级语法 Win32Win32的高版本的高版本MASMMASM中新引入了一系列的伪指令,涉及条件中新引入了一系列的伪指令,涉及条件测试、分支和循环语句。利用它们,汇编语言有了和高级语言测试、分支和循环语句。利用它们,汇编语言有了和高级语言一样的结构,配合局部变量和调用参数,为使用一样的结构,配合局部变量和调用参数,为使用Win32Win32

26、汇编编写汇编编写大规模的大规模的WindowsWindows应用程序奠定了基础。应用程序奠定了基础。1 1条件测试表达式条件测试表达式在所有的分支和循环语句首先要进行条件测试。在所有的分支和循环语句首先要进行条件测试。条件测试表达式:条件测试表达式: 寄存器或变量寄存器或变量操作符操作符 操作数操作数 两个以上的表达式可以用逻辑运算符连接两个以上的表达式可以用逻辑运算符连接 CPUCPU标志寄存器一些标志位的状态,相当于一个表达式。标志寄存器一些标志位的状态,相当于一个表达式。 允许的操作符、逻辑运算符和允许的操作符、逻辑运算符和标志位状态见教材标志位状态见教材表表15.415.4。例:例:X

27、=10 X=10 ;X X等于等于1010为真为真EAX!=0 EAX!=0 ;EAXEAX不等于不等于0 0为真为真SBYTE PTR AL=8 SBYTE PTR AL=8 ;ALAL大于等于大于等于8 8时为真,时为真,ALAL为有符号数为有符号数(X=100)&ECX(X=100)&ECX ;X X大于等于大于等于100100且且ECXECX为非零时为真为非零时为真(EAX= =EBX) & ZERO? (EAX= =EBX) & ZERO? ;EAXEAX等于等于EBXEBX且且Z Z标志标志=1=1为真为真分支语句的语法如下:分支语句的语法如下:.I

28、F条件表达式条件表达式1 表达式表达式1为为“真真”时执行的指令时执行的指令.ELSEIF 条件表达式条件表达式2 表达式表达式2为为“真真”时执行的指令时执行的指令.ELSEIF 条件表达式条件表达式3 表达式表达式3为为“真真”时执行的指令时执行的指令.ELSE 所有表达式为所有表达式为“否否”时执行的指令时执行的指令.ENDIF2 2分支语句分支语句注意:关键字注意:关键字IF/ELSEIF/ELSE/ENDIF的前面有个小数点。的前面有个小数点。例:设例:设NUMBERNUMBER单元的数单元的数X X以及数值以及数值N1,N2N1,N2均为单字节无符号数,均为单字节无符号数,请判断请

29、判断X X的大小,并根据判断结果分别显示:的大小,并根据判断结果分别显示:N1=X=N2,N1=X=N2,或或XN1,XN2XN2【例例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 22N2 DB 88MESG1 DB N1=X=N2,0MESG2 DB XN2,0MESG3 DB XN2,0MsgBox

30、Caption DB EXAMPLE OF WIN32,0 MsgBoxCaption DB EXAMPLE OF WIN32,0 .DATA?.DATA?NUMBER DB ?NUMBER DB ?.CODE .CODE START: START: MOV AL,NUMBER MOV AL,NUMBER .IF(AL=N1 & AL=N2) ;N1=X=N1 & AL=N2) ;N1=X=N2 MOV EBX,OFFSET MESG1 MOV EBX,OFFSET MESG1 .ELSEIF(ALN1) ;XN1 .ELSEIF(ALN1) ;XN2 .ELSE ;XN2 M

31、OV EBX,OFFSET MESG3 MOV EBX,OFFSET MESG3 .ENDIF .ENDIF INVOKE MessageBox, NULL, EBX, ADDR MsgBoxCaption, MB_OK INVOKE MessageBox, NULL, EBX, ADDR MsgBoxCaption, MB_OK INVOKE ExitProcess, NULL INVOKE ExitProcess, NULL END STARTEND START 3 3循环语句循环语句(1)循环结构语法一)循环结构语法一 .WHILE条件测试表达式条件测试表达式 指令指令 .BREAK .

32、IF 退出条件退出条件 .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

33、.INC INCLUDELIB KERNEL32.LIB INCLUDE USER32.INC INCLUDELIB USER32.LIB .DATA BUF DB QWERYTUIOP123COUNT EQU $-BUFMAX DB Max=,?,0MsgBoxCaption DB Example of win32,0 .CODE .CODE STARTSTART: : MOV ECX,0 MOV ECX,0 MOV EBX,OFFSET BUF ; MOV EBX,OFFSET BUF ;字符串首址偏移字符串首址偏移-EBX-EBX MOV AL,0 ; MOV AL,0 ;最小数最小数-AL-AL .WHILE ECXCOUNT ; .WHI

温馨提示

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

评论

0/150

提交评论