《汇编语言程序设计第一章.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计第一章.ppt(77页珍藏版)》请在三一办公上搜索。
1、,汇编语言程序设计-朱耀庭,南开大学 朱耀庭,第一章 预备知识,1.3 计算机中数的表示,1.2 思维方式的转变,1.1 计算机语言,南开大学 朱耀庭,1.1 计算机语言,面向机器的语言,非面向机器的计算机语言,1.1.1,学习汇编语言的意义,南开大学 朱耀庭,1.1.1 面向机器的语言,南开大学 朱耀庭,1.机器语言,机器语言程序由机器指令构成,这些机器指令按照执行顺序依次排列,运行时依次执行完成某个特定的计算或任务。机器指令是CPU能直接识别并执行的指令。机器指令由物理部件的若干位二进制0、1状态体现,机器指令程序运行前需要存储到内存,正确的机器指令一旦送入CPU被译码后就将变成动作予以执
2、行。,南开大学 朱耀庭,1.机器语言,如图1-1所示,机器指令面向机器,因机器而异。不同的机器具有不同的机器指令,因而具有不同的机器语言。,图1-1 使用不同机器语言的计算机,动画演示,南开大学 朱耀庭,1.机器语言,机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。由于机器指令由物理部件的若干位二进制0、1状态体现,因此机器指令的最直接的记忆形式就是表示这一指令状态的二进制数,这个二进制数就称作该机器指令的二进制代码指令。由于二进制数和八进制数,以及十六进制数的特殊关系,因此该二进制代码指令对应的八进制
3、数和十六进制数分别称作该机器指令的八进制或十六进制代码指令。,南开大学 朱耀庭,1.机器语言,例如:B233H就是一条80X86的十六进制机器代码指令,这条指令的功能是将33H这个十六进制数送DL寄存器。该机器指令的二进制代码指令是:,指令长度16位。显然二进制代码指令与其状态对应直观,但记忆困难;而十六进制代码指令则方便记忆。因此80X86的代码指令通常都用十六进制表示。用机器指令所写的程序称作机器指令程序,机器指令程序也指用代码指令所写的程序。机器指令程序遵循冯诺依曼原理:用二进制表示数,程序与数据都存储在同样的存储器,程序指令一般顺序存取顺序执行。,南开大学 朱耀庭,1.机器语言,计算机
4、出现初期只有一种机器语言,程序员只能用代码指令编写程序,即机器语言程序。用机器语言编写程序是相当艰苦的工作,必须由经过严格训练的专业技术人员承担,这是早期计算机之所以不能够广泛应用的最大障碍之一。一方面机器语言十分重要,必须了解;另一方面机器代码指令程序使用又十分困难;因此唯一能够替代机器语言的汇编语言就成为了计算机科技人员必须掌握的一种计算机语言。,南开大学 朱耀庭,2.汇编语言,虽然用机器语言编写程序有许多不便,但程序执行效率高。所以,在保留“程序执行效率高”的前提下,人们开始着手研究一种能大大改善程序可读性的编程方法。即选用能反映机器指令功能的单词或词组来代替该机器指令的操作码,选用相应
5、的符号表示CPU内部资源和内存等操作数,这就是汇编指令。例如,汇编指令:MOV AL,BL其对应的二进制指令为:,十六进制代码指令则为D888H,可见记忆机器指令相当困难。,南开大学 朱耀庭,2.汇编语言,而汇编指令中MOV源于Move,表示传送指令;AL,BL分别表示80X86的AL和BL寄存器。指令功能是将BL寄存器中的内容传送到AL寄存器。如此,令人难懂的二进制机器代码指令或十六进制机器代码指令就可以用通俗易懂的、具有一定含义的符号指令来表示了,这就是汇编指令的原意。我们称这些具有一定含义的符号,例如上述指令中的MOV,为助记符,用助记符、符号地址等组成的符号指令称为汇编格式指令或汇编指
6、令。,南开大学 朱耀庭,2.汇编语言,因此,用助记符表示的机器指令称作汇编指令,用汇编指令编写的程序称作汇编指令程序。但汇编指令最终必须翻译成机器指令才能够在机器上执行。汇编语言是汇编指令集、伪指令集及其使用规则的统称。能够一对一地翻译成机器指令的这种用助记符表示的机器指令称作汇编指令。伪指令则是出现在汇编语言程序中的一些辅助性的说明,它不对应具体的机器指令,而是程序设计者与汇编过程中的翻译程序(即汇编)、连接程序,以及执行时如何装入的一种约定。有关内容详见5.1节。,南开大学 朱耀庭,2.汇编语言,用汇编语言编写的程序称作汇编语言程序,或汇编语言源程序,在本教材中也简称为源程序。汇编语言程序
7、较之机器指令程序容易理解和维护。汇编语言源程序是一个文本文件,它必须经过翻译才能够变成可执行的机器语言程序,这个翻译过程称作汇编。汇编的核心过程是将汇编指令逐条翻译成机器指令,这正是汇编语言中“汇编”一词的含义。,南开大学 朱耀庭,2.汇编语言,80X86汇编语言源程序扩展名为.ASM,经过汇编以后生成的浮动地址二进制文件扩展名为.OBJ,.OBJ文件需要经过连接才能够生成可执行文件.EXE。.EXE是一个可以由操作系统执行的机器指令程序。图1-2给出了一个简单汇编语言程序与其机器指令程序之间的对应关系。,图1-2 汇编程序翻译过程示意图,动画演示,南开大学 朱耀庭,2.汇编语言,尽管不同的C
8、PU有不同的汇编语言,但不同种类的汇编语言都有其共同规律。因此学会一种机器的汇编语言,再学习其他汇编语言就相对容易多了。例1-1 汇编程序和对应的机器指令程序 在Debug下输出字符3的汇编语言程序如下:MOV DL,33 MOV AH,2 INT 21 INT 20其对应的十六进制机器代码指令程序如下:B233H B402H CD21H CD20H,南开大学 朱耀庭,2.汇编语言,例1-1是由4条汇编指令构成的80X86的汇编语言程序,它可以在Debug调试环境下汇编运行,运行结果是在显示器上输出一个ASCII码字符3。这里3不能在Debug下直接输入,必须用33H表示,又由于Debug下只
9、能够使用16进制数,而且不必写最后的H,因此写作33。其他数字含义相同。机器语言是计算机唯一能接受和执行的语言。一条指令规定了由软件工作者要求计算机执行的一个基本动作。计算机CPU所能懂得的指令的全体,称作该计算机的指令系统。不同型号或系列的CPU,其指令系统不同。因为机器语言直接依赖CPU,所以可移植性差、重用性差。,南开大学 朱耀庭,3.机器语言与汇编语言,计算机的指令系统有定长的指令系统和不定长的指令系统,80X86是不定长的指令系统,一条机器指令依功能不同可能是1字节至6字节长度不等。机器指令的所有字节,按二进制位分成若干字段,不同字段代表不同的含义,但必须有操作码字段和操作数字段。操
10、作码表明做什么,操作数表明如何做。操作数依功能不同,可能没有,也可能有一个或多个。,南开大学 朱耀庭,3.机器语言与汇编语言,二进制代码指令是机器指令状态的直接描述,该状态进入CPU的译码器后,经译码变成控制器的动作,通过各种逻辑电路,在时钟脉冲给出的时序信号和逻辑门的作用下完成指令所规定的操作。即二进制代码指令或机器指令完全由计算机CPU的逻辑电路直接识别,不需要任何翻译程序。最早的程序设计都采用机器语言来编写。程序设计者必须将求解的问题细化到每一条指令,其难度可想而知。程序员既要驾驭程序设计的全局又要深入每一个局部,乃至程序实现的每一个细节,即使智力超群的程序员也常常会顾此失彼,屡出差错,
11、所编写的程序必须经过严格测试,因此开发周期长。,南开大学 朱耀庭,3.机器语言与汇编语言,ASCII码的出现为改善机器指令的可读性和方便记忆提供了可能。既然ASCII码可以表示字符,字符又可以组成单词和短语,于是用帮助记忆的符号表示的机器指令,即汇编指令和汇编语言出现了。汇编语言为机器语言向算法语言,即高级语言靠拢迈出了一大步。但它离高级语言还太远,以致于程序员还不能从分解算法的数据、确定运算和控制的指令等等繁杂的细化中解脱出来。而伪指令和宏的定义则将汇编语言向算法语言又靠拢了一步,这就是宏汇编。汇编语言与机器语言相比有很多优越性,如编写容易、修改方便、阅读简单、程序清楚等。但在计算机语言系统
12、中,汇编语言仍然被列入“低级语言”的范畴,因为它本质是机器语言,是属于面向机器的语言。,南开大学 朱耀庭,1.1.2 非面向机器的计算机语言,南开大学 朱耀庭,1.编译型计算机语言,非面向机器的语言按照翻译程序的类型分成编译型语言和解释型语言,多数计算机高级语言是编译型语言。例如,算法语言ALGOL、公式翻译语言FORTRAN、商用语言COBOL等等;各种C语言,如Microsoft C、Turbo C、Visual C+等都是编译型语言。这些计算机语言,均采用类似于英语的语法结构,其源程序与汇编语言一样也是文本文件。用这些语言所写的程序,它所描述的算法和问题要比汇编语言直观明了。但其翻译成机
13、器语言的过程远远比汇编的过程复杂。通常要经过预处理和多次扫描才能够变成机器语言,这个过程称作编译。编译后的浮动地址二进制文件通常也要经过连接,才能够生成可执行文件。,南开大学 朱耀庭,1.编译型计算机语言,以Turbo C为例,不同CPU的计算机如果要执行C语言程序,只要运用不同的C语言编译程序就可以了。图1-3表明了C语言的可移植性。其他非面向机器的语言与C语言具有同样的规律,具有可移植性,而低级语言则不具有可移植性。,图1-3 C语言的可移植性,动画演示,南开大学 朱耀庭,2.解释型计算机语言,早期的Apple II计算机上的BASIC语言、IBM PC上的ROM BASIC语言都是解释型
14、的计算机语言。它与编译型计算机语言的区别在于程序最终执行时是否需要翻译程序在场。编译型语言经编译后变成可执行文件,执行时不需要编译程序在场;而解释型计算机语言需要翻译程序在场,边解释边执行。从这一特性上来说,任何具备这一特性的计算机语言都是解释型语言。例如现在广泛使用的许多脚本语言(如Perl、JAVA Script语言等)都可以认为是解释型的语言。无论是汇编语言、解释型语言,还是编译型语言,它们都有一个共同点,那就是它们的源程序文件都是文本文件,都需要翻译后才能够在机器上执行。,南开大学 朱耀庭,1.1.3 学习汇编语言的意义,在现代,研究物质不研究基本粒子不行,研究生物不研究DNA不行,研
15、究信息科学不研究bit流不行。同样,研究计算机不研究指令系统及其应用也不行。因为汇编语言是面向机器的语言,通过汇编语言的学习可以更深刻地理解计算机软件系统底层对硬件的控制、操作的方法和手段,有利于今后理解和学习操作系统原理。通过80X86汇编语言的学习可以深入了解80X86微处理器的内部结构,熟悉端口和外部设备的关系,为掌握设备驱动程序的原理打下基础,为后PC阶段掌握嵌入式操作系统打下基础。,南开大学 朱耀庭,1.1.3 学习汇编语言的意义,通过汇编语言的学习可以深入了解80X86微处理器的指令体系,牢牢掌握面向机器语言程序设计的基本步骤和方法,为开发高质量、高效率的程序打下坚实基础。这种训练
16、可以使掌握了汇编语言程序设计方法的每一个同学能够更容易地学习和掌握其他计算机语言。汇编语言的学习有助于读者理解bit流在网络、通信、图像、视频、音频中的组织形式等。学习好汇编语言有助于任何一个计算机工作者从信息编码的底层工作做起。世界已经进入数字化信息时代。在这个时代,一切媒体和信号最终都要化作0和1的bit流来处理,围绕着bit流的存储、编码、压缩、传输、再现等带来了各个领域的极为广泛的研究课题。没有任何一种计算机语言能够超过汇编语言帮助你更深刻地了解bit和BYTE在数字化领域的作用。,南开大学 朱耀庭,1.2 思维方式的转变,从设计师到设计师兼建筑师,冯诺依曼计算机的设计思想,1.2.1
17、,汇编语言的主要特性,从高级语言的局限性看汇编语言,南开大学 朱耀庭,1.2.1 从设计师到设计师兼建筑师,如果将C语言程序设计者比作设计师,那么汇编语言程序设计者应该是设计师兼建筑师的角色。在C语言中大量的底层实现是由编译器程序掌控和实现的。例如堆栈操作、变量和函数地址分配、函数的调用、各种类型变量的算术运算和赋值等等,这些统统由编译器去处理。作为C语言的程序员主要职责是关注整个程序的算法、结构和功能实现。汇编语言程序员则需要以机器为中心的思维方式。程序员只能根据实际机器的相应指令去思考问题,这就要求程序员必须掌控程序内的各种细枝末节。例如,建筑一座大楼,从设计到建成有两种方法完成。一种方法
18、是交给建筑设计院设计,然后再由其他建筑公司完成。另外一种方法是从头到尾全部交给一个既具有设计资格又具有建筑资格的单位完成。C语言程序开发过程类似,南开大学 朱耀庭,1.2.1 从设计师到设计师兼建筑师,第一种方法,C程序员扮演建筑设计师角色,他仅仅负责设计;至于施工前的一切准备工作则完全由编译程序负责。汇编语言程序开发过程类似第二种方法,汇编语言程序员既熟悉设计,也熟悉施工,他所扮演的既是设计师也是建筑师的角色。他不但出设计图纸,而且详细到原材料采购与施工步骤;至于交给汇编程序的任务仅仅是开列采购单和施工单等施工前的准备。无论C语言还是汇编语言经过编译和汇编后都生成供连接程序使用的中间文件,即
19、.OBJ文件。所不同的是后者在设计过程中充分考虑了施工过程的细节,因而最终的执行效效率要更高些;而前者由于设计与施工分离,设计过程变得容易,但最终的执行效率差些。可见连接程序所扮演的角色是施工前的调度和组织者的角色,而执行程序.EXE才是建筑现场的所有工作人员。,南开大学 朱耀庭,1.2.2 冯诺依曼计算机的设计思想,在学习使用计算机时,都会用到个人计算机(Personal Computer,PC)。编写高级语言程序时,即使对计算机体系结构了解不深入,也能够编写出质量较高的程序。可是,当用汇编语言编写程序时,实际上就是在用计算机本身的逻辑,或者说是计算机本身的思维方式,去解决实际问题。因此就要
20、求汇编语言程序设计者,对计算机的体系结构在逻辑层面上要有比较深入的了解,即按照冯诺依曼计算机体系结构的本质去了解所使用的计算机的CPU及其内存。PC是典型的冯诺依曼计算机体系结构。20世纪30年代中期,德国科学家冯诺依曼大胆地提出了抛弃十进制,采用二进制作为数字计算机的数制基础;同时,他还指出要预先编制计算程序,然后由计算机按照人们事前制定的计算顺序来执行数值计算工作。这就是著名的冯诺依曼理论。,南开大学 朱耀庭,1.2.2 冯诺依曼计算机的设计思想,冯诺依曼理论的要点是:数字计算机采用二进制计数制;计算机应该按照程序顺序执行,而且程序中代码与数据存放在相同的内存空间中。根据冯诺依曼体系结构构
21、成的计算机,必须具有如下功能:把需要的程序和数据送至计算机中;计算机必须具有长期记忆程序、数据、中间结果及最终运算结果的能力;应该具备完成各种算术、逻辑运算和数据传送等数据加工处理的能力;能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作;能够按照要求将处理结果输出给用户。为了完成上述功能,计算机必须具备5大基本组成部件。这包括:输入数据和程序的输入设备,记忆程序和数据的存储器,完成数据加工处理的运算器,控制程序执行的指令译码器和控制器,输出处理结果的输出设备。,南开大学 朱耀庭,1.2.2 冯诺依曼计算机的设计思想,通过例1-2可以理解冯诺依曼核心思想之一程序和数据存储在同样的存
22、储空间。例1-2 用Debug看数据与程序存储在同样的内存空间在Debug下,写一个极其简单的80X86汇编程序,让程序执行时输出一个字符3。在Window下,选择【开始】|【运行】命令,弹出【运行】对话框,在【打开】下拉列表框中输入Debug,单击【确定】按钮,进入DOS环境下的Debug窗口。这时可以按组合键AltEnter使Debug屏幕最大化。在Debug的提示符-下,按以下步骤进行操作。,南开大学 朱耀庭,1.2.2 冯诺依曼计算机的设计思想,-a0C3C:0100 db b20C3C:0101 db 330C3C:0102 db b40C3C:0103 db 020C3C:0104
23、 db cd0C3C:0105 db 210C3C:0106 db cd0C3C:0107 db 200C3C:0108-g3Program terminated normally-q这里首先用Debug的A命令,逐个将数据送入0C3C:0100起始的8个单元。它们是:B233H,B402H,CD21H和CD20H,这是4个4位十六进制数据。可见4个数据存放 在0C3C:0100起始的8个单元中,南开大学 朱耀庭,1.2.2 冯诺依曼计算机的设计思想,后面的g是Debug的执行命令,起始执行地址是0C3C:0100,将此起始地址开始的内存中的内容取出送CPU译码并且执行(这时是将内存中存放的数
24、据作为指令来使用),执行完一条指令,顺序去取下一条指令执行,直到遇到CD20H指令结束程序。可见内存中的数据究竟用作指令还是数据,关键在于如何使用它。如果将其用作数据,可以代表不同类型的数据,详见1.3节;如果像本例一样拿来作为指令,即由CPU解释执行,那它就会指挥计算机执行指令。这就是对冯诺依曼理论中,数据与程序存储在同样的存储空间中的最好理解。,南开大学 朱耀庭,1.2.2 冯诺依曼计算机的设计思想,当然并不是说所有的数据都可以当作正确的程序执行,只有那些完全正确代表程序指令的数据,才能够作为程序正确执行,并且完成其所担负的任务。如果一定要将任何顺序存放的一组数据当作程序执行,后果将不可预
25、料。这里Debug的g命令隐含着从当前段地址0C3C的位移0100的地方开始执行,取一条指令,执行一条指令,直到CD20为止。这又是对冯诺依曼的计算机应该按照程序顺序执行的一种最直观的解释:即一般情况下顺序存储、顺序执行,除非遇到停机指令或转移指令才停机或改变执行顺序。,南开大学 朱耀庭,从高级语言的局限性看汇编语言,通常讲,高级语言比汇编语言应用起来更灵活。因为高级语言不需要知道CPU能支持哪些指令,即使将来编译后执行程序的CPU不支持某种特殊运算,我们也不需要关心,因为编译器会根据执行平台自动编译成相应的代码。这就是说对于一个高级语言程序员来说,应用该高级语言允许的任何数据类型及运算方法都
26、是可以的,无需考虑如何执行。例如8051单片机并不支持浮点运算指令,但使用针对8051的C编译器开发程序时,编译器则会自动用8051现有的指令去仿真C程序中的浮点运算。这种方便性同时也暴露出了高级语言的局限性,或者说是弱点,即编译产生的机器指令程序代码很长。尽管现代编译器技术已经有了长足的进步,不少C程序编译的代码已经接近汇编代码,但这仅仅就个别程序而言。通常情况下,无论从代码长度和执行效率讲,同样完成一个功能,使用高级语言开发的程序和使用汇编语言直接开发的程序相比,其效率是低下的。因此,在对程序的空间及时间特性有较高要求的场合,用高级语言是难以胜任的,而用汇编语言直接操作CPU的寄存器、端口
27、及内存所开发出的程序则具有执行代码量少,执行效率高等特点。即能够透明地、直接地操作寄存器及CPU的相应机器指令正是高级语言无法办到的事情,而汇编语言在这种场合恰恰能大有用武之地,这也正是汇编语言与高级语言比较明显的特征区别。由此可见,高级语言与汇编语言相比,最终生成的机器指令程序,具有代码长、占用存储空间大、执行效率低等弱点。,南开大学 朱耀庭,从高级语言的局限性看汇编语言,例1-3 Turbo C生成的代码与汇编对比下面是用C语言写的一个输出“Hello,World!”的小程序。#include void main()printf(Hello,World!$);由于C语言程序在编译过程中通常
28、要生成汇编语言的中间程序,所以在Turbo C 3.0下用以下命令行编译生成汇编语言中间程序。编译过程如下:tcc-c-mt-S hello.cTurbo C+Version 3.00 Copyright(c)1992 Borland Internationalhello.c:Available memory 4148512,南开大学 朱耀庭,从高级语言的局限性看汇编语言,上述编译所生成的汇编语言程序清单长达3页,为节省篇幅,这里不再列出。这一清单还没有包括将来连接汇编库时调用printf()函数所需要的代码,可见如此小的C程序所生成的汇编程序就这样臃肿。而如果用汇编语言直接编写同样功能的程序
29、,其汇编程序如下:.MODEL SMALL.DATA S DB“Hello$”.CODE GO:MOV AX,DATA MOV DS,AX MOV DX,OFFSET S MOV AH,9 INT 21H MOV AH,4CH INT 21H END GO,南开大学 朱耀庭,从高级语言的局限性看汇编语言,从例1-3可以看出,完成同样功能的汇编程序远比C语言程序来的精炼。当然汇编语言程序写法并不唯一,但这足可以看出用C语言生成的汇编代码要远远长于直接用汇编语言写的代码,更不用说二者生成的机器指令程序了。由此不难看出,与汇编语言相比,高级语言解决同样的问题,最终的机器代码长,占用存储空间大,执行效
30、率低。但用高级语言开发程序相对容易,特别是开发大型程序,因此高级语言和汇编语言各自具有各自的优点和特色,也各自有各自的缺点和薄弱环节。为了解决汇编语言程序开发的难度,在宏汇编和WIN32汇编中,可以使用宏,大量宏的应用可以降低用汇编语言开发程序的难度。,南开大学 朱耀庭,1.2.4 汇编语言的主要特性,南开大学 朱耀庭,1.3 计算机中数的表示,南开大学 朱耀庭,1.3.1 数的表示,计算机中采用二进制计数法,这是因为从容易实现的角度讲,两种稳定状态的物理器件容易实现。从节省元器件角度讲,理论上已经证明e(2.71.)进制计数法最节省元器件,而2在整数中次于3最接近于e,因此计算机中从数据到符
31、号、指令、地址、内容都是用二进制数来表示的。,南开大学 朱耀庭,1.十进制计数法,十进制计数法归纳起来有以下几点:(1)以十为基数,有0,1,2,3,4,5,6,7,8,9十个数码。(2)逢十进一。(3)位置原理。位置原理也就是权重,第K位的权重为10K。(4)任意一个十进制数的数值部分N可以表示为:其中,l,r是整数,ak是满足0 ak 9的整数。例如:123.4=110221013100410-1。在本例中,最左边一位的权重是102,最右边一位的权重是10-1。,南开大学 朱耀庭,2.二进制计数法,同十进制计数法的原理一样,二进制计数法归纳起来有以下几点:(1)以二为基数,有0,1两个数码
32、。(2)逢二进一。(3)位置原理,K位的权重为2K。例如 在本例中,最左边一位的权重是23,最右边一位的权重是20。为了与十进制计数法相区别,在80X86汇编语言中,在二进制数后写一个B(Binary的首字母),表示前面的数是二进制数。,南开大学 朱耀庭,3.八进制计数法,计算机内使用二进制数,但由于二进制数书写起来冗长,所以在许多情况下还是使用八进制或十六进制计数法,因为八进制和十六进制与二进制间的转化十分方便。八进制计数法归纳起来有以下几点:(1)以八为基数,有0,1,2,3,4,5,6,7八个数码。(2)逢八进一。(3)位置原理,K位的权重为8K。例如:这里3721Q中的Q表示前面的数为
33、八进制数,在80X86汇编语言中八进制数末尾用Q表示。在做八进制运算时,请时刻记住逢八进一。,南开大学 朱耀庭,4.十六进制计数法,十六进制计数法中:(1)以十六为基数,有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F十六个数码。(2)逢十六进一。(3)位置原理,K位的权重为16K。例如:这里的37ABH中的H表示前面的数为十六进制数,在80X86汇编程序中十六进制数末尾用H表示。,南开大学 朱耀庭,数制转换,二进制、八进制、十六进制数化为十进制数的方法是十分明显的,而十进制数化为二进制数却是比较麻烦的。,南开大学 朱耀庭,1.十进制数化为二进制数,首先看下式需要确定12D这个
34、十进制数对应的二进制数1100B,只需要从右到左确定上式中划下横线的的各位数字即可。而这可以归纳为:,南开大学 朱耀庭,1.十进制数化为二进制数,而这可以归纳为:12除以2取余数0,商6;商6再除以2取余数0,商3;商3再除以2取余数1,商1;商1再除以2取余数1,商为0,结束。再将余数逆序排列。于是1100B即为12D对应的二进制数。我们可以简单地记为“除以2取余数,逆序排列得整数。”类似地十化八,可以记为“除以八取余数,逆序排列得整数。”十化十六,可以记为“除以十六取余数,逆序排列得整数。”如法炮制,对于N进制,只要我们定义好了N进制的N个基数符号,便可以得到十化N进制的方法“除以N取余数
35、,逆序排列得整数”。这种理解很重要,对于我们有效地解决一些计算机中的应用问题,如:运用寄存器的特性选择合适的进制进行大整数的快速运算等,非常有帮助。,南开大学 朱耀庭,2.二进制化八进制和十六进制数,二进制数化八进制数,只要以小数点为界,整数部分将二进制数从右到左每三位一分,每三位用一位八进制表示即可;小数部分将二进制数从左到右每三位一分,每三位用一位八进制表示即可。整数部分最左边不够三位补0,小数部分最右边不够三位补0。例如:10101101.11B=10,101,101.110B=255.6Q究其原理就是因为23=8。,南开大学 朱耀庭,2.二进制化八进制和十六进制数,二进制数化十六进制数
36、,只要以小数点为界,整数部分将二进制数从右到左每四位一分,每四位用一位十六进制表示即可;小数部分将二进制数从左到右每四位一分,每四位用一位十六进制表示即可。整数部分最左边不够四位补0,小数部分最右边不够四位补0。例如:10101101.11B=1010,1101.1100B=0AD.CH究其原理就是因为24=16。可以仿照8进制例的推导过程就本例进行推导以加深对问题的理解。注意,在汇编语言中凡字母AF打头的十六进制数应在前面补一位0,这样ADH应写为0ADH。这主要是为了避免汇编程序在翻译时将其与变量名称混淆。比如,在大部分的编译器里ADH是一个合法的变量名,如果ADH不在之前加0,编译器将无
37、法得知这是一个数值还是一个变量。,南开大学 朱耀庭,1.3.3 ASCII码,ASCII 是 American Standard Code for Information Interchange 的缩写,ASCII码是国际标准化组织ISO批准的国际标准。ISO是国际标准化组织 International Organization for Standardization的缩写。基本 ASCII 字符集有 128 个字符,其中 96 个为可打印字符,包括常用的字母、数字、标点符号等;另外还有 32 个控制字符。详见附录一ASCII码编码表。,南开大学 朱耀庭,1.3.3 ASCII码,从ASCII
38、表中可以看出数字符号09的ASCII编码值是4857,其十六进制ASCII编码是从30H39H,二进制编码值是00110000B00111001B;大写英文字母AZ的ASCII编码值是6590,其十六进制ASCII编码值是41H5AH;小写英文字母az的ASCII编码值是97122,其十六进制ASCII编码值是61H7AH;回车CR(Carriage Return)的ASCII值是0DH,换行LF(Line Feed)的ASCII值是0AH,空格(Space)的ASCII值是20H等。这些都是汇编语言程序设计者在编写输入、输出程序时经常要用到的。,南开大学 朱耀庭,1.3.3 ASCII码,一
39、个ASCII字符需要一个字节,即8位二进制表示。正是有了ASCII码所表示的字符,西文文本就可以进入计算机,这是一个变革。其重要意义在于语言由字符组成,字符可以进入计算机,意味着文字语言可以进入计算机。由此出现了汇编语言、高级语言,计算机由原始的仅仅使用机器指令,变成了可以使用汇编语言、高级语言;由此出现了文本处理程序,出现了Windows的Word等,计算机由仅仅用于科学计算,扩展到了能够进行与文字处理相关的各个领域。在这一点上,中国人的最大贡献就是给出了汉字国标码、内码、字形码、输入码,由此解决了计算机处理汉字的难题。注意:这里仅仅需要记住数字符号0的ASCII码、大写字符A的ASCII码
40、,以及小写字母a的ASCII码,就可以记住所有数字和字母的ASCII。想想看这是为什么?,南开大学 朱耀庭,1.3.3 ASCII码,ASCII 是 American Standard Code for Information Interchange 的缩写,ASCII码是国际标准化组织ISO批准的国际标准。ISO是国际标准化组织 International Organization for Standardization的缩写。基本 ASCII 字符集有 128 个字符,其中 96 个为可打印字符,包括常用的字母、数字、标点符号等;另外还有 32 个控制字符。详见附录一ASCII码编码表。,
41、南开大学 朱耀庭,1.3.4 数的补码表示,1.无符号数n位二进制数,其所有状态全部用来表示0和自然数,这种数的表示法称作无符号数。因此字节无符号数的表示范围是028-1(255),字无符号数的表示范围为0216-1(65535),双字无符号数的表示范围为0232-1(4294967295)。无符号数可以用二进制、八进制、十六进制或十进制表示,例如字节无符号数00D255D的十六进制可表示为00HFFH。任给一个二进制数,确切地说任给一个具有N位,每位只有0、1两种状态的部件,能否用这些状态中的某些状态表示正数,而另一些状态表示负数,同时又易于正负数的识别和运算呢?这就是计算机中数的表示要解决
42、的问题。这个问题的解决有几种方案:数的原码表示、反码表示和补码表示,其中补码表示最理想。,南开大学 朱耀庭,1.3.4 数的补码表示,2.数的原码表示设有一个N位二进制数,原码表示法是指用最高位表示符号,最高位为0表示正整数,最高位为1表示负整数,其他位表示这个数的绝对值,这种表示法称作数的原码表示。因此字节原码的表示范围为-(27-1)27-1,即-127127,其中有两个0,即+0:00000000B和-0:10000000B。这种表示法既可以表示负数又可以表示正数,但因为符号位需要单独处理,运算起来不方便。因此这种表示法在现代计算机中已经不大采用。,南开大学 朱耀庭,1.3.4 数的补码
43、表示,3.数的反码表示设有一个N位的二进制数,反码表示法是指0和正整数的反码就是其本身,负整数的反码是其绝对值所对应的二进制数各位取反。字节反码的表示范围为-(27-1)27-1,即-127127,其中有两个0,即00000000B和11111111B。字反码的表示范围为-(215-1)215-1,即-3276732767。例如-1的字节反码是11111110,1的字节反码是00000001。又如-127的字节反码是10000000。它可以用如下方法得到,首先-127的绝对值是127,即01111111,然后对其各位取反就可以得到-127的反码:10000000。任何应该在表示范围内的负整数都
44、可以用这种方法得到。,南开大学 朱耀庭,1.3.4 数的补码表示,反码表示与原码表示一样,除0以外,最高位为1表示负整数,最高位为0表示正整数。但在运算中符号位仍然影响运算结果,例如-1+2结果应该为1,而其反码运算结果为:11111110+00000010=100000000,这时虽然最高位已经进入进位位,可以不考虑,但这种情况下仍然需要在末尾位加1进行校正。也就是说使用反码表示仍然不方便,所以现代计算机也多不采用这种表示法。,南开大学 朱耀庭,1.3.4 数的补码表示,4.数的补码表示既然原码和反码表示都不方便计算,那有没有一种既保留原码与反码最高位为1表示负数,最高位为0表示正数的特点,
45、在运算时又不需要单独考虑符号位的带符号整数的表示法呢?有,这就是现代计算机采用的补码表示法。设有一个N位的二进制数,补码表示法是:0和正整数的补码就是其本身;负整数的补码是其绝对值所对应的二进制数各位取反,然后末尾加1。字节补码的表示范围为-2727-1,即-128127。字的补码表示范围为-215215-1,即-3276832767。,南开大学 朱耀庭,1.3.4 数的补码表示,图1-4 从表盘看补码,南开大学 朱耀庭,1.3.4 数的补码表示,现在我们来看日常生活中的一个例子。如图1-4(a)所示,一个手表,正确的时间是1点,而手表现在却指向2点,问有几种办法校正它?回答是两种,一种办法是
46、将时针逆时针拨一小时,即2-1=1;另外一种办法是将时针顺时针拨11小时,即2+11=13丢12得1,如图1-4(b)所示。后一种方法是利用了表盘只有12种状态,超过12就丢掉了的特点,在数学上称作模12运算,即(2+11)mod 12=1。计算机的字长与手表一样也是有限的,字长有限就会出现类似手表的情况。手表的12个状态0、1、2、11,如果用05表示正数05,611分别表示负数-6、-5、-1,这种表示法就是补码表示法。例如:-3+5=(-3)补码+5补码=(9+5)mod 12=2,南开大学 朱耀庭,1.3.4 数的补码表示,运算结果显然是正确的,理论上也完全可以证明:只要参加运算的数和
47、结果都在字长的表示范围内,采用补码表示的整数加减运算的结果都是正确的。现在,将手表表盘改变一下,让它有256个状态,即0、1、2、255。于是就有0、1、2、127表示正数,128、129、254、255分别表示负数-128、-127、-2、-1。这就是字节的补码表示,在这种情况下模为256。如果写成二进制数很容易看出来,0和正数的补码就是它自己,最高位为0;负数的补码,是其反码末尾加1的结果,而且最高位为1。对字节而言,这种表示法用高于等于10000000的无符号数表示负数,而用低于10000000的无符号数表示正数,其数的表示范围为-27(27-1)。当字长为N时,其数的表示范围为:-2N
48、-1(2N-1-1),而且仍然可用最高位为1还是为0区分负数和正数。采用补码表示不但保留了反码表示的特点,而且便于运算。它可以实现用加法代替减 法。,南开大学 朱耀庭,1.3.4 数的补码表示,例如,8-7=1可化为8+(-7)=1。方法是:8补+-7补=(00001000+11111001)mod 28=100000001 mod 28=00000001B所谓mod 28是以28为模留余,这在硬件上是极易实现的,只要舍去进位就可以了。由此可知补码表示法有极大的优越性。因此字节负数的补码也可以用模256求得,例如-24的补码=256-24=232=11101000B。可见24补上232就是模2
49、56,这也就是补码命名的来历。,南开大学 朱耀庭,1.3.4 数的补码表示,补码表示法既保留了原码、反码表示的最高位表示符号位的特点,又充分发挥了字长有限的长处,利用模运算使得加减法可以用加法代替。数字运算的实质是加减乘除运算。乘法可以用加法代替,除法可以用减法代替,因此加减乘除可以归结为加减运算,所以计算机的核心运算是加减运算。补码的引入,使得减法可以用加法代替,因此就这一意义而言,可以说加减乘除可以用加法代替,计算机的核心就是加法器。,南开大学 朱耀庭,二进制编码的十进制数BCD码(Binary-Coded Decimal),任何计算机的字长都是有限的,因此无论是整数和浮点数,其数的表示范
50、围都受到了限制。例如即使字长64bit,其所能够表示的带符号整数的范围也仅仅是263263-1,超出这一范围的数就不能够用整数表示和计算。要对任何整数均能够进行计算就必须不受字长的限制。解决这个问题的一种办法就是使用二进制编码的十进制数,即BCD码(Binary-Coded Decimal)。,南开大学 朱耀庭,二进制编码的十进制数BCD码(Binary-Coded Decimal),BCD码有两种,一种称为压缩型BCD码,它用一个字节表示两位十进制数,高4位00001001表示十进制的十位数字09,低4位表示十进制的个位数字09。例如00010101B表示15D。另一种称非压缩型BCD码,它