欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    Windows汇编语言.docx

    • 资源ID:8808726       资源大小:117.41KB        全文页数:30页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Windows汇编语言.docx

    1、Windows汇编语言第1章 Windows汇编语言 程序设计基础知识1.1 如何学习Windows汇编语言汇编语言是在机器语言之上的助记符语言,即用符号来表示二进制码,以便用户记忆,例如指令MOV AX,1234是将数1234送到AX寄存器,这条指令编译后是个二进制数。如果用大篇幅讲解指令及一些基本算法,那又回到DOS汇编语言去了。书中把指令系统详细列出并给出使用例,程序中用到某条指令时,可随时查找。由于编译系统提供了很多高级语法,使Windows汇编语言与高级语言已很相似,因此,我们在注意掌握基本指令的基础上,把注意力放在如何用汇编语言指令或伪指令调用Windows提供的API函数上。这样

    2、才能体现出Windows汇编语言的特点。1.2 Windows汇编语言与DOS汇编语言的区别在DOS和Windows操作系统下,80x86芯片的指令系统是一样的。在DOS操作系统实模式下,寄存器都是16位的,要访问1MB的内存空间,必须用分段的概念(因为216=10000h=64KB,即寻址范围从0000到0FFFFh,只能访问64KB,详细原理见书中“地址线的根数和寻址范围的关系”章节),因而提出了相对地址的概念。这个概念给学DOS汇编的人带来了很大难度。在Windows操作系统下,寄存器都是32位的(232=100000000h=4GB,寻址范围从00000000到0FFFFFFFFh,即

    3、能访问4GB)。这使Windows汇编语言可以工作在平坦模式,即没有分段的概念,这样Windows汇编语言比DOS汇编语言更好学(再也没有分段的麻烦了)!在DOS操作系统,用户可以用汇编语言指令访问计算机的所有资源。但是,在Windows操作系统下,汇编语言中的一些特权指令(例如IN,OUT等)是不许用户使用的,除非 你编写了驱动程序。微软这样做是为了操作系统自身的安全,但也给用户开发程序带来了不便。在DOS操作系统下,用户可以用系统BIOS提供的调用口int 13h直接访问硬盘,而在Windows操作系统下是不能使用的。要想直接访问硬盘,必须使用Windows操作系统提供的API调用函数。1

    4、.3 二进制数1.3.1 将十进制数转为二进制、八进制和十六进制数将十进制数转为二进制数的方法,一般教科书中都给出除2求余的方法,这种方法用起来不方便。下面给出一种比较快的计算方法。1将十进制整数转为二进制数任何一个整数,都是由以下数中的一些数相加的结果。20=1 210=102421=2 211=202822=4 212=409623=8 213=819224=16 214=1638425=32 215=3276826=64 216=6553627=128 217=13107228=256 218=26214429=512 219=524288例1:将十进制数31转为二进制数。例2:将819

    5、3转为二进制数。2将十进制小数转为二进制数任何一个小数,都是以下数中的一些数相加的结果。21 = 0.522 = 0.2523 = 0.12524 = 0.0625例如:将十进制数0.625转为二进制数。注意:小数有除不尽(除2)的数,由于是小数点后的数,只要有一定的精度就可 舍弃。如果一个数既有整数部分,又有小数部分,则分别转换,转换后加入小数点就可 以了。3将十进制数转为八进制数和十六进制数将十进制数转为二进制数后,再转为八进制数和十六进制数就很简单了。结论如下。整数:将二进制整数从右往左3位一组(不够时左边补0),便成为八进制数。将二进制整数从右往左4位一组(不够时左边补0),便成十六进

    6、制数。小数:将二进制小数从左往右3位一组(不够时右边补0),便成为八进制数。将二进制小数从左往右4位一组(不够时右边补0),便成为十六进制数。例如:十进制(D) 二进制(B) 八进制(O) 十六进制(H) 0 0 0 0 1 1 1 1 2 10 2 2 3 11 3 3 4 100 4 4 5 101 5 5 6 110 6 6 7 111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F 二进制从右往左3位一组八进制 16 100

    7、00 20 10 二进制从右往左4位一组十六进制 17 10001 21 11 18 10010 22 12 19 10011 23 13 20 10100 24 14 21 10101 25 15 22 10110 26 16 23 10111 27 17 24 11000 30 18 25 11001 31 19 26 11010 32 1A 27 11011 33 1B 28 11100 34 1C 29 11101 35 1D 30 11110 36 1E 31 11111 37 1F 32 100000 40 20注意:二进制数有两个状态:0,1 (逢2进1)。八进制有8个状态:0,

    8、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)、十六进制数()和二进制数(B)表示一个数,例如:MOV AL,13D ;将十进制数13送入AL寄存器(字符D可省略)MOV AL,15O ;将八进制数15送入AL寄存器MOV AL,0DH ;将十六进制数0D送入AL寄存器MOV AL,00001101B ;将二进制数00001101送入AL寄存器注

    9、:以上字符(D,O,Q,H,B)也可用小写。以上四条语句经过编译链接后,用调试工具查看时的显示结果如下,MOV AL,0D ;0D为二进制数的十六进制显示计算机内存中的数是以二进制表示的,任何一个数都是由和1组成的。1.3.3 计算机容量的一些计量单位计算机容量的计量单位如下。1=1h=202=2h=214=4h=228=8h=2316=10h=2432=20h=2564=40h=26128=80h=27256=100h=28512=200h=291024=400h=210=1K2048=800h=211=2K4096=1000h=212=4K8192=2000h=213=8K16384=40

    10、00h=214=16K32768=8000h=215=32K65536=10000h=216=64K131072 =20000h=217=128K262144=40000h=218=256K524288=80000h=219=512K1048576=100000h=220=1024K=1M1K=10241M=1024K1G=1024M =210210210=2304G=232其中的一些特殊常数应该记住(经常要用到),例如:512=200h=291024=400h=210=1K4096=1000h=212=4K65536=10000h=216=64K1048576=100000h=220=102

    11、4K=1M1G=1024M =210210210=2304G=2321.3.4 无符号数的表示范围无符号整数的表示范围比较简单,例如,1个比特只能表示0、1共2个状态,因而1个比特的最大表示范围是0到1。1 b2个比特能表示0,1,2,3共4个状态,因而2个比特的最大表示范围是0到3。2 b0 00 11 01 1 22 = 4 个状态(03)由此可知8个比特能表示0,1,2,255共256个状态,因而8个比特的最大表示范围是0到255。8 b(1B)28 = 256 个状态(0255)16个比特能表示0,1,2,65535共65536个状态,因而16个比特的最大表示范围是0到65535。16

    12、 b(1 word)216 = 65536个状态(065535)通过以上分析,可知n个比特能表示0,1,2,3,2n1共2n个状态,其最大表示范围是0到2n1。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=

    13、12700000000B(最小正数)由此,我们可知1个字节可表示的正数为0到127。负数的表示范围呢?我们会这样想,因为负数的符号位肯定是1,因而有以下两个最大或最小数: 11111111B (该数为1) 10000000B (该数为128)读者一定对这两个数的来由感到不好理解,如果能理解这一点,那么负数的表示范围为1到128。因此,1字节可表示的范围为128到+127。要理解负数的表示范围,必须要搞清楚补码。1.3.6 补码大部分教科书在讲补码时,都用“符号位不变,将原码求反再加一”的方法,因而引入了原码、反码的概念,使初学者不容易掌握这部分内容。原码就是数字本身,例如:(+7)的原码=00

    14、00 0111 最高位为符号位(0表示正数)(7)的原码=1000 0111 最高位为符号位(1表示负数)反码就是将原码按位求反(符号位不变),例如:(+7)的反码=0111 1000 符号位不变(7)的反码=1111 1000 符号位不变从计算机运算的角度来讲,“符号位不变,将原码求反再加一”的算法是很方便的,但对于读者理解补码的概念没有多大帮助。例如:求(7)的补码。注意:当负数以补码的形式表示时,求该数的原值仍用“求反再加一”的方法,例如,如果是正数,就不能用上述方法。正数的补码就是该数的本身,所以本书中不引入“正数的补码就是原码”的概念。其实补码是针对负数来说的,计算机中只有加法器(没

    15、有减法器),引入补码的目的是为了将减法计算变为加法计算。有了只有负数才有补码的概念后,我们就可将注意力放在负数上。让我们以时钟来说明补码的概念,见表1-1。表 1-1 时 间 逆时针时间 0(12) (12) (12)的补码 = 12 |12| = 01 (11) (11)的补码 = 12 |11| = 12 (10) (10)的补码 = 12 |10| = 23 (09) (9)的补码 = 12 |09| = 34 (08) (8)的补码 = 12 |08| = 45 (07) (7)的补码 = 12 |07| = 56 (06) (6)的补码 = 12 |06| = 67 (05) (5)

    16、的补码 = 12 |05| = 78 (04) (4)的补码 = 12 |04| = 89 (03) (3)的补码 = 12 |03| = 910 (02) (2)的补码 = 12 |02| = 1011 (01) (1)的补码 = 12 |01| = 11结论:时间的表示范围:(12 +11) (x)的补码 = 模 |x| (模 = 状态的个数0,1,2,11)例如:求时间 2 的补码。(2)的补码 = 12 |2| = 10例如:通过补码将减法转为加法。1110 = 11 +(10)的补码 = 11+2 = 13(13 12 = 1)111 = 11 +(1)的补码 = 11+11 = 2

    17、2(22 12 = 10)1212 = 12 +(12)的补码 = 12+0 = 12(12 12 = 0)将补码用于1个字节:模= 27 = 128(模 = 状态的个数 0127) (127=7FH)(1)的补码 = 128 |1|=1281=127(7FH),再加上符号位,即为0FFH(2)的补码 = 128 |2|=1282=126(7EH),再加上符号位,即为0FEH (127)的补码 = 128 |127|=128127=1(01H),再加上符号位,即为81H(128)的补码 = 128 |128|=128128=0(00H),再加上符号位,即为80H1 个字节可表示的数:(128

    18、127)将补码用于1个字:模 = 215 = 32768(模=状态的个数032767) (32767=7FFFH)(1)补=32768|1|=327681=32767(7FFFH),再加上符号位,即为0FFFFH(2)补=32768|2|=327682=32766(7FFEH),再加上符号位,即为0FFFEH (32767)补=32768|32767|=1(0001H),再加上符号位,即为8001H(32768)补=32768|32768|=0(0000H),再加上符号位,即为8000H1个字可表示的数:(32768 32767)1.3.7 数据的二进制存储1个字节在计算机中的表示法如下。以下

    19、为负数。 1个字节可表示的数:(128 127),当溢出时,会出现错误结果。例如,127+1 = 128(读者从上述存储格式可看出这一点)。1个字可表示的数:(32768 32767),当溢出时,会出现错误结果。例如,32767+1 = 32768。补码的计算有点麻烦,但用户在写汇编语言程序时,可以直接用负数书写,例如: MOV AL,1编译系统会自动将其转为:MOV AL,0FFH。1.4 汇编语言的基本元素本节内容主要学习汇编语言编译器(ML和MASM)支持的一些语法格式、变量和常量等。通过学习我们会看到,汇编语言与高级语言(例如C)的基本语法也很相似。1.4.1 整数常量整数常量由符号开

    20、头,加上一个或多个数字和一个表示数字基数的后缀。表示数字基数的后缀(大小写的效果一样)有以下几种:B 二进制Q或O 八进制D 十进制(整型常量后没有后缀,也表示十进制)H 十六进制例如:11001010B 二进制17Q 八进制17O 八进制89D 十进制89 十进制0B8h 十六进制(如果第一个数字是字母,则必须在字母前加0)8Bh 十六进制1.4.2 算术运算符及其优先级算术运算符及其优先级见表1-2。表 1-2算术运算符名 称优先级(1最高)()圆括号1+,正、负号2*,/乘,整除3MOD整数取模3+,加、减4汇编语言中的优先级,与我们很熟悉的运算习惯一样,例如: 10 + 5 * 2 先

    21、乘后加 120 4 MOD 5 先取模后减 (45 + 20) * 66 先做括号中的加,再乘1.4.3 实数常量实数常量由符号位(正数的符号可省略)、整数部分、小数点、小数部分和指数组成。例如:20.020. 小数点不能省,如果没有小数点,则为整型数+45.3E+04 +45.310428.e5 E和e的效果是一样的1.4.4 字符常量和字符串常量以单引号引起来的单个字符为字符常量。以双引号引起来的单个或多个字符为字符串常量,系统会在字符串常量后加上1个空字符(0),表示字串结束。例如:A 为字符常量(内存中的ASCII值为41H);“A” 为字符串常量(内存中的ASCII值为41H,00)

    22、;“ABC” 为字符串常量(内存中的ASCII值为41H,42H,43H,00);“123” 为字符串常量(内存中的ASCII值为31H,32H,33H,00);“This isnt a test.” 为字符串常量。1.4.5 标识符标识符也叫变量名。标识符的定义如下。变量名由大小写字母、数字、下划线、和$组成,标识符的第一个字符不能为数字。变量名这样定义的目的,是让编译器能区分数字与变量名。例如0FFH为十六进制数,而FFH为变量名。定义变量名时,要养成见名知意的习惯,不要使用系统已使用的关键字,例如BYTE、WORD、MOV、IF、ELSE、DB、DW、DD等。变量名的最大长度可为240个

    23、字符。运行编译器时,通过在命令行中加-Cp选项,可以使变量名和系统关键字大小写敏感(区分大小写)。因为字符被编译器扩展用于预定义的符号,建议用户不要使用字符。以下是一些正确的变量名:count a123 A123 _val fname $second以下变量名是错误的:3A 第一个字符不能为数字 IBM PC 空格不是有效字符MUL 不能使用系统关键字 a+b 加号不是有效字符养成良好的命名习惯,如表1-3所示。表 1-3缩 写含 义缩 写含 义sz表示以0结尾的字符串(ASCIIZ)lp表示指针long pointh表示句柄handlelpsz表示指向ASCIIZ的指针b表示字节bytef表

    24、示浮点数floatw表示字wordst表示结构体structdw表示双字double word例如: hWin 表示窗口句柄 lpArray 表示指向数组的指针 szString 以0结尾的字符串 stWndClass WNDCLASS结构 bNumber 以字节定义的数 dwNumber 以双字定义的数 wNumber 以字定义的数1.4.6 伪指令伪指令是程序源代码被编译时,由编译器识别和执行的命令。伪指令是汇编编译器语法格式的一部分,它与CPU处理器无关。伪指令用于定义逻辑段、选择内存模式、定义变量类型和创建过程等。同一条伪指令的不同书写格式,其效果是一样的。例如:.CODE,.Code

    25、,.code。以下是一个完整汇编语言程序例,例中使用了一些常用的伪指令:.386 ;指明指令集.model flat, stdcall ;程序工作模式,flat为Windows程序使用的平坦模式 ;(代码和数据使用同一个人4GB段) ;stdcall为API调用时,右边的参数先入栈option casemap : none ;指明大小写敏感.data ;数据节.code ;代码节start: ;标号invoke ExitProcess, NULL ;中止进程,退出代码end start ;指明程序入口点1.4.7 指令和标号指令是在程序被加载到内存后,由处理器执行的语句。一条指令由4个部分组成

    26、:标号是浮动的地址(程序编译链接后,将有一个具体的地址),用它来指明程序转移的入口点。标号由变量名后加冒号组成。例如:LOC_3: MOV AX,8 ;LOC_3为标号 MOV CX,7 LOOP LOC_3标号也可单独写成一行,例如:LOC_3: ;LOC_3为标号 MOV AX,81.4.8 MASM中的标号程序中可以有多个:标号,用B向后转移到最近的一个标号,用F向前转移最近的一个标号。例如: MOV AX,10 CMP AX,10 JZ F ;向前转移 MOV CX,100: MOV CX,1000 LOOP B ;向后转移1.4.9 注释在程序中多加注释,有利于阅读程序。汇编语言中有

    27、两种注释。(1)单行注释:在程序行后用分号(;)字符开始,同一行上分号后的字符为注释。例如:ADD AX,8 ;AX=AX+8(2)块注释:以COMMENT或comment伪指令以及一个由用户定义的符号开始,此后的所有字符为注释,直到另一个由用户定义的字符(与开始定义的相同)出现。例如: COMMENT This line is a comment. This second is also a comment. 也可用其他符号: comment & This line is a comment. This second is also a comment. &1.4.10 .model语句伪指

    28、令.model用来定义程序的工作模式,它的语法格式是:.model 内存模式,语言模式,其他模式例如: .model flat, stdcall flat说明内存模式为平坦模式(代码和数据使用同一个4GB段)。stdcall说明语言模式(API调用时,右边的参数先入栈)。Windows汇编语言程序使用flat平坦模式,使代码和数据使用同一个4GB段,再也没有DOS汇编语言中段的概念了,从这个角度说,Windows下的汇编语言更好学。.model flat 自动为段寄存器作了以下说明:ASSUME CS:FLAT,DS:FLAT,ES:FLAT,SS:FLAT,FS:ERROR,GS:ERROR

    29、该伪指令的意思是CS,DS,ES,SS工作在一个段中,FS和GS不使用。如果要使用FS和GS,则要用以下语句说明:ASSUME FS:NOTHING,GS:NOTHING或者ASSUME FS:FLAT,GS:FLAT1.4.11 用.386指明使用的指令集.386伪指令指明程序使用80386处理器指令集,程序开头必须有此语句。用户级程序工作在最低特权级3,有了.386就够用了。如果要编写设备驱动程序,则要用.386p,p表示程序可以使用特权指令(该类指令在最高特权级0运行),例如:MOV CR0,EAXLGDT QWORD PTR VGDTR ;将描述符表载入全局描述符表寄存器类似的伪指令有:.8086 选择 8086 指令系统.286 选择 80286 指令系统.286P 选择保护模式下的 80286 指令系统.386 选择 8


    注意事项

    本文(Windows汇编语言.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


    收起
    展开