汇编语言程序设计第1章基础知识◆汇编语言程序设计概述◆进位计数制及其相互转换◆计算机中数的表示◆计算机中字符的表示汇编语言程序设计1.1汇编语言程序设计概述机器语言是计算机第一代语言,它全部由0、1代码组成,是能够直接被机器所接受的语言,是最底层的计算机语言。机器语言不容易记忆,程序编写难度大,调试修改繁琐,且不易移植,现程序员很少用。但机器语言执行速度最快,它是一种面向机器的程序设计语言。1.1.1机器语言汇编汇编语言程序设计具有一定含义的符号作为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令(或汇编指令)。汇编语言是汇编指令集、伪指令集和使用它们规则的统称。汇编语言比机器语言直观,容易记忆和理解,用汇编语言编写的程序也比机器语言程序易读、易检查、易修改。对于不同的计算机,针对同一问题所编写的汇编语言源程序是互不通用的。用汇编语言编写的程序执行效率比较高,但通用性与可移植性仍然比较差。计算机不能直接识别用汇编语言编写的程序,必须由一种专门翻译程序将汇编语言程序翻译成机器语言程序,计算机才能执行。1.1.2汇编语言汇编语言程序设计1.可以更深刻认识计算机的工作过程用汇编语言编制程序,可以清楚地了解计算机是怎样完成各种复杂工作的。在此基础上,程序设计人员更能充分地利用机器硬件的全部功能,发挥机器的长处。2.许多领域和场合需要使用汇编语言.与硬件资源密切相关的软件开发;.要求执行效率高、反应快的领域;.受存储容量限制的应用领域。1.1.3为什么要学习和使用汇编语言返回汇编语言程序设计1.数制的概念按进位的原则进行计数叫进位计数制,简称数制。每种数制都有其基数和各数位的位权。基数是指该数制中允许选用的基本数码的个数。每个数码所表示的数值等于该数码乘以一个与数码所在位置有关的常数,这个常数叫位权,位权的大小是以基数为底,数码所在位置的序号为指数的整数次幂。2.常用的数制在汇编语言中常用的数制有:十进制、二进制、八进制和十六进制。1.2进位计数制及其相互转换1.2.1进位计数制汇编语言程序设计十进制数的基数为10,十进制数的位权为10i,其中i代表数字在十进制数中的序号,任意一个10进制N可表示为:N=anan-1…a1a0.a-1…a-m=an×10n+an-1×10n-1+…+a1×101+a0×100+a-1×10-1+……+a-m×10-m-m=∑ai×10ii=n2.二进制二进制数的基数为2,二进制数中每一个数字的位权由2的幂次决定,即:2i,其中i为数字在二进制数中的序号。1.十进制汇编语言程序设计N=anan-1…..a1a0.a-1……a-m=an×2n+an-1×2n-1+…..+a1×21+a0×20+a-1×2-1+……+a-m×2-m-m=∑ai×2ii=n3.十六进制十六进制数的基数为16,十六进制中每位数字的位权由16的幂次决定N=anan-1…..a1a0.a-1……a-m=an×16n+an-1×16n-1+…+a1×161+a0×160+a-1×16-1+……+a-m×16-m-m=∑ai×16ii=n其中m,n意义同前,ai取值范围为0-9,A,B,C,D,E,F中任一数字。汇编语言程序设计1.2.2各种数制间的相互转换将数由一种数制转换成另一种数制称为数制间的转换。1.非十进制转换成十进制非十进制数转换成十进制数采用“位权法”,即把非十进制数写成各自的按权展开式,然后按十进制运算原则求和,其和值就是转换后对应的十进制数。【例1.1】将十六进制数B2F转换成十进制数。(B2F)16=B×162+2×161+F×160=11×162+2×161+15×160=2816+32+15=(2863)10汇编语言程序设计2.十进制数转换成非十进制数将一个十进制数转换非十进制数时,整数部分和小数部分的转换方法是不同的,需将整数部分和小数部分分别转换,将两个转换结果结合起来就可以得到对应的非十进制数。(1)十进制整数转换成非十进制整数将十进制整数转换为非十进制整数采用“除基取余法”,即:将十进制整数及此期间产生的商逐次除以需转换为数制的基数。直到商为零为止,并记下每一次相除所得到的余数。按从后往前的次序将各余数记作KnKn-1Kn-2……K0,从而构成转换后对应的非十进制整数。第一次得到的余数为非十进制数的最低位,最后一次得到的余数为非十进制数的最高位。汇编语言程序设计【例1.3】将整数125转换成对应的十六进制整数则得:(125)10=(7D)16(2)十进制小数转换成非十进制小数将十进制小数转换为非十进制小数采用:将十进制小数及此期间产生的积小数部分逐次乘以需转换为数制的基数,直到积的小数部分为零为止或达到一定精度为止,并记下每一次相乘所得到的整数部分,按照从前往后的次序,将各整数部分记作k–1k-2……k-m,从而构成转换后对应的非十进制小数。【例1.4】将十进制数125.625转换成对应的二进制数因为(125)10=(1111101)2(0.625)10=(0.101)2所以(125.625)10=(1111101.101)2返回汇编语言程序设计1.3计算机中数的表示数值型数据是用二进制数来表示的,数值数据分为有符号数和无符号数,有符号数有正、负之分,通常,无符号数最高位表示数值,而有符号数最高位表示符号,规定:用“0”表示“+”号,用“1”表示“﹣”号。把这种连同数字与符号组合在一起的二进制数称为机器数,由机器数所表示的实际值称为真值。真值的符号用“+”或“﹣”表示。有符号数可以用不同的码制来表示,即:原码、反码、补码、移码等,常用的是补码。汇编语言程序设计1.3.1原码表示法设字长为n位,最高位为符号位,正数的符号用“0”表示,负数的符号用“1”表示,数值部分n-1位用二进制真值的绝对值表示,这种表示法称为原码。例如设字长为8当x=+1010时,[x]原=00001010,当x=-1010时,[x]原=10001010当x=+0.1001时,[x]原=0.1001000,当x=-0.0101时,[x]原=1.01010001.3.2补码表示法补码表示法规定:正数的补码与原码相同,负数的补码是对该数的原码除符号位外各位取反,然后末位加1。例如,设字长为8当x=+1000时,[x]补=00001000,当x=-1001时,[x]补=11110111当x=0.1011时,[x]补=0.1011000当x=-0.1110时,[x]补=1.0010000汇编语言程序设计1.3.3反码表示法反码表示法规定:正数的反码和原码相同,负数的反码是对该数的原码除符号位外各位取反,即“0”变“1”,“1”变“0”。例如设字长为8当x=+1101时,[x]反=00001101,当x=-1101时,[x]反=11110010当x=+0.1010时,[x]反=0.1010000,当x=-0.1001时,[x]反=1.01101111.3.4移码表示法移码的定义:[x]移=2n+x(2nx≥-2n)移码是在真值上加一个常数2n,在数轴上移码所表示的范围恰好对应与真值在数轴上的范围向轴的正方向移动2n个单元,而得到移码名称。同一真值的补码和移码只差最高位相反。例如x=+1000101[x]移=27+1000101=11000101x=-1000101[x]移=27-1000101=00111011x=-1000101[x]补=28-1000101=10111011汇编语言程序设计1.3.5补码的加法和减法运算1.补码加减运算的基本公式[A]补+[B]补=[A+B]补(整数mod2n+1;小数mod2)[A-B]补=[A]补+[-B]补(整数mod2n+1;小数mod2)【例1.10】设字长为8,x=0.1110,y=-0.0011,用补码的加法求x+y解:[x]补=0.1110000,[y]补=1.1101000[x]补+[y]补=0.1110000+1.1101000=0.1011000(按模2的意义,最左边的1丢掉)即x+y=+0.1011【例1.10】x=0.1001,y=-0.0111,用补码的减法求x-y解:[x]补=0.1001000,[y]补=1.1001000,[-y]补=0.0111000[x]补-[y]补=[x]补+[-y]补=0.1001000+0.0111000=-1.0000000汇编语言程序设计2.溢出判断两个符号位相同的补码相加,如果和的符号位与加数的符号相反,则表明运算结果溢出;两个符号位相反的补码相减,如果差的符号位与被减数的符号位相反,则表明运算结果溢出。这种方法需要判断操作是加法还是减法,以及运算结果与操作数的符号关系。【例1.12】机器字长为8,高位为符号位,令A=-91,B=+43,求[A-B]补解:由A=-91=-1011011,得[A]补=10100101由B=+43=+0101011,得[B]补=00101011,[-B]补=11010101[A-B]补=[A]补+[-B]补=10100101+11010101=101111010按模2n+1的意义,最左边的“1”自然丢掉,而符号位变成了0与正确的符号为1不同,因此可以判断运算出现溢出,这是因为A-B=-134超出了机器字长所能表示的范围。汇编语言程序设计1.3.6定点数和浮点数按小数点的位置是否固定,一般分为定点数和浮点数,相应地数据具有定点表示和浮点表示两种形式。1.定点数在机器中,小数点位置固定的数称为定点数,定点数根据小数点隐含固定位置不同,又分为定点小数和定点整数。一般采用定点小数表示法。汇编语言程序设计2.浮点数浮点数是指小数点位置不固定、根据需要而浮动的数,它既有整数部分又有小数部分。定点数所能表示的范围非常有限,在许多场合下是不够用的,浮点数表示法可以扩大数据的表示范围。一个数N用浮点数表示可以写成:N=M×RE其中M表示尾数,E表示指数,R表示基数。基数一般取2、8、16。一旦计算机定义好了基数值,就不能再改变了,因此,基数在浮点数中不用表示出来,是隐含的。计算机中参与运算的数超出了浮点数的表示范围时称为溢出。如果一个数的阶码大于计算机所能表示的最大阶码,则称为上溢;反之,若小于最小阶码,则称为下溢。采用浮点表示的数,在运算之前要进行对齐小数点的操作(称为对阶),才能进行加减运算。返回汇编语言程序设计1.4计算机中字符的表示计算机中字符的表示方法有多种,最常见的有ASCII码、BCD码。1.4.1ASCII码ASCII码(AmericanStandardCodeforInformationInterchange)是美国标准信息交换码,已被国际标准化组织定为国际标准,是目前最普遍使用的字符编码。ASCII码有7位码和8位码两种编码方案,常用的是7位码方案。7位ASCII码是用七位二进制数进行编码的,可共表示27=128个字符。ASCII码的每个字符用7位二进制码表示,其排列次序为b6b5b4b3b2b1b0,b6为高位,b0为低位。数0-9ASCII码的编码值为30H-39H,大写英文字母A-Z的编码值为41H-5AH,小写英文字母a-z的编码值为61H-7AH。汇编语言程序设计1.4.2BCD码BCD码(BinaryCodedDecimal)是一种二-十进制的编码,它使用4位二进制数表示一位十进制数。最常用的BCD码8421码,又叫NBCD码(NaturalBinaryCodedDecimalCode),由于4位二进制数可表示16种状态,只取前10种状态0000-1001来表示十进制数码0-9,从左到右每位二进制数的权分别是8、4、2、1,因此又叫8421码。这种编码既具有二进制形式,又具有十进制的特点,它是逢“十”进位的。BCD码十个不同的码分别是:0000、0001、0010、0011、0100、0101、0110、0111、1000和1001,这十个码分别代表十进制数码0、1、2、3、4、5、6、7、8、9。例如:十进制数1258对应的BCD码是0001001001011000;