1.1 汇编语言概述
1.1.1 汇编语言
按照确定的算法解决具体问题所必须的指令序列称为程序,它是由数据、指令和字符等构成的,在执行前应预先将它们以二进制代码形式存储在存储单元中。
所谓指令是指控制计算机执行某一特定操作的命令。而一台计算机所能识别的指令的全体称为指令系统,它反映计算机基本功能的强弱。机器指令是以二进制代码形式表示的,能直接为计算机识别而执行的命令,它通常由操作码和操作数两部分组成。8086/8088指令系统有约100多条基本指令。
汇编语言是一种面向机器的语言,汇编语言的指令与机器指令是一一对应的。它用符号、文字来表示指令,所以它又称符号语言。用汇编语言编写的程序是不能被计算机直接识别和执行的(如同用高级语言编写的程序),它需要翻译成目标程序后方可执行,这个过程我们称为汇编。汇编语言虽然没有高级语言在使用上简单方便,但因它与机器语言是一一对应的,故可充分利用计算机硬件系统的特性,提高编程技巧和编程质量。另外,利用汇编语言处理I/O设备是汇编语言的独到之处,所以它是无法为其他语言所取代的。
汇编程序的类型有:自汇编程序、交叉汇编程序、微汇编程序、浮动汇编程序和宏汇编程序。
汇编语言(ASM)虽然较机器语言在阅读、记忆及编写方面都前进了一大步,但对描述任务、编程设计仍感不便,于是产生了具有机器语言优点,而又能较好地面向问题的语言,即宏汇编语言(MASM)。
宏汇编语言不仅包含一般汇编语言的功能,而且用了高级语言使用的数据结构,是一种接近高级语言的汇编语言。例如它提供了记录、结构和字符串操作;具有宏处理、条件汇编及磁盘操作系统DOS功能调用等多种功能;程序的开发以及调试手段也比较完善,因而宏汇编语言是一种更高级的汇编语言。
1.1.2 汇编语言的特点
由于汇编语言使用指令助记符和符号地址,所以他要比机器语言容易掌握得多。与高级语言相比,汇编语言具有以下特点:
(1)汇编语言与及其关系密切
(2)汇编语言程序效率高
(3)编写汇编语言源程序繁琐
(4)汇编语言程序调试困难
1.1.3 汇编语言的主要应用场合:
(1)程序执行占用较短的时间,或者占用较小存储容量的场合。
(2)程序与计算机硬件密切相关,程序直接控制硬件的场合。
(3)需提高大型软件性能的场合。
(4)没有合适的高级语言的场合。
1.2数据表示和类型
1.2.1 进位计数制以及不同计数制间的相互的转换
在日常生活中我们所用的是十进制数,但在计算机中我们用的是二进制数,作为汇编语言程序设计对二进制数与十进制数的转换是必不可少的。
1. 各种进位计数制
表1.1 二、八、十和十六进制数码的对照关系表
十进制 |
二进制 |
八进制 |
十六进制 |
0 |
0 |
0 |
0 |
1 |
01 |
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 |
16 |
10000 |
20 |
10 |
(1)十进制数
十进制数就是我们在日常生活中所用的数,它共有0,1,2,3,4,5,6,7,8,9这十个数码,它的计数方法是“逢十进一”。对于十进制数的运算大家应该都知道,这里就不多说了。
(2)二进制数
二进制数是最简单的进位计数制,它只有0,1二个数码,计数方法是“逢二进一”。二进制数的运算十分简单,加法是“逢二进一”,减法是“借一当二”。例如“11 10=101;101-10=11”至于乘法和除法和我们日常相似,只不过不是“逢十进一”而是“逢二进一”罢了。
(3)八进制数和十六进制数
很显然八进制数是0到7这八个数码组成,且是“逢八进一”,而十六进制数是由0到9和A,B,C,D,E和F(英语大写字母分别代表10到15)这十六个数码组成的,它的进位方式是“逢十六进一”。在下面我将给出二,八,十和十六进制数码的对照关系表。如表1.1所示:
2.数制的转换
(1)将十进制数转换成二进制数
例 试将十进制数 125.6875转换成二进制数。
①整数的转换:除2取余
先将125除以2在右边记下余数,然后以此类推,直到最后的差为0,最后我们将余数倒着排列即得结果。
②小数的转换:乘2取整
小数的转换正好与整数的转换相反,先将0.6875乘以2得结果1.3750,则在右边记下整数位1,再将去整数位后的0.375乘以2记下结果,依此类推,直到最后小数部分为0或结果以达到精度要求。
(2)将十进制数转换成八/十六进制数
方法如上,只不过乘/除数为8或16。
(3)二,八/十六进制数转换成十进制数
转换方法是利用数制的一般表达式写成相应的幂运算形式,然后求和得到。
例:572.34(8)=5*82 7*8 2 3*8-1 4*8-2=378.4375
(4)二进制数与八进制数的转换
因为23=8,所以二进制数转换成八进制数只需将二进制数从小数点开始每3位转成一位八进制数(整数由左向右,小数相反)。 例如:101 111 010 . 011 100(2) =572.34(8)
八进制数转换成二进制数只需将每一位八进制数用三位二进制数表示,小数点位置不变。 例如:175.54(8)=001 111 101.101 100B=1111101.1011B。
至于十六进制数与二进制数的转换只需将每隔3位改为每隔4位即可。
1.2.2 原码,补码和反码
在计算机中参加运算的数有正负之分,通常在计算机中我们用X=X0X1X2``````XN-1来表示一个二进制数,并规定当X0=0时X为正数,X0=1时X为负数.在计算机中这种表示法有原码,补码和反码三种。
1. 原码
原码的定义为:
所能表示数的范围为:
例: 根据[X](原)所能表示的整数范围公式,我们可以计算出当n=8时,原码表示范围是[-127,127]。原码的表示法简单易懂,但是它最大的缺点是运算复杂。所以人们引进了补码。
2. 补码
补码的定义为:
所能表示数的范围为:
例: 根据[X](补)所能表示的整数范围公式我们可以计算出当n=8时补码表示范围是[-128,127];根据补码的定义公式我们可以计算出任何一个数的补码,如X=-2FH根据公式[X](补)=100H-2FH=D1H。
用补码进行加减运算是很简单的,公式为[X Y]补=[X]补 [Y]补;[X-Y]补=[X]补 [-Y]补。加法公式是非常简单的,但减法中我们只知道[Y]补而不知道[-Y]补,利用一个口诀就可解决这个问题,口诀是"将[Y]补连同符号位一起按位求反后末为加一可得[-Y]补"。我们现在虽然有了公式和口诀,但是还有符号位的问题没有解决,而另一个口诀可以解决这个问题。口诀是"符号位参加运算,符号位相加,若有进位,则进位舍去"。如:63H-72H=63H 8EH=0F1H(用十六进制时最高位为字母时前加0)。
注意:运算有时会产生溢出,如57 81>127。当我们用N=8的补码运算就会溢出,因为当字长N=8时补码的表示范围是 [-128,127]。
3. 反码
反码的定义为:
所能表示数的范围为:
例: 根据[X](反)所能表示的整数范围公式,我们可以计算出当n=8时反码表示范围是 [-127,127]。
1.2.3 数的定点和浮点表示法
在计算机中,针对小数点的处理有两种方法:定点表示法浮点表示法。
1. 定点表示法
定点表示法就是小数点固定在某个位置上。在定点计算机中,为了简单通常将小数点定在最高位(即纯小数)或将小数点定在最低位(即整数)。
2. 浮点表示法
浮点表示法就是小数点的位置并不固。浮点数在计算机中通常的表示形式为"浮点数=2的正/负阶码次方*尾数"其中阶码是个正整数,尾数是个小数,我们规定尾数的区间为[0.5,1],如果尾数不在此区间,那我们可通过调节阶码来满足区间,此方法称为规格化。
1.2.4 BCD码和字符编码
在日常生活中人们用的是十进制数,而机器又只能处理二进制数,因此我们引进了BCD码。BCD码是用四位的二进制数来表示一位十进制数(可参照下表)。例子:我现在将8351表示成BCD码为1000 0011 0101 0001。当用一个字节来表示十进制数时,称为非压缩的BCD码。例如6可表示为00000110。当用一个字节表示二个十进制数时,称为压缩的BCD码。例如79可表示为01111001。
除了数值数据外,计算机还可处理人们常用的符号,如字母,标点符号等。在计算机中这些符号是用ASCII码来表示的。ASCII码用一个字节的二进制数来表示一个字符,但实际只用了七位,最高位被用来做奇偶校验位。这一位置1或0,使字节含1的个数为奇数(或偶数)称为奇校验或偶校验。如表1.2十进制数与BCD码对换关系表。
表1.2 十进制数与BCD码对换关系表
十进制数 |
BCD码 |
十进制数 |
BCD码 |
0 |
0000 |
5 |
0101 |
1 |
0001 |
6 |
0110 |
2 |
0010 |
7 |
0111 |
3 |
0011 |
8 |
1000 |
4 |
0100 |
9 |
1001 |