Windows 汇编程序基础课件_第1页
Windows 汇编程序基础课件_第2页
Windows 汇编程序基础课件_第3页
Windows 汇编程序基础课件_第4页
Windows 汇编程序基础课件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

Windows汇编程序基础3.1机器语言、汇编语言和高级语言

程序设计程序语言分为三大类:机器语言、汇编语言和高级语言。

高级语言目前使用较多的是高级语言编程用高级语言编写的程序便于阅读和修改计算机不能直接执行需要由编译程序或解释程序将它翻译成计算机能够接受的机器语言程序

C,C++,java等都是高级语言。机器语言计算机能够直接识别的语言机器指令用二进制代码组成每条机器指令都由CPU执行,控制计算机完成一个基本操作机器语言编写的程序是计算机惟一能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译变换成机器语言程序。

汇编语言介于机器语言和高级语言之间充分利用计算机的硬件特性和操作系统底层功能直接利用CPU的指令系统3.2汇编语言程序的上机过程开发过程的最终目的是产生一个可执行文件先要编写相应的程序源文件(源程序)再进行编译链接3.2.1汇编程序的开发过程汇编程序的开发过程分为编辑、编译、链接、运行等几个步骤3.2.1汇编程序的开发过程(续)1.汇编程序的后缀为.asm,可以用任何文本编辑程序来编写,但是必须使用“纯文本”格式保存。2.在编辑生成源文件后,下一步操作就是运行汇编程序对源文件进行汇编,如果没有错误就生成obj目标代码文件。3.目标代码文件不能直接运行,将.obj文件和用到的库文件链接起来,生成最终的.exe文件。4.在得到可执行文件后,再运行可执行文件,检查程序是否可以正确运行。如何找到逻辑错误?一般来说,有3种常用的方法来查找错误:静态分析、中间结果打印、动态调试。

3.2.2MASM汇编器MASM汇编器的命令行用法为:

ml[/选项]汇编程序源文件[/link链接选项]选项功能/c仅进行编译,不自动进行链接

/coff产生的obj文件格式为COFF格式

/Cp源程序中区分大小写

/Fofilename指定输出的obj文件名

/Fl[filename]产生.lst列表文件

/Ipathname指定include文件的路径

/link指定链接时使用的选项

3.2.3LINK链接器LINK编译器的命令行用法为:link[选项][文件列表]选项功

/out:输出文件名输出的文件名,扩展名默认为.exe/map:文件名生成MAP文件

/libpath:目录名指定库文件的目录路径

/implib:文件名指定导入库文件

/entry:标号指定入口

/comment:字符串在PE文件的文件头后面加上文本注释(版权信息)

/stack:数字设定堆栈的大小

/subsystem:系统名指定程序运行的环境,可以是以下几种之一:Native,Windows,Console,Windowsce,Posix以一个源程序文件hello.asm为例,对它进行汇编链接,最后运行。用MASM汇编一个程序的方法为ml/c/coffhello.asm用LINK链接生成可执行文件的方法为:link/subsystem:consolehello.obj可以简化为:ml/coffhello.asm/link/subsystem:console

3.2.4汇编链接步骤

3.3汇编源程序的格式

3.3.1一个显示字符串的汇编程序举例hello.asm等同于下面的C程序#include<stdio.h>intmain(){

printf("HelloWorld!\n");return0;}3.3.2程序格式

1.模式定义程序的第一部分是有关模式定义的3条语句:.386.modelflat,stdcalloptioncasemap:none这些语句定义了程序使用的指令集、工作模式。下面讲一下指令集和工作模式(1)指令集.386语句是汇编语言的伪指令,说明使用的指令集是哪一种CPU的。如果用汇编语言编写的是驱动程序或者驱动程序的一个小模块,而且驱动程序在特权级0上运行,就需要使用.386p,后面带p的伪指令表示程序中可以使用特权指令。在编程中如果使用了MMX指令,除了定义.586之外,还要加上一句.mmx伪指令:.586.mmx

