1、第一章,汇编语言概述,1.4 习题1,1.1 汇编语言简介,1.2 计算机中的数和编码,1.3 微型计算机的工作过程,1.1.1 机器语言,1.1.2 汇编语言,1.1.3 汇编语言的组成和特征,1.1.4 编辑程序、汇编程序和连接程序,1.1 汇编语言简介,1.2 计算机中的数和编码,1.2.1 计算机中的数制,1.2.2 符号数的表示,1.2.3 二进制数的运算,1.2.4 二进制编码,1.2.5 8086/8088支持的数据类型及其内部表示,1.3 微型计算机的工作过程,1.3.1 指令与程序的执行,1.3.2 程序执行过程举例,1.1 汇编语言简介,1.1.1 机器语言 机器语言:计算
2、机的指令系统及编程的语法规则。 指令:控制计算机完成某种操作的命令。,操作码:指示计算机完成某种操作。 操作数:给出参与操作的数据值,或者指出操作对象在什么地方。 下面的二进制代码序列就是一条8086/8088的机器指令:,指令系统:构成某种计算机全部指令的集合。,1.1.2 汇编语言 汇编指令:机器指令的符号表示法。 例如:机器指令1000100111011000表示把寄存器BX的内容送到AX中。汇编指令则写成mov ax,bx.这样的写法与人类语言接近,便于阅读和记忆。 汇编语言:汇编指令、伪指令、宏指令及编程的语法规则。,如上所述:对比如下: 操作:寄存器BX的内容送到AX中 机器指令:
3、1000100111011000 汇编指令:mov ax,bx 寄存器,简单地讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。AX是其中一个寄存器的代号,BX是另一个寄存器的代号。,程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行。图1-1描述了这个工作过程。,1.1.3 汇编语言的组成和特征 汇编语言发展至今,由以下3类指令组成。 (1)汇编指令:机器码的助记符,有对应的机器码。 (2)伪指令:没有对应的机器码,由编译器执行,计算机并不执行。 (3)其他符号:如:+、-、*、/等,由编译器识别,没有对应的机器码。,汇编语言的核心是汇编指令,它决定了汇编语
4、言的特征: (1)与机器语言相比,汇编语言易于理解和记忆; (2)编写的源程序可读性较强。 (3)汇编语言能直接控制计算机的内存和外设。,1.1.4 编辑程序、汇编程序和连接程序 编辑程序:主要用于对汇编语言源程序的输入、编辑和修改。如:QE.EXE软件。 汇编程序:把汇编语言源程序翻译成机器语言程序的程序。如:MASM.EXE。,连接程序:把机器语言程序转换为可执行程序的程序。如:LINK.EXE。 汇编语言源程序:用汇编语言编写的程序。它的扩展名为:.ASM 机器语言程序:又称目的程序。它是用机器语言编写的程序。它的扩展名为:.OBJ 可执行程序;又称可执行文件。它的扩展名为:.EXE,汇
5、编语言源程序、汇编程序、目的程序、连接程序、执行文件的关系如图1-2所示。,图1-2 由汇编语言源程序到执行文件的处理过程,汇编:将汇编语言源程序翻译成机器语言程序(即目的程序)的过程。 汇编程序:将汇编语言源程序翻译成机器语言程序的程序。在此,用的是宏汇编程序:MASM.EXE。,连接:将目的程序转换成可执行程序(即可执行文件)的过程。 连接程序:将目的程序转换成可执行程序的程序。即:LINK.EXE。,1.2 计算机中的数和编码,1.2.1 计算机中的数制 1.常用进位计数制 1)十进制十进制数人们最熟悉,计算机输入输出时均采用十进制数。但机器实现起来困难。,2)二进制二进制数,每位只有两
6、个状态“0”或“1”,机器容易识别,因此在机器内部均采用二进制。但二进制数书写太长,难记忆;若用它表示指令代码机器指令,机器易识别,但人们难于识别。,3)八进制因为23=8,因而三位二进制数可用一位八进制数表示。 4)十六进制因为24=16, 因而四位二进制数可用一位十六进制数表示。,注意:在计算机应用系统中,二进制主要用于机器内部的数据处理,八进制和十六进制主要用于书写程序,十进制主要用于运算最终结果的输出。,2.数制转换 1)非十进制数转换成十进制数不同数制之间的转换方法有若干种,把非十进制数转换成十进制数采用按权展开相加法。具体步骤是:首先把非十进制数写成按权展开的多项式,然后按十进制数
7、的计数规则求和。,2)十进制数转换成二进制数对于既有整数部分又有小数部分的十进制数转换成二进制数,首先要把整数部分和小数部分分开转换,再把两者的转换结果相加。具体方法介绍如下。,(1)整数转换方法:连续除以2取余数,直到商为0,并按照和运算过程相反的顺序把各个余数排列起来,即为二进制整数。,(2)小数转换方法:连续乘2取整数,并按照和运算过程相同的顺序把各个整数排列起来,即为二进制小数。,3)二进制数转换成八进制数或十六进制数方法:以二进制数的小数点为起点,分别向左、向右,每三位(或四位)分一组。对于小数部分,最低位一组不足三位(或四位)时,必须在有效位右边补,使其足位。然后把每一组二进制数转
8、换成八进制或十六进制数,并保持原顺序。,)八进制数或十六进制数转换成二进制数方法:只要把八进制数(或十六进制数)的每一位数码分别转换成三位(或四位)二进制数,并保持原排序即可。整数最高位一组左边的,及小数最低位一组右边的,可以省略。,1.2.2 符号数的表示 1.机器数与真值真值:用符号“+”或“-”表示的数。机器数:用符号“0”表示正数,用符号“1”表示负数,数值部分用二进制表示的数。,机器数包括原码、反码和补码表示。原码主要用于表示机器数的真值,反码和补码主要用于机器数的运算。在微机中,带符号数一律以补码表示。,为了表示方便,常把8位二进制数称为字节(B),把16位二进制数称为字(W),把
9、32位二进制数称为双字(DW)。对于机器数应将其用字节、字或双字表示,因此只有8位、16位或32位机器数的最高位才是符号位。,1)原码如上所述,数值部分用该数的绝对值,符号部分,用“0”表示正数,用“1”表示负数,这样表示数的方法称带符号数的原码表示法,所表示的数称原码。,如下例:y1= +127=+1111111B y1原码=01111111By2= -127= -1111111B y2原码=11111111B,8位整数原码表示的数值范围为FFH7FH,即-127+127。16位整数原码表示的数值范围为FFFFH7FFFH,即-32767+32767。,原码表示简单易懂,而且与真值的转换方便
10、。但若是两个异号数相加,或两个同号数相减,就要做减法。为简化计算机的结构,常把减法运算转换为加法运算,因而引入了反码和补码。,2)反码正数的反码与原码相同;负数的反码为它的原码的数值部分按位取反,而符号位不变,即仍为“1”。,如下例:y1=+127=+1111111B y1反码=01111111By2=-127=-1111111B y2反码=10000000B,3)补码正数的补码与原码相同;负数的补码为它的原码的数值部分按位取反,最末位再加1,而符号位不变,即仍为“1”。,如下例:y1=+127=+1111111By1补码=01111111By2=-127=-1111111B y2补码=100
11、00001B,8位补码数表示的数值范围为:80H7FH,即-128+127。16位补码表示的数值范围为:8000H7FFFH,即-32768+32767。,2.原码、反码、补码和真值的相互转换关系前面我们已经讨论了符号数的真值表示和在机器中的表示,下面我们总结一下机器数和真值的相互转换关系。,正数的原码、反码、补码相同,即正号“0”加上绝对值的数值位表示。 负数的原码、反码、补码的相互转换关系,如图1-3所示。,图1-3 负数的机器码的相互转换关系,下面我们举例说明符号数的机器表示和真值的相互转换关系。以负数情况为例进行分析。 1)已知原码,求补码 【例1-1】 已知某数X的原码为101101
12、00B,试求X的补码。,【解】如图1-4 求X的补码.由X原 =10110100B,X为负数。求其补码表示时,符号位不变,数值部分按位取反,再在末位加1。,图1-4 求X的补码,2)已知补码,求原码(如图1-5 ) 【例1-2】 已知某数X的补码为11101110B,试求其原码。,【解】由X补=11101110B,知X为负数。求其原码表示时,符号位不变数值部分按位求反后,再在末位加1。,图1-5 已知补码,求原码,X原码=10010010B,3)求补:已知X补,求-X补的过程称为求补。所谓求补,就是将X补的所有位(包括符号位)一起逐位取反,然后在末位加1,即可得到-X的补码,亦即-X补。不管X
13、是正数还是负数,都应按此方法操作。,【例1-3】试求+97、-97的补码(如图1-6)。 【解】+97=1100001,于是+97补=01100001B,求-97补的方法是:,图1-6 求补, +97补=01100001B,-97补=10011111B4)已知补码,求对应的十进制数。 【例1-4】 已知某数X的补码为10101011B,试求其对应的十进制数。,【解】由X补=10101011B,知X为负数,故符号位不变,数值部分按“求反加1”法得到X原码:X原=11010101B,X= -1010101B,X=-85,1.2.3 二进制数的运算 1.二进制数的加减运算 计算机把机器数均当作无符号
14、数进行运算,即符号位也参与运算。运算的结果要根据运算结果的符号,运算有无进位(借位)和溢出等来判别。计算机中设置有这些标志位,标志位的值由运算结果自动设定。,1)无符号数的运算无符号数实际上是指参加运算的数均为正数,且全部数位都用于表示数值。n位无符号二进制数能表示的数值范围为0 (2n -1)。,两个无符号数相加,由于两个加数均为正数,因此其和也是正数。当和超过其位数所允许表示的数值范围时,就向更高位进位。如图1-7:,127 + 150 = 7FH + 96H,图1-7 两个无符号数相加,两个无符号数相减 ,被减数大于或等于减数,无借位,结果为正;被减数小于减数,有借位,结果为负。 如下例
15、,128-10=80H-0AH,(a)被减数大于减数,结果为正,反过来相减,即10128,运算过程如下:,(b)被减数小于减数,结果为负,图1-8 两个无符号数相减,由此可见,对无符号数进行减法运算,其结果的符号用借位标志位来判别:若CF=0,则无借位,结果一定为正;若CF=1,则有借位,结果一定为负。,2)符号数的加法运算和溢出判断 (1)补码的加减法运算由于符号数在引入补码表示法以后,补码的减法运算可以转换为加法运算来进行。其运算法则为: xy补=x补+y补 故下面只讨论补码的加法运算规则。,补码加法运算规则: 参加运算的数均为补码; 符号位和数值位一起参加运算,符号位向前的进位自然丢掉,
16、若不发生溢出,留下的结果一定是正确的; 运算结果为补码; 若运算结果为负数的补码,若未发生溢出,应转换为原码,才能知道结果的真值。,【例1-5】用8位补码完成下列计算。(1)63-127 (2)-67-15 【解】(如图1-9),(A)正数加负数,图1-9 例1-5图,(B)负数加负数,(2)补码加法运算的溢出判断 两个补码加数相加时,在什么情况下才有可能发生溢出呢?很显然,只有当它们都是正数或当它们都是负数补码相加时才有可能发生溢出。 【例1-6】两个带符号数(01000001)B(5)和(01000011)B(+67)相 加(如图1-10) :,图1-10 例1-6图,上例中是两个正数相加
17、,但相加结果却是一个负数,显然这个结果是错误的,出现这种情况的原因就在于这两个加数相加结果超过了8位二进制带符号数补码所能表示的范围: (-128+127)。,【例1-7】现在,再来看两个负数(10001000)B(-120)和(11101110)B(-18)的相加情况(如图1-11) 。,图1-11 例1-7图,由于规定用8位二进制数来表示带符号数,故忽略作为进位位的第九位。按8位二进制数来解释这两个符号数的相加,其结果为一个正数,很明显,结果是错误的。错误的原因如上所述。,以上两种情况叫做补码运算的溢出。当两个同符号的数据相加时,如果相加的结果超过了微处理器所能表示的数值范围,就将发生溢出
18、,其结果就是错误的。,因此,在微处理机中设有专门的电路用以判断运算结果是否产生溢出,并以某种标志告诉人们这次运算的结果是否存在溢出。只要溢出没有发生,运算的结果总是正确的。这个标志在8086微处理机中是用OF来标志的。若运算结果发生溢出,则置OF为1;否则OF为0。,在机器中如何设置OF标志位呢? 设符号位向进位位的进位为CY,数值部分向符号位的进位为CS,则有无溢出的判别式如下: OF=CYCS 式中,OF=1表示有溢出;OF=0表示无溢出,【例1-8】再来看105+50、10550和505,其运算结果有无溢出(如图1-12) :,(a)OF=01=1,发生正溢出,结果错误。,(b) OF=
19、10=1,发生负溢出,结果错误。,(c) CY=1,CS=1 OF=11=0,无溢出,结果正确。图1-12 例1-8图,2.二进制数的逻辑运算 1)逻辑非亦称“求反”。对二进制数进行逻辑非运算,就是按位求它的反。 2)逻辑与对两个二进制数进行逻辑与,就是按位求它们的逻辑积。又称逻辑“乘”,常用记号“”或“.”来表示。,3)逻辑加 对两个二进制数进行逻辑加,就是按位求它们的“或”,所以逻辑加又称“逻辑或”,常用记号“”或“”来表示。,注意:按位加与普通整数加法的区别是它仅按位相加,不产生进位。,1.2.4 二进制编码 在计算机中常用的字符编码有:BCD码、ASCII码、格雷码、奇偶校验码等,这些
20、编码在机器内部都是用二进制表示的,所以统称二进制编码。,1.BCD码 所谓BCD码就是由四位二进制数表示一位十进制数,十进制数只有10个基数符号,而四位二进制数有16种取值组合,这样就出现了多种编码方案。下面仅介绍8421码、余3码和格雷码。这三种编码与十进制数的对应关系如表1-1所示。,BCD码又分为:压缩和非压缩两种存储形式。 压缩的BCD码是用半个字节存放一位十进制数,即一个字节存放两位十进制数; 而非压缩的BCD码则以一个字节存放一位十进制数。 BCD码在计算机中是常用的一种编码。,1) 8421码 8421码是一种最简单的二进制自然编码,它以4位二进制数的前10个代码分别对应十进制数
21、的10个数码,10101111为无效编码。这种编码按权求和,和就是对应的十进制数。,如十进制数72的压缩BCD码用8421码可表示为:01110010;十进制数54,对应的压缩BCD码用8421码可表示为:01010100。,表 1-1 BCD码与十进制数对应关系,2)余3码 余3 码是无权码,它具有良好的代码校验性。这种编码转换成十进制数后,每个代码的值比相应的十进制数多3。 例如,表1-1中的十进制数4,它对应的二进制代码是:0111=7; 十进制数9对应的二进制代码是:1100=12,3)格雷码 格雷码也是一种无权的BCD编码形式,其特点是相邻的两位代码,仅有一个码元变化。这种编码抗干扰
22、能力强,常用于计算机控制机床的角编码器、轴位编码等。,2. ASCII码 它是计算机中的常用字符编码。 计算机中的常用字符包括: 数字符号:0、1、2、9,共10个 英文字符:大写字母:A、B、Z;小写字母:a、b、z;共52个。,常用符号:如标点符号,如$等,这类通用符号共32个;计算机控制符号:如回车符CR、换行符LF、空格符SP、响铃符等,这类专用控制符号共34个。计算机中的常用符号总共128个。,对各个字母和符号编制的代码叫字符代码。字符代码的种类繁多,目前在计算机和数字通信系统中被广泛采用的是ASCII码(American Standard Code for Information
23、Interchange,美国信息交换标准代码)其编码表如附录A所示。,目前,ASCII码有7位和8位两种字符编码形式。常用的是7位ASCII码,它包括26个大写和小写英文字母、10个数字、以及一些专用字符。7位编码的ASCII码,实际也采用8位二进制(1个字节),但最高位置0或用作校验,故最多可表示128个字符(即27=128)。, 0、 1、 、9的ASCII码值: 30H、31H、39H; A、 B、 、Z的ASCII码值: 41H、42H、5AH; a、 b、 、z的ASCII码值: 61H、62H、7AH;,其它一些专用符号的ASCII码值: 美元符:$:24H; 以下字符属于控制字符
24、: 换行符LF:0AHH; 回车符CR:0DH; 空格符SP:20H; 响铃符:07H。,3.奇偶校验码 奇偶校验码是一种可以检测一位错误的代码。它由信息位和校验位两部分组成。信息位可以是任何一种二进制代码,它代表需要传输的原始信息,占若干位。 校验位仅有一位,它可以放在信息位的前面,也可以放在信息位的后面。,其编码方式有两种: 使每一个码组中信息位和校验位的”1”的个数之和为奇数,称这种编码方式为奇校验。 使每一个码组中信息位和校验位的“1”的个数之和为偶数,称这种编码方式为偶校验。,表1-2给出了8421BCD奇偶校验码表1-2 带奇偶校验的8421BCD码,奇偶校验码主要用在通信中,发送
25、方和接收方按事先的约定,即奇校验还是偶校验进行通信。 接收方对接收到的奇偶校验码要进行检测。看每个码组中“1”的个数是否与约定相符。若不相符,则为错码。,奇偶校验只能检测一位错码,但不能测定哪一位出错,也不能自行纠正错误。若代码中同时出现多位错误,则奇偶校验码无法检测。但是,由于多位同时出错的概率要比一位出错的概率小得多,并且奇偶校验码容易实现,因而被广泛采用。,1.2.5 8086支持的数据类型及其内部表示 8086/8088机器指令中可以直接处理的数据类型只有三种:字节型、字型和双字型。8位二进制数组成一个字节型数据(B),16位二进制数即两个字节,组成一个字型数据(W),32位二进制数即
26、两个字,组成一个双字型数据(DW)。,表1-3各种数据类型的有效范围,在8086/8088汇编语言中,数据的书写方法比较丰富,不同的书写形式在计算机内部可能有相同的存储结果,而存储器中的同一个数据也可能因为使用的方法不同而有不同的外部表现形式。所以内部存储形式相同的数据之间不存在类型转换问题,而是一个使用方法的问题。,【例1-8】把下面几种形式书写的数据转换成字节型内部存储形式。 0E3H, 227, 29, 11101B 【解】经转换,内部形式完全相同,都是11100011B,【例1-9】设存储器中有一个字节型数据01100010B,试说明该数据在不同的使用环境下几种可能的含义。 【解】作为
27、字符的ASCII值用于向屏幕输出,该数表示字符b; 作为无符号数,该数表示98; 作为带符号数,该数表示+98。,1.3 微型计算机的工作过程 微型计算机的工作过程本质上就是执行程序的过程。而程序是由若干条指令组成的,这些指令我们称指令序列。所以,微机的工作过程就是执行指令序列的过程。,指令是规定计算机执行特定操作的命令。程序则是为解决某一问题而编写在一起的指令序列。目前微型计算机系统中使用着三种形式的程序:机器语言程序、汇编语言程序和高级语言程序。无论哪种语言程序,最终都必须生成机器语言程序 二进制代码的指令序列,计算机才能够识别和执行。,1.3.1 指令与程序的执行 微型计算机每执行一条指
28、令都是分成三个阶段进行:取指令、分析指令和执行指令。 取指令阶段的任务:根据程序计数器PC中的值从存储器读出现行指令,送到指令寄存器IR,然后PC自动加1,指向下一条指令的地址。,分析指令阶段的任务:将IR中的指令操作码译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。 执行指令阶段的任务:取出操作数,执行指令规定的操作,按照指令要求还可能写入操作结果。,微型机程序的执行过程,实际上就是周而复始地完成这三个阶段操作的过程,直至遇到停机指令才结束整个机器的运行,如图1-13所示。,图1-13 程序执行过程,由于程序的指令和数据都存放于内存中,所以在执行程序时,CPU必须经常和内存打交道。
29、CPU和内存的联系是通过存储器地址寄存器MAR和存储器数据寄存器MDR以及若干读/写控制信号实现的,如图1-14所示。MAR存放着访问的指令或数据的地址,MDR存放着从内存中读出的指令操作码或读出/写入的数据。,图1-14 假想模型机与程序执行实例,1.3.2 程序执行过程举例 本节以一个简单程序在图1-14所示假想模型机中的执行过程为例,看看计算机是怎样工作的。该程序实现的功能是:计算5CH+2EH,判断结果是否有溢出,如无溢出,将结果存放到内存0200H单元,供后面程序使用;如有溢出,则停机。汇编语言程序清单如下:,ORG 1000H ; 对应机器码 1:MOV A ,5CH ; B0H5
30、CH2:ADD A ,2EH ; 04H2EH,3:JO 100AH ; 70H 0AH10H4:MOV (0200H) ,A ; A2H00H02H5: HLT ; F4H,该程序由5条指令组成。每条指令对应的第一个机器码为指令操作码。案例中,指令助记符及操作码值是任意假定的,因计算机而异,紧跟其后的机器码为操作数。,该段程序在执行前,首先将该程序的机器码送到假想模型机的内存储器,从1000H开始的内存地址单元中,如图1-14所示。 因此在运行本程序前PC值应为1000H。启动程序运行后,步骤如下:,1PC内容1000H送到地址寄存器MAR; 2PC值自动加1,为取下一个字节机器码作准备;
31、3MAR中内容经地址译码器译码,找到内存1000H单元;,4CPU发读命令。 5将1000H单元内容B0H读出,送至数据寄存器MDR。 6由于B0H是操作码,故将它從MDR中经内部总线送至指令寄存器IR。,7经指令译码器ID译码,由操作控制器OC发出相应于操作码的控制信号。下面将要取操作数5CH,送至累加器A。 8将PC内容1001H送MAR。 9PC值自动加1。,10MAR中内容经地址译码器译码,找到内存1001H单元。 11CPU发读命令。 12将1001H单元内容5CH读至MDR。 13因5CH是操作数,将它经内部总线送至操作码规定好的累加器A。,到此,第1条指令“MOV A ,5CH”
32、执行完毕。其余几条指令的执行过程也类似,都是先读取、分析操作码,再根据操作码性质确定是否要读操作数及读操作数的字节数,最后执行操作码规定的操作。只是各条指令的PC内容不同,类型、性质不同,使执行的具体步骤不完全相同。,图1-14 假想模型机与程序执行实例,1.4 习题1,1-1 解释下列名词或术语: 机器语言 汇编语言 汇编程序 汇编 连接程序 目的程序 汇编语言源程序 1-2 说明二进制位(bit),字节(Byte),字(word),双字(Double word)的含义及相互之间的关系.,1-3 把下列二进制数转换成十进制数: (1)1110.01 (2)101111.101 (3)1110
33、0010 (4)1011010 1-4 把下列十进制数转换成二进制数和十六进制数: (1)92.5 (2)127.625 (3)131.375 (4)206,1-5 把下列二进制数转换成十六进制数:(1)100001011.01011 (2)11111011001.01(3)110001101.1 (4)101000001001.011,1-6 把下列十六进制数转换成二进制数:(1)2F5 (2)80E (3)4AB (4)7F01 1-7 完成下列二进制数的加减运算:(1)10101010+01011100 (2)10110011-11010101(3)11101110+01000100 (
34、4)11100101-10011011,1-8 完成下列十六进制数的加减运算:(1)3670+6DF6 (2)OFEA9-0516 (3)1A5F+8808 (4)3A5D-4051 1-9 当字长为8位时,写出下列各数的原码和补码,并用十六进制数表示:(1)18 (2) -18 (3)63 (4) -63,1-10 用补码运算完成下列算式,并指出运算结果是否产生溢出:(1)65H+71H (2)-29H-F5H (3)25H+31H (4)54H-2FH 1-11 把下列各组二进制数分别进行“与”运算,“或”运算,和“异或”运算:(1)0DAH和99H (2)0DFH和5AH (3)OFFH和95H (4)25H和38H,