Windows汇编语言.docx

上传人:b****5 文档编号:8808726 上传时间:2023-05-15 格式:DOCX 页数:30 大小:117.41KB
下载 相关 举报
Windows汇编语言.docx_第1页
第1页 / 共30页
Windows汇编语言.docx_第2页
第2页 / 共30页
Windows汇编语言.docx_第3页
第3页 / 共30页
Windows汇编语言.docx_第4页
第4页 / 共30页
Windows汇编语言.docx_第5页
第5页 / 共30页
Windows汇编语言.docx_第6页
第6页 / 共30页
Windows汇编语言.docx_第7页
第7页 / 共30页
Windows汇编语言.docx_第8页
第8页 / 共30页
Windows汇编语言.docx_第9页
第9页 / 共30页
Windows汇编语言.docx_第10页
第10页 / 共30页
Windows汇编语言.docx_第11页
第11页 / 共30页
Windows汇编语言.docx_第12页
第12页 / 共30页
Windows汇编语言.docx_第13页
第13页 / 共30页
Windows汇编语言.docx_第14页
第14页 / 共30页
Windows汇编语言.docx_第15页
第15页 / 共30页
Windows汇编语言.docx_第16页
第16页 / 共30页
Windows汇编语言.docx_第17页
第17页 / 共30页
Windows汇编语言.docx_第18页
第18页 / 共30页
Windows汇编语言.docx_第19页
第19页 / 共30页
Windows汇编语言.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Windows汇编语言.docx

《Windows汇编语言.docx》由会员分享,可在线阅读,更多相关《Windows汇编语言.docx(30页珍藏版)》请在冰点文库上搜索。

Windows汇编语言.docx

Windows汇编语言

第1章Windows汇编语言

程序设计基础知识

1.1如何学习Windows汇编语言

汇编语言是在机器语言之上的助记符语言,即用符号来表示二进制码,以便用户记忆,例如指令MOVAX,1234是将数1234送到AX寄存器,这条指令编译后是个二进制数。

如果用大篇幅讲解指令及一些基本算法,那又回到DOS汇编语言去了。

书中把指令系统详细列出并给出使用例,程序中用到某条指令时,可随时查找。

由于编译系统提供了很多高级语法,使Windows汇编语言与高级语言已很相似,因此,我们在注意掌握基本指令的基础上,把注意力放在如何用汇编语言指令或伪指令调用Windows提供的API函数上。

这样才能体现出Windows汇编语言的特点。

1.2Windows汇编语言与DOS汇编语言的区别

在DOS和Windows操作系统下,80x86芯片的指令系统是一样的。

在DOS操作系统实模式下,寄存器都是16位的,要访问1MB的内存空间,必须用分段的概念(因为216=10000h=64KB,即寻址范围从0000到0FFFFh,只能访问64KB,详细原理见书中“地址线的根数和寻址范围的关系”章节),因而提出了相对地址的概念。

这个概念给学DOS汇编的人带来了很大难度。

在Windows操作系统下,寄存器都是32位的(232=100000000h=4GB,寻址范围从00000000到0FFFFFFFFh,即能访问4GB)。

这使Windows汇编语言可以工作在平坦模式,即没有分段的概念,这样Windows汇编语言比DOS汇编语言更好学(再也没有分段的麻烦了)!

在DOS操作系统,用户可以用汇编语言指令访问计算机的所有资源。

但是,在Windows操作系统下,汇编语言中的一些特权指令(例如IN,OUT等)是不许用户使用的,除非你编写了驱动程序。

微软这样做是为了操作系统自身的安全,但也给用户开发程序带来了不便。

在DOS操作系统下,用户可以用系统BIOS提供的调用口int13h直接访问硬盘,而在Windows操作系统下是不能使用的。

要想直接访问硬盘,必须使用Windows操作系统提供的API调用函数。

1.3二进制数

1.3.1将十进制数转为二进制、八进制和十六进制数

将十进制数转为二进制数的方法,一般教科书中都给出除2求余的方法,这种方法用起来不方便。

下面给出一种比较快的计算方法。

1.将十进制整数转为二进制数

任何一个整数,都是由以下数中的一些数相加的结果。

20=1210=1024

21=2211=2028

22=4212=4096

