汇编语言编程初步

上传人:j****9 文档编号:54350508 上传时间:2018-09-11 格式:PPT 页数:33 大小:251KB
返回 下载 相关 举报
汇编语言编程初步_第1页
第1页 / 共33页
汇编语言编程初步_第2页
第2页 / 共33页
汇编语言编程初步_第3页
第3页 / 共33页
汇编语言编程初步_第4页
第4页 / 共33页
汇编语言编程初步_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《汇编语言编程初步》由会员分享,可在线阅读,更多相关《汇编语言编程初步(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:NO

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

6、C INCLUDE KERNEL32.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

7、Win32汇编可执行文件的生成,汇编源程序,*.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.exehello.exe,注意:如果该程序有资源文件hello.res,则应该用link将

8、hello.obj和hello.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伪指令必须紧跟在

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

10、定义 格式:结构名 STRUCT字段1 类型 ?字段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,O

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

12、执行POP指令,用于保护现场。 (4)参数和类型 参数指参数的名称,在定义参数名的时候不能跟全局变量和子程序中的局部变量重名。对于类型,由于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

13、INCLUDELIB KERNEL32.LIB INCLUDE WINDOWS.INC COMPUTE PROTO PARA1:DWORD ;计算子程序声明 .DATA N1 DW 1122H N2 DW 3344H N3 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

14、,PARA1 MOV EAX,0 ;求和寄存器清0MOV AX,WORD PTR EBX ;AX=N1ADD AX, WORD PTR EBX+2 ;AX=N1+N2ADD AX, WORD PTR EBX+4 ;AX=N1+N2+N3 RETCOMPUTE ENDPEND 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为“真”时执行的指令 .EL

16、SEIF 条件表达式3表达式3为“真”时执行的指令 .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 22 N2 DB 88 MESG1 DB N1=X=N2,0 MESG2 DB XN1,0,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号