(2)工作模式.model语句用来定义程序工作的模式,它的格式是:.model内存模式[,调用规则][,其他模式]内存模式的定义影响最后生成的可执行文件在DOS的可执行程序中,可用到.com文件和.exe文件。在Windows环境下,可执行程序只有一种内存模式,即Flat(平坦)模式。(2)工作模式(续)在DOS下的汇编语言程序中,常常有这样的程序片段:MOVAX,DATAMOVDS,AX其作用是给数据段寄存器DS赋值。在编程时,必须考虑这些DS,ES,SS等段寄存器是否正确设置。在Windows汇编语言程序中,则不必考虑这些问题。在程序中,不需要也不应该给CS,DS,ES,SS等段寄存器赋值。(3)option语句option语句有许多选项,这里介绍一种:optioncasemap:none这条语句说明程序中的变量和子程序名是否对大小写敏感。由于WindowsAPI函数中的函数名称是区分大小写的,所以应该指定这个选项“casemap:none”3.3.2程序格式2.includelib语句汇编程序中也需要调用一些外部模块(子程序/函数)来完成部分功能。例如:使用下面语句通知链接程序使用msvcrt.libincludelibmsvcrt.lib若要使用使用其他库文件,只需重复编写Includelib库文件名3.3.2程序格式3.函数声明语句对于所有要用到的库函数或WindowsAPI函数,在程序的开始部分必须预先声明,包括函数的名称、参数的类型等。格式:函数名称

PROTO[调用规则]:[第一个参数类型][,:后续参数类型]3.3.2程序格式4.include语句include语句的语法是:include文件名例如:includekernel32.incincludeuser32.inc以后程序中用到user32.dll和kernel32.dll中的函数时,不需要事先声明就可以直接使用。3.3.2程序格式5.数据和代码部分程序中的数据部分和代码部分是分开定义的,分别以.data和.code开始,以end结束。

end语句一般是整个程序的最后一条语句,end语句后面跟的是起始标号,指出了程序执行的第一条指令的位置。3.3.2程序格式6.跨行的语句

当源程序的某一语句过长,不利于书写和阅读时,可以用反斜杠(\)作为换行符,将这条语句分为几行来写。3.3.3一个Windows界面的汇编程序

下面给出一个使用Windows图形界面的汇编源程序。hellow2.asm(显示一个Windows消息框)在编译链接时,必须在subsystem选项中指定“windows”,而不是“console”。命令为:ml/coffhellow.asm/link/subsystem:windows运行结果:

3.4操作数的寻址方式

寻址方式就是如何表示操作数的各种方法。以MOV指令为例:格式:MOVDST,SRCDST为目标操作数,SRC为源操作数,即SRC→DSTDST和SRC的数据类型应该一致

举例例如,以下的一些数据传送操作都是用MOV指令完成的MOVAL,127;将AL的内容设置为127,即7FHMOVDX,100;将DX的内容设置为100,即0064HMOVEAX,0;将EAX的内容设置为0MOVEBX,EAX;将EAX的内容复制到EBXMOVX,-1;将X设置为-1,变量X可定义为字 节、字、双字类型

3.4.1立即寻址操作数直接包含在指令中,紧跟在操作码之后的寻址方式称为立即寻址方式,该操作数也被称为立即数。举例:MOVAL,00,190,-1和MOVAX,1900FFFFFFFFH为MOVEAX,-1立即数。MOVEAX,0FFFFFFFFH操作数包含在CPU内部的寄存器中举例:MOVBL,80源操作数使用的是立即寻址;目标操作数使用寄存器寻址举例:MOVEAX,EBXEBX和EAX都是寄存器寻址

3.4.2寄存器寻址

3.4.3直接寻址指令中直接给出了操作数的地址例如:dVar是定义好的一个双字型变MOVEAX,dVarMOVdVar,EBX

执行指令“MOVEAX,dVar”时,CPU从指令中得知dVar的地址,再从地址取出一个双字,送给EAX。3.4.4寄存器间接寻址

操作数的地址放在寄存器中,CPU从寄存器中取得操作数的地址,例如:MOVESI,00404011HMOVEAX,[ESI]ESI外面加一对方括号,表示把ESI作为地址,从内存中取出一个双字。

3.4.5寄存器相对寻址操作数的地址是寄存器和一个立即数相加后得到的结果

举例:MOVESI,0040200AHMOVEDI,[ESI+4]ESI加上4后得到的结果,作为一个操作数的地址。再从这个地址中取出一个双字送给EDI。

3.4.6基址变址寻址操作数的地址是两个寄存器相加后得到的结果,两个寄存器分别称为基址寄存器和变址寄存器。举例:MOVESI,0040200AHMOVEBX,4MOVEDI,[EBX+ESI]

3.4.6基址变址寻址(续)基址寄存器有两个:BX和BP变址寄存器也有两个:SI和DI基址变址寄存器只能是4种组合之一:[BX+SI],[BX+DI],[BP+SI]和[BP+DI]。3.4.7基址变址相对寻址