23=8213=8192

24=16214=16384

25=32215=32768

26=64216=65536

27=128217=131072

28=256218=262144

29=512219=524288

例1:

将十进制数31转为二进制数。

例2:

将8193转为二进制数。

2.将十进制小数转为二进制数

任何一个小数,都是以下数中的一些数相加的结果。

2–1=0.5

2–2=0.25

2–3=0.125

2–4=0.0625

例如:

将十进制数0.625转为二进制数。

注意:

小数有除不尽(除2)的数,由于是小数点后的数,只要有一定的精度就可舍弃。

如果一个数既有整数部分,又有小数部分,则分别转换,转换后加入小数点就可以了。

3.将十进制数转为八进制数和十六进制数

将十进制数转为二进制数后,再转为八进制数和十六进制数就很简单了。

结论如下。

整数:

将二进制整数从右往左3位一组(不够时左边补0),便成为八进制数。

将二进制整数从右往左4位一组(不够时左边补0),便成十六进制数。

小数:

将二进制小数从左往右3位一组(不够时右边补0),便成为八进制数。

将二进制小数从左往右4位一组(不够时右边补0),便成为十六进制数。

例如:

十进制(D)二进制(B)八进制(O)十六进制(H)

0000

1111

21022

31133

410044

510155

611066

711177

81000108

91001119

10101012A

11101113B

12110014C

13110115D

14111016E

15111117F

二进制从右往左3位一组

八进制

16100002010二进制从右往左4位一组

十六进制

17100012111

18100102212

19100112313

20101002414

21101012515

22101102616

23101112717

24110003018

25110013119

2611010321A

2711011331B

2811100341C

2911101351D

3011110361E

3111111371F

321000004020

注意:

二进制数有两个状态:

0,1(逢2进1)。

八进制有8个状态:

0,1,2,3,4,5,6,7(逢8进1)。

十六进制有16个状态:

1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(10为A,11为B,……)。

1.3.2不同数制表示法

计算机硬件中单稳态电路的两个状态(高/低),正好对应1和0。

用户在用汇编语言写程序时,可以用十进制数(D)、八进制数(O或Q)、十六进制数(H)和二进制数(B)表示一个数,例如:

MOVAL,13D;将十进制数13送入AL寄存器(字符D可省略)

MOVAL,15O;将八进制数15送入AL寄存器

MOVAL,0DH;将十六进制数0D送入AL寄存器

MOVAL,00001101B;将二进制数00001101送入AL寄存器

注:

以上字符(D,O,Q,H,B)也可用小写。

以上四条语句经过编译链接后,用调试工具查看时的显示结果如下,

MOVAL,0D;0D为二进制数的十六进制显示

计算机内存中的数是以二进制表示的,任何一个数都是由0和1组成的。

1.3.3计算机容量的一些计量单位

计算机容量的计量单位如下。

1=1h=20

2=2h=21

4=4h=22

8=8h=23

16=10h=24

32=20h=25

64=40h=26

128=80h=27

256=100h=28

512=200h=29

1024=400h=210=1K

2048=800h=211=2K

4096=1000h=212=4K

8192=2000h=213=8K

16384=4000h=214=16K

32768=8000h=215=32K

65536=10000h=216=64K

131072=20000h=217=128K

262144=40000h=218=256K

524288=80000h=219=512K

1048576=100000h=220=1024K=1M

1K=1024

1M=1024K

1G=1024M=210×210×210=230

4G=232

其中的一些特殊常数应该记住(经常要用到),例如:

512=200h=29

1024=400h=210=1K

4096=1000h=212=4K

65536=10000h=216=64K

1048576=100000h=220=1024K=1M

1G=1024M=210×210×210=230

4G=232

1.3.4无符号数的表示范围

无符号整数的表示范围比较简单,例如,1个比特只能表示0、1共2个状态,因而1个比特的最大表示范围是0到1。

1b

2个比特能表示0,1,2,3共4个状态,因而2个比特的最大表示范围是0到3。

2b

00

01

10

1122=4个状态(0~3)

由此可知8个比特能表示0,1,2,…,255共256个状态,因而8个比特的最大表示范围是0到255。

8b(1B)

28=256个状态(0~255)

