《汇编语言编程初步.ppt》由会员分享,可在线阅读,更多相关《汇编语言编程初步.ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第1515章章 Windows Windows 汇编语言编程初步汇编语言编程初步 15.1 Windows15.1 Windows基础基础 15.2 15.2 Win32Win32汇编源程序的格式汇编源程序的格式15.3 Win3215.3 Win32汇编可执行文件的生成汇编可执行文件的生成15.4 Win3215.4 Win32汇编基本语法汇编基本语法15.5 15.5 创建创建WindowsWindows下的窗口程序下的窗口程序15.1 Windows15.1 Windows基础基础 1.Windows1.Windows的内存管理的内存管理WindowsWindows操作系统为操作系统为
2、每一个应用程序建立每一个应用程序建立一个一个4GB4GB的的线性空间。线性空间。线性空间中只包含该线性空间中只包含该应用程序的数据段和应用程序的数据段和代码段代码段,操作系统使,操作系统使用的代码和数据(如用的代码和数据(如全局描述符表全局描述符表GDTGDT,局部描述符表局部描述符表LDTLDT与与页表等)以及一些共页表等)以及一些共享代码和数据等。享代码和数据等。2 2Win32Win32汇编的内存寻址汇编的内存寻址与实模式的汇编相比,与实模式的汇编相比,Win32汇编对内存数据的访问更加方便。汇编对内存数据的访问更加方便。(2)Windows操作系统不仅已经预先为要运行的用户应用程操作系
3、统不仅已经预先为要运行的用户应用程序的代码段、数据段和堆栈段设置好描述符,规定这些段的序的代码段、数据段和堆栈段设置好描述符,规定这些段的的段基址都为的段基址都为0,段界限都为,段界限都为FFFFFFFFH。而且程序开始执。而且程序开始执行时,行时,CS,DS,ES,SS里存放的选择子已经指向正确的描述里存放的选择子已经指向正确的描述符,符,程序员不需要给这些段寄存器赋值。在整个程序运行期程序员不需要给这些段寄存器赋值。在整个程序运行期间,程序员也不应该修改这些段寄存器的值。间,程序员也不应该修改这些段寄存器的值。(1)在在Windows系统中,每个应用程序的整个系统中,每个应用程序的整个4G
4、B线性地址线性地址空间都作为一个段。空间都作为一个段。代码段和数据段代码段和数据段/堆栈段的空间统一的,堆栈段的空间统一的,都是都是00000000HFFFFFFFFH。在这个。在这个4GB的地址空间中,的地址空间中,一部分用来存放程序,一部分作为数据区,一部分作为堆栈,一部分用来存放程序,一部分作为数据区,一部分作为堆栈,另外还有一部分被系统使用。这些部分的地址区域是不重合另外还有一部分被系统使用。这些部分的地址区域是不重合的。的。3 3WindowsWindows下的中断和异常下的中断和异常(1)为了系统的安全,运行在特权级)为了系统的安全,运行在特权级3的应用程序是不能像的应用程序是不能
5、像工作在实模式下一样,自己来编写中断服务子程序,也不能工作在实模式下一样,自己来编写中断服务子程序,也不能通过修改中断描述符表来调用系统提供的中断服务子程序。通过修改中断描述符表来调用系统提供的中断服务子程序。(2)在)在Windows操作系统中,使用操作系统中,使用Windows提供的应用程序提供的应用程序编程接口编程接口(API)来代替中断服务子程序提供的系统功能来代替中断服务子程序提供的系统功能4 4WindowsWindows系统下的系统下的I/OI/O保护保护应用程序执行时,对端口是不能直接进行访问的,也不能使应用程序执行时,对端口是不能直接进行访问的,也不能使用用STI,CLI中断
6、允许和禁止指令。中断允许和禁止指令。15.2 15.2 Win32Win32汇编源程序的格式汇编源程序的格式15.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汇编相同汇编相同.2内存模式选择伪指令内存模
7、式选择伪指令.MODEL是用来指定内存模式的伪指令。是用来指定内存模式的伪指令。.MODELFLAT汇编程序自动为各种段寄存器做如下段约定:汇编程序自动为各种段寄存器做如下段约定:ASSUMECS:FLAT,DS:FLAT,SS:FLAT,ES:FLATSTDCALL告诉汇编程序参数的传递约定。告诉汇编程序参数的传递约定。Win32汇编语言采用汇编语言采用STDCALL格式。格式。STDCALL格式参格式参数传递顺序是从右到左,即最右边的参数最先压栈,由数传递顺序是从右到左,即最右边的参数最先压栈,由被调用者(子程序)恢复堆栈指针。被调用者(子程序)恢复堆栈指针。3.OPTION3.OPTIO
8、N语句语句OPTION CASEMAP:TYPEOPTION CASEMAP:TYPE说说明明程程序序中中的的变变量量和和子子程程序序名名是是否否对对大大小小写写敏敏感感,即即区区分分大大小小写写。由由于于Windows Windows APIAPI函函数数是是区区分分大大小小写写,选选项项应应设设置置为为“OPTION CASEMAP:NONE”OPTION CASEMAP:NONE”。4 4段定义伪指令段定义伪指令WIN32WIN32中只包含代码段和数据段:中只包含代码段和数据段:DATADATA和和CODECODE其中数据段又分为三种其中数据段又分为三种.DATA.DATA?.CONST
9、.DATA.DATA?.CONST.DATA.DATA 定定义义已已初初始始化化的的变变量量。这这些些变变量量的的值值在在程程序序的的执执行行中中可以被更改。可以被更改。.DATA?.DATA?定义未初始化的变量。定义未初始化的变量。.CONST.CONST定义常量,这些常量在程序运行过程中是不能更改的定义常量,这些常量在程序运行过程中是不能更改的.CODE.CODE 定义代码段。定义代码段。格式:格式:ENDEND标号标号 功能:通知汇编程序,源程序到此结束,标号所对应的指令功能:通知汇编程序,源程序到此结束,标号所对应的指令是程序的启动指令。是程序的启动指令。5汇编结束语句汇编结束语句Wi
10、n32Win32汇编语言经典源程序例子汇编语言经典源程序例子 .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 INCLUDE USER32.INC INCLUDELIB USE
11、R32.LIB INCLUDELIB USER32.LIB.DATA.DATA MsgBoxCaptionMsgBoxCaption DB Example of win32,0 ;DB Example of win32,0 ;消息框标题显示字符串消息框标题显示字符串MsgBoxTextMsgBoxText DB Hello DB Hello,你好!你好!,0 ;,0 ;消息框内显示字符串消息框内显示字符串.CODE.CODE START:START:INVOKE INVOKE MessageBoxMessageBox,NULL,NULL,addraddr MsgBoxTextMsgBoxTex
12、t,addraddr MsgBoxCaptionMsgBoxCaption,MB_OK MB_OK INVOKE INVOKE ExitProcessExitProcess,NULL,NULL END START END START 15.3 Win3215.3 Win32汇编可执行文件的生成汇编可执行文件的生成汇编源程序汇编源程序*.asmasm资源脚本文件资源脚本文件*.rcrc汇编程序汇编程序资源编译程序资源编译程序目标程序目标程序*.objobj资源文件资源文件*.resres链接链接程序程序Win32Win32可执行文件可执行文件*.exe.exeWin32Win32汇编软件的开发可
13、分源程序开发和资源开发两部分汇编软件的开发可分源程序开发和资源开发两部分汇编链接步骤汇编链接步骤(以教材例以教材例15.115.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。15.4 Win321
14、5.4 Win32汇编基本语法汇编基本语法15.4.1 15.4.1 标号和变量标号和变量 Win32Win32汇汇编编使使用用的的高高版版本本汇汇编编中中,标标号号的的作作用用域域是是当当前前的的子子程程序序。在在同同一一个个子子程程序序中中的的标标号号不不能能同同名名,但但在在不不同同的的子子程程序序中中可以有相同名称的标号。可以有相同名称的标号。1.标号标号Win32Win32汇汇编编中中变变量量的的类类型型很很多多,根根据据变变量量的的作作用用域域可可分分为为全局变量和局部变量。全局变量和局部变量。(1 1)全局变量)全局变量用用数数据据定定义义伪伪指指令令在在.DATA.DATA或或
15、.DATA?.DATA?段段定定义义全全局局变变量量。全局变量的作用域是整个程序。全局变量的作用域是整个程序。2变量变量(2 2)局部变量)局部变量例:例:LOCAL VAR1:WORD LOCAL VAR1:WORD LOCAL VAR2 LOCAL VAR2 LOCAL VAR310:BYTE LOCAL VAR310:BYTE注注意意:LOCALLOCAL伪伪指指令令必必须须紧紧跟跟在在子子程程序序定定伪伪指指令令PROCPROC之之后后,其它指令之前。局部变量不能和全局变量同名。其它指令之前。局部变量不能和全局变量同名。局部变量的作用域是当前的子程序。局部变量的作用域是当前的子程序。定
16、义格式:定义格式:LOCAL变量变量1重复数量重复数量1:类型:类型,变量变量2重复数量重复数量2:类型:类型 3.3.获取变量地址获取变量地址获取全局变量地址使用获取全局变量地址使用OFFSETOFFSET运算符。运算符。例:例:MOVMOVBX,OFFSET BX,OFFSET 变量名变量名注意:注意:ADDRADDR伪操作符只能在伪操作符只能在INVOKEINVOKE的参数中使用。的参数中使用。对于局部变量,对于局部变量,MASM对此有一个专用的伪操作符对此有一个专用的伪操作符ADDR。格式:格式:ADDR局部变量名和全局变量名局部变量名和全局变量名例:例:INVOKEMessageBo
17、x,NULL,ADDRMsgBoxText,ADDRMsgBoxCaption,MB_OK15.4.2 15.4.2 结构结构1 1结构的定义结构的定义格式:结构名格式:结构名 STRUCTSTRUCT 字段字段1 1 类型类型?字段字段2 2 类型类型?结构名结构名 ENDSENDS例:定义一个名为例:定义一个名为STUDENT的结构,该结构有的结构,该结构有3个字段。个字段。STUDENTSTRUCTNUMBYTE?SEXBYTE?RECORDWORD?STUDENTENDS2 2结构变量的定义结构变量的定义结构变量的定义格式如下:结构变量的定义格式如下:变量名变量名 结构名结构名 格式一
18、格式一或或 变量名变量名 结构名结构名 格式二格式二例:定义结构变量例:定义结构变量STU1STUDENTSTU2STUDENT 3 3结构变量的访问结构变量的访问在汇编中,结构变量的访问的两种较简单的方法:在汇编中,结构变量的访问的两种较简单的方法:(1)MOVAX,STU2.RECORD表示把表示把RECORD字段的值放入字段的值放入AX中去。中去。(2)MOVESI,OFFSETSTU2使用指针存取数据结构使用指针存取数据结构15.4.3 15.4.3 子程序子程序格式:格式:子程序名子程序名 PROC PROC 语言类型语言类型可视区域可视区域USES USES 寄存器列表寄存器列表
19、,参数参数:类型类型.VARARG.VARARG LOCAL LOCAL 局部变量列表局部变量列表 RET RET子程序名子程序名ENDPENDP(1)语言类型语言类型表表示示参参数数的的使使用用方方式式和和堆堆栈栈平平衡衡的的方方式式,Win32约约定定的的类类型型是是STDCALL。参数传递顺序是从右到左,由子程序恢复堆栈指针。参数传递顺序是从右到左,由子程序恢复堆栈指针。(2)(2)可视区域可视区域PRIVATEPRIVATE表表示示子子程程序序只只对对本本模模块块可可见见;PUBLICPUBLIC表表示示对对所所有有的的模模块块可可见见;EXPORTEXPORT表示是导出的函数。默认的
20、设置是表示是导出的函数。默认的设置是PUBLICPUBLIC。(3)USES(3)USES寄存器列表寄存器列表表表示示CPUCPU在在进进入入子子程程序序后后自自动动执执行行PUSHPUSH这这些些寄寄存存器器的的指指令令,在在RETRET子程序返回前自动执行子程序返回前自动执行POPPOP指令,用于保护现场。指令,用于保护现场。(4)(4)参数和类型参数和类型参参数数指指参参数数的的名名称称,在在定定义义参参数数名名的的时时候候不不能能跟跟全全局局变变量量和和子子程程序序中中的的局局部部变变量量重重名名。对对于于类类型型,由由于于Win32Win32中中的的参参数数类型只有类型只有3232位
21、(位(DWORDDWORD)一种类型,所以可以省略。一种类型,所以可以省略。(5)VARARG(5)VARARG表示在已确定的参数后还可以跟多个数量不确定的参数。表示在已确定的参数后还可以跟多个数量不确定的参数。完完成成了了子子程程序序定定义义之之后后,可可以以用用CALL指指令令或或更更方方便便的的INVOKE伪指令来调用子程序。伪指令来调用子程序。例例:利利 用用 子子 程程 序序 完完 成成 三三 数数 相相 加加 N1+N2+N3N1+N2+N3,假假 设设N1=1122H,N2=3344H,N3=5566HN1=1122H,N2=3344H,N3=5566H.586.MODELFLA
22、T,STDCALLOPTIONCASEMAP:NONEINCLUDEKERNEL32.INCINCLUDELIBKERNEL32.LIBINCLUDEWINDOWS.INCCOMPUTEPROTOPARA1:DWORD;计算子程序声明计算子程序声明.DATAN1DW1122HN2DW3344HN3DW5566H.DATA?SUMDW?;计算结果计算结果 .CODE.CODE START:START:;调用计算子程序,将数据存放的起始地址作为传递的参数调用计算子程序,将数据存放的起始地址作为传递的参数 INVOKE COMPUTE,ADDR N1 INVOKE COMPUTE,ADDR N1 M
23、OV SUM,AX ;MOV SUM,AX ;保存计算结果保存计算结果 INVOKE INVOKE ExitProcessExitProcess,NULL ;,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 A
24、X,WORD PTR EBX+2 ;AX=N1+N2 ADD AX,WORD PTR EBX+2 ;AX=N1+N2 ADD AX,WORD PTR 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 START15.4.4 15.4.4 高级语法高级语法 Win32Win32的的高高版版本本MASMMASM中中新新引引入入了了一一系系列列的的伪伪指指令令,涉涉及及条条件件测测试试、分分支支和和循循环环语语句句。利利用用它它们们,汇汇编编语语言
25、言有有了了和和高高级级语语言言一一样样的的结结构构,配配合合局局部部变变量量和和调调用用参参数数,为为使使用用Win32Win32汇汇编编编编写写大规模的大规模的WindowsWindows应用程序奠定了基础。应用程序奠定了基础。1 1条件测试表达式条件测试表达式在所有的分支和循环语句首先要进行条件测试。在所有的分支和循环语句首先要进行条件测试。条件测试条件测试表达式表达式:寄存器或变量寄存器或变量操作符操作符 操作数操作数 两个以上的表达式可以用逻辑运算符连接两个以上的表达式可以用逻辑运算符连接 CPUCPU标志寄存器一些标志位的状态,相当于一个表达式。标志寄存器一些标志位的状态,相当于一个
26、表达式。允许的操作符、逻辑运算符和允许的操作符、逻辑运算符和标志位状态见教材标志位状态见教材表表15.415.4。例:例:X=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
27、Z标志标志=1=1为真为真分支语句的语法如下:分支语句的语法如下:.IF条件表达式条件表达式1表达式表达式1为为“真真”时执行的指令时执行的指令.ELSEIF条件表达式条件表达式2表达式表达式2为为“真真”时执行的指令时执行的指令.ELSEIF条件表达式条件表达式3表达式表达式3为为“真真”时执行的指令时执行的指令.ELSE所有表达式为所有表达式为“否否”时执行的指令时执行的指令.ENDIF2 2分支语句分支语句注意:关键字注意:关键字IF/ELSEIF/ELSE/ENDIF的前面有个小数点。的前面有个小数点。例例:设设NUMBERNUMBER单单元元的的数数X X以以及及数数值值N1,N2N
28、1,N2均均为为单单字字节节无无符符号号数数,请请判判断断X X的的大大小小,并并根根据据判判断断结结果果分分别别显显示示:N1=X=N2,N1=X=N2,或或XN1,XN2XN2【例例15.4.2】.586.MODELFLAT,STDCALLOPTIONCASEMAP:NONEINCLUDEKERNEL32.INCINCLUDEWINDOWS.INCINCLUDELIBKERNEL32.LIBINCLUDEUSER32.INCINCLUDELIBUSER32.LIB.DATAN1DB22N2DB88MESG1DBN1=X=N2,0MESG2DBXN2,0MESG3 DB XN2,0MsgBo
29、xCaptionMsgBoxCaption DB EXAMPLE OF WIN32,0 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 MOV EBX,OFFSET MESG3 MO
30、V EBX,OFFSET MESG3 .ENDIF .ENDIF INVOKE INVOKE MessageBoxMessageBox,NULL,EBX,ADDR,NULL,EBX,ADDR MsgBoxCaptionMsgBoxCaption,MB_OK,MB_OK INVOKE INVOKE ExitProcessExitProcess,NULL,NULL END STARTEND START 3 3循环语句循环语句(1)循环结构语法一)循环结构语法一.WHILE条件测试表达式条件测试表达式指令指令.BREAK.IF退出条件退出条件.CONTINUE.ENDW(2)循环结构语法二)循环结构
31、语法二.REPEAT指令指令.BREAK.IF退出条件退出条件.CONTINUE.UNTIL条件测试表达式条件测试表达式(或(或.UNTILCXZ条件测试表达式条件测试表达式)例例:假假设设从从BUF单单元元开开始始为为一一个个ASCII码码字字符符串串,找找出出其其中中的最大数送屏幕显示。的最大数送屏幕显示。【例例15.4.3】.586.MODELFLAT,STDCALLOPTIONCASEMAP:NONEINCLUDEKERNEL32.INCINCLUDEWINDOWS.INCINCLUDELIBKERNEL32.LIBINCLUDEUSER32.INCINCLUDELIBUSER32.L
32、IB.DATABUFDBQWERYTUIOP123COUNTEQU$-BUFMAXDBMax=,?,0MsgBoxCaptionDBExampleofwin32,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 ;.WHILE ECXAL);.IF(DLAL);比较比较 MOV AL,DL ;MOV AL,DL ;大数大数-AL-AL .
33、ENDIF .ENDIF INC EBX ;INC EBX ;调整字符串首址偏移调整字符串首址偏移 INC ECX INC ECX .ENDW .ENDW MOV MAX+4,AL ;MOV MAX+4,AL ;保存最大值保存最大值 INVOKE INVOKE MessageBoxMessageBox,NULL,ADDR MAX,ADDR ,NULL,ADDR MAX,ADDR MsgBoxCaptionMsgBoxCaption,MB_OK,MB_OK INVOKE INVOKE ExitProcessExitProcess,NULL,NULL END STARTEND START15.5创
34、建创建Windows下的窗口程序下的窗口程序窗口程序的运行过程窗口程序的运行过程应用程序应用程序A消息队列消息队列应用程序应用程序A消息循环过程消息循环过程GetMessage()TranslateMessage()DispatchMessage()窗口过程窗口过程ret系统消息队列系统消息队列所有消息所有消息各种用户操作各种用户操作其它应用程序其它应用程序消息队列消息队列传递消息传递消息回回调调窗窗口口过过程程返返回回15.5.2 15.5.2 窗口程序示例窗口程序示例在在WindowsWindows操作系统下创建并显示一个窗口程序的编程步骤为:操作系统下创建并显示一个窗口程序的编程步骤为:
35、(1)调用)调用GetModuleHandle函数获得应用程序的句柄。函数获得应用程序的句柄。(2)可以根据需要从命令行得到参数。)可以根据需要从命令行得到参数。(3)如果不是使用)如果不是使用Windows预定义的窗口类,如预定义的窗口类,如MessageBox或或dialogbox,必须先填写用户自定义窗口注册类的结构(,必须先填写用户自定义窗口注册类的结构(WNDCLASSEX的)变量的)变量参数,再调用参数,再调用RegisterClassEx函数注册窗口类。函数注册窗口类。(4)调用调用ShowWindow函数显示窗口。函数显示窗口。(5)调用)调用UpdateWindows函数刷新窗口客户区。函数刷新窗口客户区。(6)进入消息循环。)进入消息循环。(7)如果有消息到达,则由该窗口的窗口回调函数,即用)如果有消息到达,则由该窗口的窗口回调函数,即用户写的窗口过程,对消息进行处理。户写的窗口过程,对消息进行处理。