第1章汇编语⾔知识学习基本知识
第1章汇编语⾔基础知识
本章介绍学习汇编语⾔程序设计所必须具备的基本知识,主要包括汇编语⾔的基本概念及计算机中数据的表⽰⽅法。通过本章的学习,读者应能了解汇编语⾔概念及其使⽤的进位计数制、不同进位计数制之间的转换、计算机编码以及基本数据类型。
本章内容要点:
汇编语⾔的概念
汇编语⾔的特点
不同进位计数制之间的转换
计算机编码
1.1汇编语⾔概述
1.1.1 汇编语⾔基本概念
⾃然语⾔是具有特定语⾳和语法等规范的、⽤于⼈类表达思想并实现相互交流的⼯具。⼈与⼈之间只有使⽤同⼀种语⾔才能进⾏直接交流,否则就必须通过翻译。要使计算机为⼈类服务,⼈们就必须借助某种⼯具,告诉计算机“做什么”甚⾄“怎么做”,这种⼯具就是程序设计语⾔。
程序设计语⾔通常分为三类:机器语⾔、汇编语⾔和⾼级语⾔。⽽前两种语⾔与机器密
切相关,统称为低级语⾔。
1.机器语⾔
机器语⾔是计算机第⼀代语⾔,它全部由0、1代码组成,是能够直接被机器所接受的语⾔,是最底层的计算机语⾔。
机器语⾔不容易记忆,程序编写难度⼤,调试修改繁琐,且不易移植,现在程序员很少⽤。但机器语⾔执⾏速度最快,它是⼀种⾯向机器的程序设计语⾔。
2.汇编语⾔
为了克服机器语⾔难以记忆、表达和阅读的缺点,⼈们采⽤具有⼀定含义的符号作为助忆符,⽤指令助忆符、符号地址等组成的符号指令称为汇编格式指令(或汇编指令)。例如,⽤ADD表⽰加法指令,S
UB表⽰减法指令,MOV表⽰传送指令等。汇编语⾔是汇编指令集、伪指令集和使⽤它们规则的统称。伪指令的概念将在第4章介绍。
汇编语⾔⽐机器语⾔直观,容易记忆和理解,⽤汇编语⾔编写的程序也⽐机器语⾔程序易读、易检查、易修改。对于不同的计算机,针对同⼀问题所编写的汇编语⾔源程序是互不通⽤的。
⽤汇编语⾔编写的程序执⾏效率⽐较⾼,但通⽤性与可移植性仍然⽐较差。计算机不能直接识别⽤汇编语⾔编写的程序,必须由⼀种专门翻译程序将汇编语⾔程序翻译成机器语⾔程序,计算机才能执⾏。
例如,在8086机器下,分别⽤汇编语⾔和机器语⾔计算10+20的程序代码如下:汇编语⾔机器语⾔
MOV AL,10 B0 0A
ADD AL,20 04 14
显然,使⽤汇编语⾔编写的程序要⽐机器语⾔更容易理解。
3.⾼级语⾔
机器语⾔和汇编语⾔以外的程序设计语⾔统称⾼级语⾔。其特点是更加接近⾃然语⾔和惯⽤的数学表达形式,与计算机硬件结构⽆关,因⽽便于使⽤,便于交流和推⼴。例如,可以在程序中直接使⽤表达式10+20。⽬前,常⽤的⾼级语⾔数⼗种,如C、C++、Pascal、Basic、Java等。
⾼级语⾔可分成编译型和解释型⾼级语⾔,需要分别使⽤编译程序和解释程序将源程序翻译成机器语⾔程序,才能交计算机执⾏。总之,⾼级语⾔编程效率⾼,但运⾏效率低。1.1.2 汇编语⾔的特点
汇编语⾔相对机器语⾔⽽⾔好记好⽤,但远不如⾼级语⾔⽅便、实⽤,⽽且编写同样的程序,使⽤汇编语⾔⽐使⽤⾼级语⾔花费的时间更多,调试和维护更困难,在计算机速度⼤⼤提⾼和存储器容量⼤⼤增加的今天,⾼级语⾔的使⽤更为⼴泛和普遍
(特别是编写⼤型程序)。既然如此,为什么还要使⽤汇编语⾔呢?主要有两个原因:性能和对计算机的完全控制。⼀般⽽⾔,汇编语⾔具有如下特点:
(1)执⾏速度快
⼀个汇编语⾔程序,要⽐⾼级语⾔程序执⾏得更快。程序的执⾏速度对于某些应⽤来说是⾄关重要的。对于这些应⽤,单纯使⽤⾼级语⾔往往达不到要求,单纯使⽤汇编语⾔编写
程序也并不是最好的⽅案,许多成功的⼤型应⽤程序往往使⽤的是混合编程。⾸先使⽤⾼级语⾔编写
整个程序,然后测试程序的执⾏时间,再使⽤汇编语⾔重写其中最费时间的部分。这样做的依据是在实际使⽤中,通常程序的⼤部分执⾏时间都花费在⼀⼩部分代码上。例如编写图像处理程序,就往往使⽤汇编语⾔编写软件中的关键部分。
(2)程序短⼩
⼀个汇编语⾔程序,要⽐⾼级语⾔程序更⼩。在某些情况下,设备中的嵌⼊式处理器往往只有很少的内存,使⽤汇编语⾔可能是唯⼀的⽅法。如智能卡中有CPU,但是智能卡中很难有1 MB以上的内存,也不可能有带分页的硬盘,但智能卡⼜必须执⾏复杂的加密解密计算。个⼈数字助理(PDA)和其他使⽤电池作为能源的⽆线电⼦设备,为了节省电池的电⼒,往往也只有很少的内存,它们也需要使⽤短⼩精悍⽽且具有⾼效率的机器代码。
(3)可以直接控制硬件
某些应⽤程序要求能够完全控制计算机硬件,这也必须使⽤汇编语⾔。如操作系统中的低级中断和陷阱处理程序以及许多嵌⼊式实时系统中的设备控制程序都属于这⼀类应⽤。
(4)可以⽅便地编译
编译器可以产⽣供编程者使⽤的汇编程序或者⾃⼰执⾏汇编过程。因此,为了理解编译器的⼯作原理,
必须⾸先理解汇编语⾔。
(5)辅助计算机⼯作者掌握计算机体系结构
研究汇编语⾔可以使⼈们清楚实际计算机结构。特别是对于学习计算机体系结构的学⽣,编写汇编语⾔是在结构层理解计算机的唯⼀途径。
(6)程序编制耗时,可读性差
⽤汇编语⾔编制程序⼗分费时,⽽且程序的质量直接受到程序员技术⽔平的影响,程序的可读性也很差。就如前⾯所举的加法计算的例⼦,⽤⾼级语⾔编程只需写⼀条加法表达式,简单明了,极其直观。⽽⽤汇编语⾔编程则需写出两条指令,这些指令都是些对硬件的操作,因此程序的可读性很差。
(7)程序可移植性差
由于汇编语⾔是⾯向硬件的,所以⽤汇编语⾔编制的程序可移植性很差。显⽽易见,不同的CPU都有相互独⽴的指令系统,相互间⽆任何关系,就算是使⽤同⼀系列CPU的机器,因其外围硬件可能有差别,这也会使相同的程序在不同的机器上⽆法通⽤。
不难看出,汇编语⾔存在很多的弱点,但由于它具有⼀些⾼级语⾔所不具备的突出优点,所以汇编语
⾔的应⽤范围还是很⼴的。特别是当⽤户需要研究计算机具体的⼯作原理的时候,还必须要掌握汇编语⾔。
1.2 进位计数制及其转换
计算机内部的信息分为两⼤类:控制信息和数据信息。控制信息是⼀系列的控制命令,⽤于指挥计算机如何操作;数据信息是计算机操作的对象,⼀般⼜可分为数值数据和⾮数值数据。数值数据⽤于表⽰数量的⼤⼩,它有确定的数值;⾮数值数据没有确定的数值,它主要包括字符、汉字和逻辑数据等等。
对计算机⽽⾔,不论是控制命令还是数据,它们都要⽤“0”和“1”两个基本符号即基2码来编码表⽰,这是由于以下三个原因:
(1)基2码在物理上最容易实现。例如,⽤⾼、低两个电位表⽰“1”和“0”,或⽤脉冲的有、⽆表⽰“1”和“0”,⽤脉冲的正、负极性表⽰“1”和“0”等等,可靠性都较⾼。
(2)基2码⽤来表⽰⼆进制数,其编码及加减运算规则简单。
(3)基2码的两个符号“1”和“0”正好与逻辑数据“真”与“假”相对应,为计算机实现逻辑运算带来了⽅便。
因此,不论是什么信息,在输⼊计算机内部时,都必须⽤基2码编码表⽰,以⽅便存储、传送和处理。
1.2.1 数与数制
1.数的表⽰
进位计数制是⼀种计数的⽅法。在⽇常⽣活中,⼈们使⽤各种进位计数制,如六⼗进制(1⼩时=60分,1分=60秒),⼗⼆进制(1英尺=12英⼨,1年=12⽉)等。但⼈们最熟悉和最常⽤的是⼗进制计数。按进位的原则进⾏计数叫进位计数制,简称数制。每种数制都有其基数和各数位的位权。基数是指该数制中允许选⽤的基本数码的个数。每个数码所表⽰的数值等于该数码乘以⼀个与数码所在位置有关的常数,这个常数叫位权,位权的⼤⼩是以基数为底,数码所在位置的序号为指数的整数次幂。在汇编语⾔中常⽤的进位计数制有:⼆进制、⼋进制、⼗进制和⼗六进制,其基数、数码和进位关系如表1-1所⽰。
表1-1⼏种常⽤的进位计数制的基数、数码和进位关系
在⼗进制数中,个位的位权为100,⼗位的位权为101,百位的位权为102,千位的位权为103,⽽在⼩数点后第⼀位上的位权为10?1,⼩数点后第⼆位的位权为10?2等等。因此,如果有⼗进制数123.45,
则百位上的1表⽰1个100,⼗位上的2表⽰2个10,个位上的3表⽰3个1,⼩数点后第⼀位上的4表⽰4个0.1,⼩数点后第⼆位上的5表⽰5个0.01,⽤位权表⽰成:(123.45)10 =1×102+2×101+3×100+4×10-1+5×10-2
同理,任意⼀个⼆进制数、⼋进制数和⼗六进制数也可⽤位权表⽰。例如:
(101.01)2=1×22+0×21+1×20+0×2-1+1×2-2 (125.46)8 =1×82+2×81+5×80+4×8?1+6×8?2 (AD.5F)16 =A ×161+D ×160+5×16? 1+F ×16?2
据上述概念,可推⼴出表⽰任意进制数的通式:
N =±i x n
i m
=-∑r i =±(
n i
i x =∑r i +1
m
i
i x -=-∑r i )
其中
n
i
i x
=∑r i 为整数部分,
1
m
汇编语言如何编程i
i x -=-∑r i 为⼩数部分。r 为基数,每⼀项的数字可⽤0~r -1数字
中的⼀个数字来表⽰。
2.计数制的书写规则
为了区别不同的计数制,可采⽤下列两种⽅法:
(1)在数字后⾯加写相应的英⽂字母作为标识,英⽂字母不分⼤⼩写。本书约定采⽤⼤写字母形式。如:1100011B 。B 后缀表⽰为⼆进制数(Binary )。
2357O 。O 后缀表⽰为⼋进制数(Octal )。由于英⽂字母O 容易和零误会,所以也可以⽤Q 来表⽰⼋进制。
1000D 。D 后缀表⽰为⼗进制数(Decimal )。
3AB5H 。H 后缀表⽰为⼗六进制数(Hexadecimal )。如果记数符号a ,b ,c ,d ,e ,f 打头,头部应加0,如0A8F5H ;记数符号 a ,b ,c ,d ,e ,f 不区别⼤⼩写,与ABCDEF 等效。
缺省后缀时,⼀般约定为⼗进制数。
(2)在括号外⾯加数字下标。如:(1011)2表⽰⼆进制数的1011 (2DF2)16表⽰⼗六进制数的2DF2
1.2.2 不同数制之间的转换
1.⼗进制数与⼆进制数之间的转换(1)⼗进制整数转换成⼆进制整数⽅法:除2取余法
注意:第⼀次得到的余数为⼆进制数的最低位,最后得到的余数为⼆进制数的最⾼位。例1.1 将⼗进制数97转换成⼆进制数。其过程如下:
即A 0=1 即A 1=0 即A 2=0 即A 3=0 即A 4=0 即A 5=1 即A 6=1 结束
最后结果为:(97)10 =(A 6 A 5 A 4 A 3 A 2 A 1 A 0)2=(1100001)2 (2)⼗进制⼩数转换成⼆进制⼩数⽅法:乘2取整法
注意:最后将每次得到的整数部分(必定是0或1)按先后顺序从左到右排列即得到所对应⼆进制⼩数。
例1.2 将⼗进制⼩数0.8125转换成⼆进制⼩数。其过程如下:
余数为1,余数为0,余数为0,余数为0,余数为0,余数为1,余数为1,余数为0
0.8125
× 2
1.6250 整数部分为1,即A?1=1
0.6250 余下的⼩数部分
× 2
1.2500 整数部分为1,即A?2=1
0.2500 余下的⼩数部分
× 2
0.5000 整数部分为0,即A?3=0
0.5000 余下的⼩数部分
× 2
1.0000 整数部分为1,即A?4=1
0.0000 余下的⼩数部分为0,结束
最后结果为:(0.8125)10=(0.A?1A?2A?3A?4) 2 =(0.1101)2
(3)⼀般的⼗进制数转换成⼆进制数
为了将⼀个既有整数⼜有⼩数部分的⼗进制数转换成⼆进制数,可以将其整数部分和⼩数部分分别进⾏转换,然后再组合起来。
例1.3 将(97.8125)10转换成⼆进制数。其过程如下:
(97)10=(1100001)2
(0.8125)
=(0.1101)2
10
由此可得:(97.8125)10 =(1100001.1101)2
(4)⼆进制数转换⼗进制数
⽅法:按位权展开后相加。
注意:⽤其各位所对应的系数,按“位权展开求和”的⽅法就可以得到,其基数为2。
例1.4 将(101.11)2转换成⼗进制数。其过程如下:
(101.11)2=1×22+0×21+1×20+1×2?1+1×2?2
=4+0+1+0.5+0.25
=(5.75)10
2.⼗进制与⼋进制之间的转换
(1)⼗进制整数转换成⼋进制整数
⽅法:除8取余法。
注意:采⽤基数8连续去除该⼗进制整数,直⾄商等于“0”为⽌,然后逆序排列所得到的余数。
例1.5 将⼗进制数97转换成⼋进制数。其过程如下:
8 ︳97 余数为1,即A0=1
8 ︳12 余数为4,即A1=4
8 ︳1 余数为1,即A2=1
0 余数为0,结束
最后结果为:(97)10=(A2 A1 A0) 8=(141)8
(2)⼗进制⼩数转换成⼋进制⼩数
⽅法:乘8取整法。
注意:连续⽤基数8去乘以该⼗进制⼩数,直⾄乘积的⼩数部分等于“0”,然后顺序排列每次乘积的整数部分。例1.6 将⼗进制⼩数0.6875转换成⼋进制⼩数。其过程如下:
0.6875
×8
5000 整数部分为5,即A?1=5
0.5000 余下的⼩数部分
×8
4.0000 整数部分为4,即A?2=4
0.0000 余下的⼩数部分为0,结束
最后结果为:(0.6875)10 =(0.A?1A?2)8=(0.54)8(3)⼋进制数转换成⼗进制数
⽅法:按位权展开后相加。
⽤其各位所对应的系数,按“位权展开求和”的⽅法就可以得到,其基数为8。
例1.7将(141.54)8转换为⼗进制数。其过程如下:
(141.54)8=1×82+4×81+1×80+5×8?1+4×8?2
=64+32+1+0.625+0.0625
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论