16个比特能表示0,1,2,…,65535共65536个状态,因而16个比特的最大表示范围是0到65535。

16b(1word)

216=65536个状态(0~65535)

通过以上分析,可知n个比特能表示0,1,2,3…,2n–1共2n个状态,其最大表示范围是0到2n–1。

8个比特为1个字节(DB),16个比特为1个字(DW),32个比特为1个双字(DD),因此,对于无符号数:

1个字节(DB)的表示范围是0到255(28–1)

1个字(DW)的表示范围是0到65535(216–1)

1个双字(DD)的表示范围是0到4294967295(232–1)

1.3.5有符号数的表示范围

以1个字节为例,有符号数的表示方法如下。

由于最高位为符号位,因而只有7位用来存放数值,即最大的正数为:

01111111B=7FH=127

00000000B(最小正数)

由此,我们可知1个字节可表示的正数为0到127。

负数的表示范围呢?

我们会这样想,因为负数的符号位肯定是1,因而有以下两个最大或最小数:

11111111B(该数为–1)

10000000B(该数为–128)

读者一定对这两个数的来由感到不好理解,如果能理解这一点,那么负数的表示范围为–1到–128。

因此,1字节可表示的范围为–128到+127。

要理解负数的表示范围,必须要搞清楚补码。

1.3.6补码

大部分教科书在讲补码时,都用“符号位不变,将原码求反再加一”的方法,因而引入了原码、反码的概念,使初学者不容易掌握这部分内容。

原码就是数字本身,例如:

(+7)的原码=00000111最高位为符号位(0表示正数)

(–7)的原码=10000111最高位为符号位(1表示负数)

反码就是将原码按位求反(符号位不变),例如:

(+7)的反码=01111000符号位不变

(–7)的反码=11111000符号位不变

从计算机运算的角度来讲,“符号位不变,将原码求反再加一”的算法是很方便的,但对于读者理解补码的概念没有多大帮助。

例如:

求(–7)的补码。

注意:

当负数以补码的形式表示时,求该数的原值仍用“求反再加一”的方法,例如,

如果是正数,就不能用上述方法。

正数的补码就是该数的本身,所以本书中不引入“正数的补码就是原码”的概念。

其实补码是针对负数来说的,计算机中只有加法器(没有减法器),引入补码的目的是为了将减法计算变为加法计算。

有了只有负数才有补码的概念后,我们就可将注意力放在负数上。

让我们以时钟来说明补码的概念,见表1-1。

表1-1

时间

逆时针时间

0(12)

(–12)(–12)的补码=12–|–12|=0

1

(–11)(–11)的补码=12–|–11|=1

2

(–10)(–10)的补码=12–|–10|=2

3

(–09)(–9)的补码=12–|–09|=3

4

(–08)(–8)的补码=12–|–08|=4

5

(–07)(–7)的补码=12–|–07|=5

6

(–06)(–6)的补码=12–|–06|=6

7

(–05)(–5)的补码=12–|–05|=7

8

(–04)(–4)的补码=12–|–04|=8

9

(–03)(–3)的补码=12–|–03|=9

10

(–02)(–2)的补码=12–|–02|=10

11

(–01)(–1)的补码=12–|–01|=11

结论:

时间的表示范围:

(–12~+11)

(–x)的补码=模–|–x|(模=状态的个数0,1,2,…,11)

例如:

求时间–2的补码。

(–2)的补码=12–|–2|=10

例如:

通过补码将减法转为加法。

11–10=11+(–10)的补码=11+2=13(13–12=1)

11–1=11+(–1)的补码=11+11=22(22–12=10)

12–12=12+(–12)的补码=12+0=12(12–12=0)

将补码用于1个字节:

模=27=128(模=状态的个数0~127)(127=7FH)

(–1)的补码=128–|–1|=128–1=127(7FH),再加上符号位,即为0FFH

(–2)的补码=128–|–2|=128–2=126(7EH),再加上符号位,即为0FEH

(–127)的补码=128–|–127|=128–127=1(01H),再加上符号位,即为81H

(–128)的补码=128–|–128|=128–128=0(00H),再加上符号位,即为80H

1个字节可表示的数:

(–128~127)

将补码用于1个字:

模=215=32768(模=状态的个数0~32767)(32767=7FFFH)

