1、2022-11-2080 x86/8088宏汇编语言程序设计第一章 基础知识 汇编语言简介汇编语言简介 进位计数制及相互转换进位计数制及相互转换 带符号数的表示带符号数的表示 字符编码字符编码2022-11-2080 x86/8088宏汇编语言程序设计1.1 汇编语言简介汇编语言简介 自1946年世界上第一台电子数字计算机ENIAC(Electronic Numerical Integrator and Calculator)问世至今,虽然仅短短六十年,但计算机以惊人的速度发展。现今社会无论哪个行业、部门、地区到处可见计算机的应用。2022-11-2080 x86/8088宏汇编语言程序设计1
2、.1 汇编语言简介汇编语言简介1.1.程序设计语言的发展程序设计语言的发展 在计算机的发展过程中,程序设计语言也经历了下面三个阶段的发展。机器语言机器语言 汇编语言汇编语言 高级语言高级语言2022-11-2080 x86/8088宏汇编语言程序设计1.1.1 程序设计语言的发展程序设计语言的发展n机器语言机器语言n 计算机的中央处理器(CPU)能够识别和执行的机器指令代码。n 机器语言的指令以代码的形式表示的,这对编制程序和阅读程序都是相当困难的。n 2022-11-2080 x86/8088宏汇编语言程序设计1.1.1 程序设计语言的发展程序设计语言的发展n汇编语言汇编语言n 汇编语言是把
3、由机器指令组成的机器语言程序“符号化”,并与机器语言一一对应。n 由于不同的机器有不同的汇编语言指令系统,因此汇编语言的可移植性较差。2022-11-2080 x86/8088宏汇编语言程序设计1.1.1 程序设计语言的发展程序设计语言的发展n高级语言高级语言n 如VB、VC、DELPHI等程序设计语言。高级语言易学好用,这些语言是面向数学语言或自然语言,因此容易接受和掌握。2022-11-2080 x86/8088宏汇编语言程序设计1.1.2 汇编语言特性汇编语言特性n 由于每种计算机的设计者有不同的设计思想,不同的应用目的。因此,每种计算机有它自己的机器语言和汇编语言。为了学习、使用某种计
4、算机的汇编语言就必须首先熟悉那种计算机。这使得用汇编语言编写程序比高级语言困难得多,但由于汇编语言的特性使得我们还有意义继续学习和使用它。2022-11-2080 x86/8088宏汇编语言程序设计1.1.2 汇编语言特性汇编语言特性n 知识知识:学习和使用汇编语言可以从根本上认识、理解计算机的工作过程。有助于程序设计任意更充分地利用机器硬件的全部功能,写出更好的程序n 功能功能:现在的计算机系统中,某些功能还只能通过使用汇编语言来实现。例如机器的自检、系统的初始化等。n 效率效率:汇编语言的效率通常高于高级语言。“效率”指的是程序的目标代码所占有的空间和程序的运行速度。在需要节省内存空间和提
5、高程序运行速度的场合常常使用汇编语言。2022-11-2080 x86/8088宏汇编语言程序设计1.2 进位计数制及相互转换进位计数制及相互转换1.2.1 进位计数制进位计数制 人类在长期的生产实践中创造了我们最熟悉的十进制,而生活中还有八进制、十六进制等多种数系,还有在计算机中广泛使用的二进制数系,它们的共同之处就是都采用进位计数制。2022-11-2080 x86/8088宏汇编语言程序设计1.2.1 进位计数制进位计数制n 进位计数制采用位置表示法,即处于不同位置的同一数字符号,所表示的数值不同。如1992中两个9一个表示9百,一个表示9十。n 数制中每一固定位置对应的单位值称为“权权
6、”。如1992中1的位权为1千,其它各位的位权依次为百、十、一。2022-11-2080 x86/8088宏汇编语言程序设计1.2.1 进位计数制进位计数制 在进位计数制中,每个数位上允许的数码十有限的。每个数位上有限数码的个数叫基数基数。例如,在十进制数中有10个数码09。由于每个进位计数制的数码中必定包含0,因此有限数码中最大数码一定是基数减一。如果某数位超过最大数码便产生向高位的进位,这就是进位计数制的数。2022-11-2080 x86/8088宏汇编语言程序设计1.2.1 进位计数制进位计数制 对于任意一个进位计数制,如果用R表示基数,那么任何一个数S均可用如下多项式表示:S=knR
7、n+kn-1Rn-1+k0R0+k-1R-1+k-2R-2+k-mR-m 例如,十进制数12345.67可用下面的多项式来表示:12345.67=1104+2103+3102+4101 +5100+610-1+710-22022-11-2080 x86/8088宏汇编语言程序设计1.2.1 进位计数制进位计数制 在书写不同进位计数制数时,常常在尾部用一个字母来表示该数时什么进位计数制的数。结尾用B(2进制数)、O(8进制数)、D(10进制数)、H(16进制数)。缺省为十进制数。例如712O、9198D、10010B、BE49H等等。2022-11-2080 x86/8088宏汇编语言程序设计1
8、.2 进位计数制及相互转换进位计数制及相互转换n1.2.2 各种数制间的相互转换各种数制间的相互转换n 由于八进制数、十六进制数与二进制数之间有固定的对应关系,按每3位或4位二进制数一组就可以完成八进制数、十六进制数与二进制数之间的相互转换。n 因此,我们只需讨论十进制数与二进制数之间的相互转换。这两种数制之间的转换方法同样可以引入到十进制数与八、十六进制数之间的相互转换。2022-11-2080 x86/8088宏汇编语言程序设计1.2.2 各种数制间的相互转换各种数制间的相互转换n1.2.2.1 十进制整数转换为二进制整数n 十进制整数转换位二进制整数有两种转换方法:n (1)减权定位法n
9、 (2)除基取余法2022-11-2080 x86/8088宏汇编语言程序设计减权定位法n首先写出要转换的十进制数,其次写出所有小于此数的各位二进制权值,然后用要转换的十进制数减去与它最接近的二进制权值,如够减则减去并在相应位记以1;如不够减则在相应位记以0并跳过此位;如此不断重复,直到该数为0为止。例:将十进制数117转换为二进制数 计算过程如下:n小于117的二进制权为64 32 16 8 4 2 12022-11-2080 x86/8088宏汇编语言程序设计经过转换后,117D=1110101B2022-11-2080 x86/8088宏汇编语言程序设计除基取余法n 把要转换的十进制数的
10、整数部分不断除以2,并记下余数,直到商为0为止。例:将十进制数117转换为二进制数。计算过程如下:经过转换后,117D=1110101B2022-11-2080 x86/8088宏汇编语言程序设计1.2.2 各种数制间的相互转换各种数制间的相互转换n1.2.2.2 十进制小数转换位二进制小数n 转换方法与整数转换方面类似,也有两种方法。n(1)减权定位法n 与整数转换差异:n a、位权值不同 二进制小数部分的位权值分别位 0.5,0.25,0.125,0.0625n b、转换的小数需要根据程序要求或计算机字长来确定小数的位数。2022-11-2080 x86/8088宏汇编语言程序设计减权定位
11、法n例如把十进制小数0.8125转换成二进制数:n 0.8125-0.5=0.3125 (a-1=1)n 0.3125-0.25=0.0625 (a-2=1)n 0.0625 0.125 (a-3=0)n 0.0625-0.0625=0 (a-4=1)n 经过转换后,0.8125 D=0.1101B2022-11-2080 x86/8088宏汇编语言程序设计1.2.2.2 十进制小数转换为二进制小数n(2)乘基取整法n 十进制小数,成立基数2后,如整数部分为1则a-1=1,否则a-1=0,把剩余的小数部分重复乘以基数2,直到小数为零或达到程序要求的小数位数。n例如把十进制小数0.8125转换成
12、二进制数:n 0.8125 2=1.625 (a-1=1)n 0.625 2 =1.25 (a-2=1)n 0.25 2 =0.5 (a-3=0)n 0.5 2 =1 (a-4=1)n经过转换后,0.8125 D=0.1101Bn 2022-11-2080 x86/8088宏汇编语言程序设计1.2.2.3 二进制整数转换为十进制整数二进制整数转换为十进制整数有两种方法:(1)按权相加法 首先二进制各位的系数乘以该位的位权值,然后把各位的乘积相加即得到转换后的十进制数。例如:110110101B=1 28+127+125+124+122+120 =437D2022-11-2080 x86/808
13、8宏汇编语言程序设计1.2.2.3 二进制整数转换为十进制整数n(2)逐次乘积相加法n 从最高位开始,逐次乘2再加次高位的系数,所得结果再乘以2并与相邻位的低位相加,一直进行到加上最低位为止。例如:1101101B=((1 2+1)2+0)2+1)2+12)+0)2+1 =109D2022-11-2080 x86/8088宏汇编语言程序设计1.2.2.4 二进制小数转换为十进制小数n二进制小数转换为十进制小数有两种方法:n(1)按权相加法n 同整数的按权相加法类同。n 例如:n 0.1101B=1 2-1+12-2+12-4n =0.8125D2022-11-2080 x86/8088宏汇编语
14、言程序设计1.2.2.4 二进制小数转换为十进制小数n(2)逐次除基相加法n 从最低位开始,除以基数2,再与次低位相加,所得结果再除以2并与相邻的高位相加,如此继续到小数点后最高位除以2为止。n例如:n 0.1101B=(1/2+0)/2+1)/2+1)/2n =0.8125D2022-11-2080 x86/8088宏汇编语言程序设计1.3 带符号数的表示带符号数的表示n在现实生活中我们所使用的数有正数和负数,因此计算机中处理的数常常是带符号的数。在日常生活中我们用和表示数值的正负。在计算机中正数与负数是如何表示的呢?n在计算机中通常在数的最高位用1位二进制数位来表示数的符号,0表示正数,1
15、表示负数。2022-11-2080 x86/8088宏汇编语言程序设计1.3 带符号数的表示带符号数的表示n 在日常生活中用或表示的数叫真值真值。n 在二进制数的最高位设置符号位,把符号加以数值化,这样的数叫做机器数机器数。例如 1011 的机器数表示为11011。n 带符号的机器数可以用原码、反码和补码三种不同码制来表示。n 由于补码表示法在加减运算中的优点,现在大多数计算机都采用补码表示法。IBM PC及其系列机也是采用的补码表示法。2022-11-2080 x86/8088宏汇编语言程序设计1.3.1 原码表示法原码表示法n原码是一种比较直观的机器数表示方法。n原码用二进制数的最高位表示
16、符号位(0表示正数,1表示负数),数的有效值用二进制数绝对值表示。例如,1011的原码表示为:01011,1101的原码表示为11101。n在原码表示法中数0有两种表示方法。对应8位带符号的二进制数,数0两种表示方法为00000000和10000000,分别对应0和0。8位带符号的二进制数的原码表示中能表示的最大数为01111111,最小数为11111111,即-127127。n对原码表示的机器数进行加减运算时,需要根据指令中的加减和两数的符号,才能确定实际的加或减操作。因此,运算非常不方便。2022-11-2080 x86/8088宏汇编语言程序设计1.3.2 补码表示法补码表示法n由于原码
17、对加减运算不太方便,因此设想让符号位也作为数的一部分参与运算,使器运算操作简化,无需进行过多的判断和处理。n补码能够满足这个要求。n 1.3.2.1补码的表示规则:n 以最高位作为符号位(0表示正数,1表示负数)。n 正数的补码是其本身。n 负数的补码是对其正数“各位求反、末位加1”后形成的。n 2022-11-2080 x86/8088宏汇编语言程序设计1.3.2.2真值、原码与补码的变换n由于正数的原码和补码的机器数一样,因此我们只讨论负数的变换。n从一个负数的真值变换为补码的方法:把n位二进制数连同符号位一起,按位变反(即0到1,1到0),然后最低位加1。例如-46补码=?46补码 =0
18、0101110按位取反 11010001末位加1 110100102022-11-2080 x86/8088宏汇编语言程序设计1.3.2.2真值、原码与补码的变换n如果一个负数已是原码,那么转换为补码表示,首先保持符号位不变,然后将有效数各位变反,最低位加1即可。n例如:n 46原码 =1 0 1 0 1 1 1 0n有效数位按位取反 1 1 0 1 0 0 0 1n末位加1 1 1 0 1 0 0 1 02022-11-2080 x86/8088宏汇编语言程序设计1.3.2.2真值、原码与补码的变换n负数由真值或原码转换为补码时,有一个简便的方法:自最低位向最高位,遇到第一个1以及以前的各位
19、0均保持不变,以后各高位按位变反。若变换前已是原码,则符号位保持不变。n 例如:46二进制真值:-00101110n 46补码 =11010010n 46原码:10101110n 46补码:=110100102022-11-2080 x86/8088宏汇编语言程序设计1.3.2.2真值、原码与补码的变换n在计算机程序中有一个求补运算。n把一个已经是补码表示的数,连同符号位一起“各位求反、末位加1”的操作称作求补。n求补运算实际上是一个变号运算或求相反数运算。即X补通过求补预算得到-X补。n 例如,y补=10011010,则对y补进行求补运算n 各位求反 01100101n 末位加1 01100
20、110n得到-y补=011001102022-11-2080 x86/8088宏汇编语言程序设计1.3.2.3补码表示法中数的表示范围n在8位二进制补码表示法中,最大的数为01111111,最小的数为10000000。n因此8位二进制补码表示范围为:-128127n8位二进制补码表示法中,0只有一种表示方法:00000000,而11111111为1的补码形式。2022-11-2080 x86/8088宏汇编语言程序设计1.3.2.4补码的加减运算n如果在计算机内,参与运算的数已是补码表示,那么按下面规则进行加减运算:n x+y补=x补+y补n x-y补=x补+-y补n加法运算:参加加法运算的两
21、个数,连同符号位一起参加运算,并以2n为模便可得到运算的正确结果,且和数一定也是补码表示的。n减法运算:先对减数进行一次求补运算,然后进行加法运算,同样可以得到正确的运算结果。2022-11-2080 x86/8088宏汇编语言程序设计1.3.2.4补码的加法运算n例 X=74D,Y=-41D,求X+Y=?nX补=01001010 Y补=11010111n X补=01001010 n +Y补=11010111n 100100001 n高位1自动舍去(以2n为模)n因此,X补+Y补=00100001=33补2022-11-2080 x86/8088宏汇编语言程序设计1.3.2.4补码的减法运算n
22、例 X=74D,Y=-41D,求X-Y=?nX补=01001010 Y补=11010111-Y补=00101001 n X补=01001010 n +-Y补=00101001n 01110011 n因此,X补-Y补n =X补+-Y补n =01110011=115补2022-11-2080 x86/8088宏汇编语言程序设计1.4字符编码n计算机中通常采用的字符编码是ASCII码。nASCII码字符集采用一个字节(最高位用做奇偶校验)表示字符。n标准的ASCII码共128个字符,分为可打印ASCII码和非打印ASCII码。n可打印ASCII码:共95个。例如:n 数字09:30H39Hn 字母AZ:41H5AHn 字母az:61H7AHn 空格:20H n非打印ASCII码:用于控制性代码,共33个。例如n 回车CR:0DH,换行LF:0AH,响铃BEL:07Hn