您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 32位汇编语言程序设计17稿412c
2020/3/11132位汇编语言程序设计计算机科学与信息工程学院2020/3/112序《32位汇编语言程序设计》是计算机软件课程。也是计算机专业学生的必修课程,与其他程序设计语言相比,汇编语言对机器的硬件层封装最少,在操作系统的控制下允许程序员最大限度地直接访问计算机硬件。汇编语言从语言的角度逼真地描述了微处理器的体系结构,从软件角度描述了计算机系统硬件层的运行规则。不同的CPU体系有不同的汇编语言,即使同一种CPU体系也有不同的汇编语言。本课学习的是Intel80X86CPU系列的32位汇编语言HLA。2020/3/113为什么要学习汇编语言?在学习计算机专业其他课程时,会遇到一些该课程不能解答的问题:常数为什么不能修改,数据为什么要有数据类型,为什么C/C++语言中数组的下标从0开始,为什么不能用值传递参数或自动局部变量从函数带回信息,函数的形参变量和自动局部变量放在内存的哪一部分,它们为什么会随着函数的结束而消失,C/C++语言中为什么要区分整数运算和浮点数运算,编译程序为什么要使用逆波兰式等等,学习32位汇编语言程序设计后,会帮助你理解许多其他课程留下的问题。2020/3/114第一章汇编语言单词第二章CPU映像和机器数第三章内存数据映像第四章操作数寻址方式第五章输入输出函数第六章整型运算第七章整型控制结构结束放映2020/3/115第八章浮点型运算第九章指针和字符串第十章数组和串第十二章过程结束放映2020/3/116第一章汇编语言字符集和单词1.1汇编语言字符集1.2注释符1.3专用符号1.4保留字1.5标识符1.6汇编语言程序格式2020/3/1171.1汇编语言字符集汇编语言采用ASCII码字符作为自己语言的字符集。汇编语言中的单词只能用字符集中的字符按语言语法规定组成。2020/3/118汇编语言的单词汇编语言的单词由一个或多个ASCII码(字符集)字符组成,汇编程序按照语法定义对它们进行翻译。汇编语言的单词包括注释符、专用符号、保留字、标识符等。2020/3/1191.2注释符汇编语言的注释符分单行注释符和跨行注释符。单行释符//可以放在程序某行中任何位置,汇编程序忽略从//开始到行尾的所有内容。可跨行注释符/**/汇编程序忽略从/*开始到*/之间的所有内容。2020/3/1110例1:注释的用法(1)可跨行注释符/*下面的程序段对数组实施快速排序算法*/……mov(365,ecx);/*给计数器赋初值*/(2)单行注释符mov(365,ecx);//给计数器赋初值2020/3/11111.3专用符号专用符号主要包括汇编语言的运算符、分隔符、数制标识符。专用符号有一个字符的也有两个字符的。下面是常用的一个字符的专用符号。*/+-();,=&$%“:[]下面是常用的两个字符的专用符号。==!===2020/3/1112例2:专用符号举例mov(&data,eax);stdout.put(32位汇编语言,nl);stdout.put(pi=,pi:10:3,nl);stdout.put($6F,nl);stdout.put(%10101010,nl);2020/3/11131.4保留字保留字也称关键字,保留字包括CPU中的寄存器名,汇编语言的指令助记符,数据类型名称等。汇编语言的保留字不区分大小写。2020/3/1114CPU中的寄存器名ALAHAXEAXBLBHBXEBXCLCHCXECXDLDHDXEDXSIESIDIEDIBPEBPSPESPST0ST1ST2ST3ST4ST5ST6ST72020/3/1115指令助记符ADDINCADCSUBDECCMPNEGSBBMULIMULINTMULDIVIDIVMODIMOD2020/3/1116数据类型名称int8int16int32uns8uns16uns32real32real64real80byteworddwordqwordlwordcharstringcsetarrayboolean2020/3/1117其他符号programbeginendproceduretypevalstaticvarreadonlyconst……如果想了解汇编语言专用符号和保留字的更多的相关信息,请参考HLA手册。2020/3/11181.5标识符标识符可用作程序名、变量名、常量名、函数名、过程名、标号等。汇编语言的标识符必须以字母或下划线开始,后面可跟字母、数字、下划线。由于受MASM的限制,标识符的长度不能超过236个ASCII字符。汇编语言的标识符区分大小写字母。标识符不能与保留字同名。如果标识符与保留字相同,汇编程序将按照保留字处理。2020/3/1119例3:合法的标识符和非法的标识符(1)合法的标识符addtionbigfirstlasta1s1smallSmall(2)非法的标识符%a15sALs[1]2020/3/11201.6汇编语言程序基本格式program程序名;#include(stdlib.hhf)……//数据段begin程序名;程序指令序列//代码段end程序名;2020/3/1121程序中的program,begin,end是汇编语言的保留字。程序名要按标识符取名。数据段用来定义各种变量、常量;该位置还用来定义过程(子程序)。begin和end之间是代码段。汇编语言提供了输入输出标准库,为了使用输入输出标准库,必须在程序开始用包含语句把标准库的头文件stdlib.hhf包含到程序中来。2020/3/1122例3:显示“汇编语言编程开始了!”的汇编语言程序programHelloWorld;#include(stdlib.hhf)//包含标准库头文件beginHelloWorld;stdout.put(汇编语言编程开始了!,nl);stdout.put(击回车键继续);stdin.readLn();endHelloWorld;2020/3/1123汇编语言程序执行前的处理在编辑器里编写好的汇编语言程序又称源程序,计算机无法执行这样的程序,我们知道计算机其实只认识二进制代码,为了让计算机能执行源程序,需要把源程序翻译成二进制代码,这个翻译器我们称为汇编程序,翻译器产生二进制代码,我们称为目标程序,这样的程序还不能执行,还必须为它链接必要的系统代码,这个任务由链接程序完成。链接程序产生可执行代码,它以.exe文件表示。2020/3/1124汇编源程序汇编程序输出信息目标程序段子程序静态库函数链接链接程序输出信息可执行程序动态库函数输入数据执行可执行程序输出信息运行结果结束把源程序变为可执行程序的过程一个编辑好的源程序通过汇编、链接后产生可执行代码文件,这个过程如图所示。2020/3/1125汇编语言集成开发环境为了提高编写程序的效率,专门开发了编程的集成开发环境(IDE),我们课程使用的集成开发环境是RadASM,它是一种绿色产品,适合许多种汇编语言,使用方便。我们课程主要使用的软件有hla,masm32,RadASM,Ollydbg。2020/3/11262020/3/11272020/3/11282020/3/1129如果用C++编写同样的程序,编写的代码如下:#includestdafx.h#includestdio.hintmain(intargc,char*argv[]){printf(汇编语言编程开始了!\n);return0;}2020/3/1130#includestdafx.h#includeiostreamusingnamespacestd;intmain(intargc,char*argv[]){cout汇编语言编程开始了!endl;return0;}2020/3/1131汇编语言程序具有占用空间小,运行效率高的优点,与这个汇编语言程序相似的C/C++程序经编译后产生的执行代码约有152KB,而汇编语言编译的结果不到8K,汇编语言程序常用于嵌入系统,控制系统编程,也用于编写设备驱动程序,而设计图形界面不是汇编语言的特长,每种程序语言都各有擅长,在应用中注意要扬长避短。2020/3/1132第二章机器数和CPU映像2.1整数机器数编码2.2机器整数的加减法运算及溢出问题2.3字符机器数编码2.4Intel80x86CPU映像2020/3/11332.1整数机器数编码汇编语言语法把二进制整数分为两种,无符号和有符号整数。无符号整数是指数据的每一位都代表数值。在汇编语言程序设计里,内存地址(指针),循环次数,ASCII码等都是无符号整数。数学运算中整数值有正数和负数之分,在计算机元件级怎样表示正号和负号?答案是只能用数字0和1表示正号和负号。因此必须进行符号和数值混合编码。2020/3/1134(一)原码表示法如果正数的符号用0表示,负数的符号用1表示,绝对值用二进制数表示,这就是原码表示法。假设计算机字长是n位,能表示n-1位有符号整数,设X=Xn-2Xn-3…X0,原码表示是:0Xn-2Xn-3…X0X≥0[X]源码=1Xn-2Xn-3…X0X≤02020/3/1135例1:设n=8,求二进制数10010,-10010的原码。二进制数10010的原码是00010010,在此最高位的0代表+号。二进制数-10010的原码是10010010,在此最高位的1代表–号。根据定义,0在原码中有两种表示,所以计算机内整数不采用原码表示法。2020/3/1136(二)补码表示法n位二进制整数补码的定义是:X0≤X≤2n-1-1[X]补码=2n+X-2n-1≤X<0n位二进制整数补码表示X是n-1位二进制整数2020/3/1137二进制数转换为补码二进制正数转换成补码与原码相同。二进制负数转换成补码有两种方法:方法1:根据定义求补码例2:n=8,求(-1010111)2和-119的补码。[-1010111]补码=28-1010111=100000000-1010111=10101001[-119]补码=28-1110111=100000000-1110111=10001001100000000-101011110101001100000000-1110111100010012020/3/1138方法2:写出负数的绝对值,求绝对值的补码,然后对每位取反(包括符号位),末位加1。例3:n=8,求(-1010111)2和-119的补码。计算(-1010111)2的补码1.求负数绝对值10101112.求补码01010111//n位补码3.取反码101010004.加1101010012020/3/1139计算-119的补码1.十进制换成二进制-11101112.求负数绝对值11101113.求补码011101114.取反码100010005.末位加1100010012020/3/11400在补码中只有一种表示法。整数数值在计算机元件级用二进制补码表示。注意补码表示是非对称性的。8位补码表示有符号数的范围是-128~127,16位补码表示有符号数的范围是-32768~32767。我们将补码逐位取反,再加1的运算称为求补运算。一个整数的补码经过求补运算结果是该数相反数的补码。[X]补[-X]补求补运算2020/3/1141计算补码的真值对于正数补码,直接用权的多项式展开求和。例:已知n=8位,求01001010的真值用权的多项式展开求和:原式=26+23+21=74对于负数,有两种方法,每种方法有多个计算步骤。2020/3/1142方法一:根据补码的定义[X]补码=2n+XX=-(2n-[X]补码)例:求10001001(-1110111的补码)真值X=-(28-10001001)=-1110111=-11910000000010001001-11101112020/3/1143方法二:对负数的补码求补,得到它的绝对值,计算绝对值的权的多项式的和,然后对和实施取负运算。例:求10001001(-1110111的补码)真值
本文标题:32位汇编语言程序设计17稿412c
链接地址:https://www.777doc.com/doc-4310196 .html