(–1)补=32768–|–1|=32768–1=32767(7FFFH),再加上符号位,即为0FFFFH

(–2)补=32768–|–2|=32768–2=32766(7FFEH),再加上符号位,即为0FFFEH

(–32767)补=32768–|–32767|=1(0001H),再加上符号位,即为8001H

(–32768)补=32768–|–32768|=0(0000H),再加上符号位,即为8000H

1个字可表示的数:

(–32768~32767)

1.3.7数据的二进制存储

1个字节在计算机中的表示法如下。

以下为负数。

1个字节可表示的数:

(–128~127),当溢出时,会出现错误结果。

例如,

127+1=–128(读者从上述存储格式可看出这一点)。

1个字可表示的数:

(–32768~32767),当溢出时,会出现错误结果。

例如,

32767+1=–32768。

补码的计算有点麻烦,但用户在写汇编语言程序时,可以直接用负数书写,例如:

MOVAL,–1

编译系统会自动将其转为:

MOVAL,0FFH。

1.4汇编语言的基本元素

本节内容主要学习汇编语言编译器(ML和MASM)支持的一些语法格式、变量和常量等。

通过学习我们会看到,汇编语言与高级语言(例如C)的基本语法也很相似。

1.4.1整数常量

整数常量由符号开头,加上一个或多个数字和一个表示数字基数的后缀。

表示数字基数的后缀(大小写的效果一样)有以下几种:

B二进制

Q或O八进制

D十进制(整型常量后没有后缀,也表示十进制)

H十六进制

例如:

11001010B二进制

17Q八进制

17O八进制

–89D十进制

–89十进制

0B8h十六进制(如果第一个数字是字母,则必须在字母前加0)

8Bh十六进制

1.4.2算术运算符及其优先级

算术运算符及其优先级见表1-2。

表1-2

算术运算符

名称

优先级(1最高)

()

圆括号

1

+,–

正、负号

2

*,/

乘,整除

3

MOD

整数取模

3

+,–

加、减

4

汇编语言中的优先级,与我们很熟悉的运算习惯一样,例如:

10+5*2先乘后加

120–4MOD5先取模后减

(–45+20)*66先做括号中的加,再乘

1.4.3实数常量

实数常量由符号位(正数的符号可省略)、整数部分、小数点、小数部分和指数组成。

例如:

20.0

–20.小数点不能省,如果没有小数点,则为整型数

+45.3E+04+45.3×104

28.e5E和e的效果是一样的

1.4.4字符常量和字符串常量

以单引号引起来的单个字符为字符常量。

以双引号引起来的单个或多个字符为字符串常量,系统会在字符串常量后加上1个空字符(\0),表示字串结束。

例如:

‘A’为字符常量(内存中的ASCII值为41H);

“A”为字符串常量(内存中的ASCII值为41H,00);

“ABC”为字符串常量(内存中的ASCII值为41H,42H,43H,00);

“123”为字符串常量(内存中的ASCII值为31H,32H,33H,00);

“Thisisn’tatest.”为字符串常量。

1.4.5标识符

标识符也叫变量名。

标识符的定义如下。

变量名由大小写字母、数字、下划线、@和$组成,标识符的第一个字符不能为数字。

变量名这样定义的目的,是让编译器能区分数字与变量名。

例如0FFH为十六进制数,而FFH为变量名。

定义变量名时,要养成见名知意的习惯,不要使用系统已使用的关键字,例如BYTE、WORD、MOV、IF、ELSE、DB、DW、DD等。

变量名的最大长度可为240个字符。

运行编译器时,通过在命令行中加-Cp选项,可以使变量名和系统关键字大小写敏感(区分大小写)。

因为字符@被编译器扩展用于预定义的符号,建议用户不要使用字符@。

以下是一些正确的变量名:

counta123A123_valfname$second

以下变量名是错误的:

3A第一个字符不能为数字IBMPC空格不是有效字符

MUL不能使用系统关键字a+b加号不是有效字符

养成良好的命名习惯,如表1-3所示。

表1-3

缩写

含义

缩写

含义

sz

表示以0结尾的字符串(ASCIIZ)

lp

表示指针longpoint

h

表示句柄handle

lpsz

表示指向ASCIIZ的指针

b

表示字节byte