操作数的地址是两个寄存器以及一个立即数相加后得到的结果,即基址寄存器、变址寄存器和相对量。举例:MOVESI,0040200AHMOVEBX,4MOVEDI,[EBX+ESI+4]

3.4.8基址变址比例相对寻址

操作数的地址是由基址寄存器、变址寄存器乘以一个比例数和相对量这3个部分相加得到的结果。比例数只能有1,2,4,8,这4种取值。

举例:MOVESI,0040200AHMOVEBX,4MOVEDI,[ESI+EBX*2+4]3.4.9寻址方式总结

有效地址的计算方式

EA的计算中包括基址、变址、比例、相对这4个部分。每个部分都可以从上面的可选项中任选其一。它可以转换为以下几种寻址方式:比例数取1时,就变成基址变址相对寻址方式。比例数取1且相对量不出现时,就变成基址变址寻址方式。变址寄存器不出现时,就变成寄存器相对寻址方式。变址寄存器和相对量不出现时,就变成寄存器间接方式。基址寄存器和变址寄存器不出现时,就变成直接方式。3.4.10段超越内存操作数的地址由两个部分指定:段和有效地址。寻址方式中只确定有效地址段寄存器确定段地址没有指定段寄存器且寻址方式使用了ESP和EBP寄存器,就使用SS段寄存器。其他情况,使用DS段寄存器。

例如,下面指令中的内存操作数在SS段中:MOVEAX,[EBP+8]MOVEBX,[ESP-4]下面指令中的内存操作数在DS段中:MOVEAX,[EBX+8]MOVEBX,[ESI-4]MOVEAX,[0040200AH]

3.5数据定义3.5.1常数的表示3.5.2简单数据类型3.5.3DUP伪操作3.5.4数据定义的例子程序

3.5.1常数的表示二进制数字后面跟b或B,如00011011b八进制数字后面跟o或O;如33o十进制数字后面跟d或D,如27d十六进制数字后面跟h或H,如1BH数字后面不跟字母时,被当做十进制数可用.radix指定默认数值(一般不用)

3.5.2简单数据类型3.5.2简单数据类型(续)定义数据的语句为:[变量名]助记符

表达式[,表达式…]举例:bVarDB120wVarWORD 200,3003.5.3DUP伪操作

为连续的存储单元提供重复数据格式:NDUP(表达式)N为重复因子,只能取正整数DUP还可以嵌套常用来定义数组,例如:bArrayWORD50DUP(0)表示字型数组bArray,有50个元素,每个元素初值为0

3.5.4数据定义的例子程序说明数据变量的定义和使用方法的例子defvar.asm命令:ml/coffdefvar.asm/linksubsystem:console结果:在VC调试程序中查看数据区的内容如图:3.6操作符3.6.1常用伪操作1.PTR伪操作2.EQU伪操作3.

(等号)伪操作4.$伪操作5.ORG伪操作6.offset操作符7.type操作符8.length操作符9.size操作符

1.PTR伪操作用法:类型PTR地址表达式

类型的取值:BYTE,WORD,DWORD等作用(1)在指令中临时改变变量的类型(2)确定指令中操作数的类型

2.EQU伪操作用法为:符号名

EQU表达式举例:NULL EQU0MB_OK EQU0在程序中就可以使用这些符号来替代这些常量,EQU的作用和C语言中的“#define”相似。

3.

(等号)伪操作用法:符号名

表达式

作用:为常量、表达式及其他各种符号定义一个等价的符号名

举例:I=100可多次重复定义,以最后一次定义的值为准而EQU定义的符号名则只能定义一次4.$伪操作

$在程序中表示当前地址计数器的值

举例:wVarWORD0102h,1000,100*100BYTESOFWVAREQU$-wVar$代表该行所在的地址计数器,减去wVar的地址,就得到了wVar所占用的字节数。5.ORG伪操作

用法为:ORG数值表达式作用:将程序下一行的地址计数器的值设置成数值表达式的值举例:aVarBYTE01hORG$+10bVarBYTE02h在aVar和bVar两个变量中插入10字节的空间

6.offset操作符用法为:offset[变量|标号]作用:取出变量或标号的地址

举例:下面2条语句等价dVar3DWORDwVar2dVar3DWORDoffsetwVar27.typ

温馨提示

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

评论

0/150

提交评论