f

表示浮点数float

w

表示字word

st

表示结构体struct

dw

表示双字doubleword

例如:

hWin表示窗口句柄

lpArray表示指向数组的指针

szString以0结尾的字符串

stWndClassWNDCLASS结构

bNumber以字节定义的数

dwNumber以双字定义的数

wNumber以字定义的数

1.4.6伪指令

伪指令是程序源代码被编译时,由编译器识别和执行的命令。

伪指令是汇编编译器语法格式的一部分,它与CPU处理器无关。

伪指令用于定义逻辑段、选择内存模式、定义变量类型和创建过程等。

同一条伪指令的不同书写格式,其效果是一样的。

例如:

.CODE,.Code,.code。

以下是一个完整汇编语言程序例,例中使用了一些常用的伪指令:

.386;指明指令集

.modelflat,stdcall;程序工作模式,flat为Windows程序使用的平坦模式

;(代码和数据使用同一个人4GB段)

;stdcall为API调用时,右边的参数先入栈

optioncasemap:

none;指明大小写敏感

.data;数据节

.code;代码节

start:

;标号

invokeExitProcess,NULL;中止进程,退出代码

endstart;指明程序入口点

1.4.7指令和标号

指令是在程序被加载到内存后,由处理器执行的语句。

一条指令由4个部分组成:

标号是浮动的地址(程序编译链接后,将有一个具体的地址),用它来指明程序转移的入口点。

标号由变量名后加冒号组成。

例如:

LOC_3:

MOVAX,8;LOC_3为标号

MOVCX,7

LOOPLOC_3

标号也可单独写成一行,例如:

LOC_3:

;LOC_3为标号

MOVAX,8

1.4.8MASM中的@@标号

程序中可以有多个@@:

标号,用@B向后转移到最近的一个@@标号,用@F向前转移最近的一个@@标号。

例如:

MOVAX,10

CMPAX,10

JZ@F;向前转移@@

MOVCX,100

@@:

MOVCX,1000

LOOP@B;向后转移@@

1.4.9注释

在程序中多加注释,有利于阅读程序。

汇编语言中有两种注释。

(1)单行注释:

在程序行后用分号(;)字符开始,同一行上分号后的字符为注释。

例如:

ADDAX,8;AX=AX+8

(2)块注释:

以COMMENT或comment伪指令以及一个由用户定义的符号开始,此后的所有字符为注释,直到另一个由用户定义的字符(与开始定义的相同)出现。

例如:

COMMENT^

Thislineisacomment.

Thissecondisalsoacomment.

^

也可用其他符号:

comment&

Thislineisacomment.

Thissecondisalsoacomment.

&

1.4.10.model语句

伪指令.model用来定义程序的工作模式,它的语法格式是:

.model内存模式[,语言模式][,其他模式]

例如:

.modelflat,stdcall

flat说明内存模式为平坦模式(代码和数据使用同一个4GB段)。

stdcall说明语言模式(API调用时,右边的参数先入栈)。

Windows汇编语言程序使用flat平坦模式,使代码和数据使用同一个4GB段,再也没有DOS汇编语言中段的概念了,从这个角度说,Windows下的汇编语言更好学。

.modelflat自动为段寄存器作了以下说明:

ASSUMECS:

FLAT,DS:

FLAT,ES:

FLAT,SS:

FLAT,FS:

ERROR,GS:

ERROR

该伪指令的意思是CS,DS,ES,SS工作在一个段中,FS和GS不使用。

如果要使用FS和GS,则要用以下语句说明:

ASSUMEFS:

NOTHING,GS:

NOTHING

或者

ASSUMEFS:

FLAT,GS:

FLAT

1.4.11用.386指明使用的指令集

.386伪指令指明程序使用80386处理器指令集,程序开头必须有此语句。

用户级程序工作在最低特权级3,有了.386就够用了。

如果要编写设备驱动程序,则要用.386p,p表示程序可以使用特权指令(该类指令在最高特权级0运行),例如:

MOVCR0,EAX

LGDTQWORDPTRVGDTR;将描述符表载入全局描述符表寄存器

类似的伪指令有:

.8086选择8086指令系统

.286选择80286指令系统

.286P选择保护模式下的80286指令系统

.386选择8

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2