汇编语言程序设计第一章.ppt

上传人:za****8 文档编号:14127639 上传时间:2020-07-04 格式:PPT 页数:77 大小:3.45MB
返回 下载 相关 举报
汇编语言程序设计第一章.ppt_第1页
第1页 / 共77页
汇编语言程序设计第一章.ppt_第2页
第2页 / 共77页
汇编语言程序设计第一章.ppt_第3页
第3页 / 共77页
点击查看更多>>
资源描述
,汇编语言程序设计-朱耀庭,南开大学朱耀庭,第一章预备知识,1.3计算机中数的表示,1.2思维方式的转变,1.1计算机语言,南开大学朱耀庭,1.1计算机语言,面向机器的语言,非面向机器的计算机语言,1.1.1,1.1.2,1.1.3,学习汇编语言的意义,南开大学朱耀庭,1.1.1面向机器的语言,南开大学朱耀庭,1.机器语言,机器语言程序由机器指令构成,这些机器指令按照执行顺序依次排列,运行时依次执行完成某个特定的计算或任务。机器指令是CPU能直接识别并执行的指令。机器指令由物理部件的若干位二进制0、1状态体现,机器指令程序运行前需要存储到内存,正确的机器指令一旦送入CPU被译码后就将变成动作予以执行。,南开大学朱耀庭,1.机器语言,如图1-1所示,机器指令面向机器,因机器而异。不同的机器具有不同的机器指令,因而具有不同的机器语言。,图1-1使用不同机器语言的计算机,动画演示,南开大学朱耀庭,1.机器语言,机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。由于机器指令由物理部件的若干位二进制0、1状态体现,因此机器指令的最直接的记忆形式就是表示这一指令状态的二进制数,这个二进制数就称作该机器指令的二进制代码指令。由于二进制数和八进制数,以及十六进制数的特殊关系,因此该二进制代码指令对应的八进制数和十六进制数分别称作该机器指令的八进制或十六进制代码指令。,南开大学朱耀庭,1.机器语言,例如:B233H就是一条80X86的十六进制机器代码指令,这条指令的功能是将33H这个十六进制数送DL寄存器。该机器指令的二进制代码指令是:1011001000110011,指令长度16位。显然二进制代码指令与其状态对应直观,但记忆困难;而十六进制代码指令则方便记忆。因此80X86的代码指令通常都用十六进制表示。用机器指令所写的程序称作机器指令程序,机器指令程序也指用代码指令所写的程序。机器指令程序遵循冯诺依曼原理:用二进制表示数,程序与数据都存储在同样的存储器,程序指令一般顺序存取顺序执行。,南开大学朱耀庭,1.机器语言,计算机出现初期只有一种机器语言,程序员只能用代码指令编写程序,即机器语言程序。用机器语言编写程序是相当艰苦的工作,必须由经过严格训练的专业技术人员承担,这是早期计算机之所以不能够广泛应用的最大障碍之一。一方面机器语言十分重要,必须了解;另一方面机器代码指令程序使用又十分困难;因此唯一能够替代机器语言的汇编语言就成为了计算机科技人员必须掌握的一种计算机语言。,南开大学朱耀庭,2.汇编语言,虽然用机器语言编写程序有许多不便,但程序执行效率高。所以,在保留“程序执行效率高”的前提下,人们开始着手研究一种能大大改善程序可读性的编程方法。即选用能反映机器指令功能的单词或词组来代替该机器指令的操作码,选用相应的符号表示CPU内部资源和内存等操作数,这就是汇编指令。例如,汇编指令:MOVAL,BL其对应的二进制指令为:1101100010001000,十六进制代码指令则为D888H,可见记忆机器指令相当困难。,南开大学朱耀庭,2.汇编语言,而汇编指令中MOV源于Move,表示传送指令;AL,BL分别表示80X86的AL和BL寄存器。指令功能是将BL寄存器中的内容传送到AL寄存器。如此,令人难懂的二进制机器代码指令或十六进制机器代码指令就可以用通俗易懂的、具有一定含义的符号指令来表示了,这就是汇编指令的原意。我们称这些具有一定含义的符号,例如上述指令中的MOV,为助记符,用助记符、符号地址等组成的符号指令称为汇编格式指令或汇编指令。,南开大学朱耀庭,2.汇编语言,因此,用助记符表示的机器指令称作汇编指令,用汇编指令编写的程序称作汇编指令程序。但汇编指令最终必须翻译成机器指令才能够在机器上执行。汇编语言是汇编指令集、伪指令集及其使用规则的统称。能够一对一地翻译成机器指令的这种用助记符表示的机器指令称作汇编指令。伪指令则是出现在汇编语言程序中的一些辅助性的说明,它不对应具体的机器指令,而是程序设计者与汇编过程中的翻译程序(即汇编)、连接程序,以及执行时如何装入的一种约定。有关内容详见5.1节。,南开大学朱耀庭,2.汇编语言,用汇编语言编写的程序称作汇编语言程序,或汇编语言源程序,在本教材中也简称为源程序。汇编语言程序较之机器指令程序容易理解和维护。汇编语言源程序是一个文本文件,它必须经过翻译才能够变成可执行的机器语言程序,这个翻译过程称作汇编。汇编的核心过程是将汇编指令逐条翻译成机器指令,这正是汇编语言中“汇编”一词的含义。,南开大学朱耀庭,2.汇编语言,80X86汇编语言源程序扩展名为.ASM,经过汇编以后生成的浮动地址二进制文件扩展名为.OBJ,.OBJ文件需要经过连接才能够生成可执行文件.EXE。.EXE是一个可以由操作系统执行的机器指令程序。图1-2给出了一个简单汇编语言程序与其机器指令程序之间的对应关系。,图1-2汇编程序翻译过程示意图,动画演示,南开大学朱耀庭,2.汇编语言,尽管不同的CPU有不同的汇编语言,但不同种类的汇编语言都有其共同规律。因此学会一种机器的汇编语言,再学习其他汇编语言就相对容易多了。例1-1汇编程序和对应的机器指令程序在Debug下输出字符3的汇编语言程序如下:MOVDL,33MOVAH,2INT21INT20其对应的十六进制机器代码指令程序如下:B233HB402HCD21HCD20H,南开大学朱耀庭,2.汇编语言,例1-1是由4条汇编指令构成的80X86的汇编语言程序,它可以在Debug调试环境下汇编运行,运行结果是在显示器上输出一个ASCII码字符3。这里3不能在Debug下直接输入,必须用33H表示,又由于Debug下只能够使用16进制数,而且不必写最后的H,因此写作33。其他数字含义相同。机器语言是计算机唯一能接受和执行的语言。一条指令规定了由软件工作者要求计算机执行的一个基本动作。计算机CPU所能懂得的指令的全体,称作该计算机的指令系统。不同型号或系列的CPU,其指令系统不同。因为机器语言直接依赖CPU,所以可移植性差、重用性差。,南开大学朱耀庭,3.机器语言与汇编语言,计算机的指令系统有定长的指令系统和不定长的指令系统,80X86是不定长的指令系统,一条机器指令依功能不同可能是1字节至6字节长度不等。机器指令的所有字节,按二进制位分成若干字段,不同字段代表不同的含义,但必须有操作码字段和操作数字段。操作码表明做什么,操作数表明如何做。操作数依功能不同,可能没有,也可能有一个或多个。,南开大学朱耀庭,3.机器语言与汇编语言,二进制代码指令是机器指令状态的直接描述,该状态进入CPU的译码器后,经译码变成控制器的动作,通过各种逻辑电路,在时钟脉冲给出的时序信号和逻辑门的作用下完成指令所规定的操作。即二进制代码指令或机器指令完全由计算机CPU的逻辑电路直接识别,不需要任何翻译程序。最早的程序设计都采用机器语言来编写。程序设计者必须将求解的问题细化到每一条指令,其难度可想而知。程序员既要驾驭程序设计的全局又要深入每一个局部,乃至程序实现的每一个细节,即使智力超群的程序员也常常会顾此失彼,屡出差错,所编写的程序必须经过严格测试,因此开发周期长。,南开大学朱耀庭,3.机器语言与汇编语言,ASCII码的出现为改善机器指令的可读性和方便记忆提供了可能。既然ASCII码可以表示字符,字符又可以组成单词和短语,于是用帮助记忆的符号表示的机器指令,即汇编指令和汇编语言出现了。汇编语言为机器语言向算法语言,即高级语言靠拢迈出了一大步。但它离高级语言还太远,以致于程序员还不能从分解算法的数据、确定运算和控制的指令等等繁杂的细化中解脱出来。而伪指令和宏的定义则将汇编语言向算法语言又靠拢了一步,这就是宏汇编。汇编语言与机器语言相比有很多优越性,如编写容易、修改方便、阅读简单、程序清楚等。但在计算机语言系统中,汇编语言仍然被列入“低级语言”的范畴,因为它本质是机器语言,是属于面向机器的语言。,南开大学朱耀庭,1.1.2非面向机器的计算机语言,南开大学朱耀庭,1.编译型计算机语言,非面向机器的语言按照翻译程序的类型分成编译型语言和解释型语言,多数计算机高级语言是编译型语言。例如,算法语言ALGOL、公式翻译语言FORTRAN、商用语言COBOL等等;各种C语言,如MicrosoftC、TurboC、VisualC+等都是编译型语言。这些计算机语言,均采用类似于英语的语法结构,其源程序与汇编语言一样也是文本文件。用这些语言所写的程序,它所描述的算法和问题要比汇编语言直观明了。但其翻译成机器语言的过程远远比汇编的过程复杂。通常要经过预处理和多次扫描才能够变成机器语言,这个过程称作编译。编译后的浮动地址二进制文件通常也要经过连接,才能够生成可执行文件。,南开大学朱耀庭,1.编译型计算机语言,以TurboC为例,不同CPU的计算机如果要执行C语言程序,只要运用不同的C语言编译程序就可以了。图1-3表明了C语言的可移植性。其他非面向机器的语言与C语言具有同样的规律,具有可移植性,而低级语言则不具有可移植性。,图1-3C语言的可移植性,动画演示,南开大学朱耀庭,2.解释型计算机语言,早期的AppleII计算机上的BASIC语言、IBMPC上的ROMBASIC语言都是解释型的计算机语言。它与编译型计算机语言的区别在于程序最终执行时是否需要翻译程序在场。编译型语言经编译后变成可执行文件,执行时不需要编译程序在场;而解释型计算机语言需要翻译程序在场,边解释边执行。从这一特性上来说,任何具备这一特性的计算机语言都是解释型语言。例如现在广泛使用的许多脚本语言(如Perl、JAVAScript语言等)都可以认为是解释型的语言。无论是汇编语言、解释型语言,还是编译型语言,它们都有一个共同点,那就是它们的源程序文件都是文本文件,都需要翻译后才能够在机器上执行。,南开大学朱耀庭,1.1.3学习汇编语言的意义,在现代,研究物质不研究基本粒子不行,研究生物不研究DNA不行,研究信息科学不研究bit流不行。同样,研究计算机不研究指令系统及其应用也不行。因为汇编语言是面向机器的语言,通过汇编语言的学习可以更深刻地理解计算机软件系统底层对硬件的控制、操作的方法和手段,有利于今后理解和学习操作系统原理。通过80X86汇编语言的学习可以深入了解80X86微处理器的内部结构,熟悉端口和外部设备的关系,为掌握设备驱动程序的原理打下基础,为后PC阶段掌握嵌入式操作系统打下基础。,南开大学朱耀庭,1.1.3学习汇编语言的意义,通过汇编语言的学习可以深入了解80X86微处理器的指令体系,牢牢掌握面向机器语言程序设计的基本步骤和方法,为开发高质量、高效率的程序打下坚实基础。这种训练可以使掌握了汇编语言程序设计方法的每一个同学能够更容易地学习和掌握其他计算机语言。汇编语言的学习有助于读者理解bit流在网络、通信、图像、视频、音频中的组织形式等。学习好汇编语言有助于任何一个计算机工作者从信息编码的底层工作做起。世界已经进入数字化信息时代。在这个时代,一切媒体和信号最终都要化作0和1的bit流来处理,围绕着bit流的存储、编码、压缩、传输、再现等带来了各个领域的极为广泛的研究课题。没有任何一种计算机语言能够超过汇编语言帮助你更深刻地了解bit和BYTE在数字化领域的作用。,南开大学朱耀庭,1.2思维方式的转变,从设计师到设计师兼建筑师,冯诺依曼计算机的设计思想,1.2.1,1.2.2,1.2.4,汇编语言的主要特性,1.2.3,从高级语言的局限性看汇编语言,南开大学朱耀庭,1.2.1从设计师到设计师兼建筑师,如果将C语言程序设计者比作设计师,那么汇编语言程序设计者应该是设计师兼建筑师的角色。在C语言中大量的底层实现是由编译器程序掌控和实现的。例如堆栈操作、变量和函数地址分配、函数的调用、各种类型变量的算术运算和赋值等等,这些统统由编译器去处理。作为C语言的程序员主要职责是关注整个程序的算法、结构和功能实现。汇编语言程序员则需要以机器为中心的思维方式。程序员只能根据实际机器的相应指令去思考问题,这就要求程序员必须掌控程序内的各种细枝末节。例如,建筑一座大楼,从设计到建成有两种方法完成。一种方法是交给建筑设计院设计,然后再由其他建筑公司完成。另外一种方法是从头到尾全部交给一个既具有设计资格又具有建筑资格的单位完成。C语言程序开发过程类似,南开大学朱耀庭,1.2.1从设计师到设计师兼建筑师,第一种方法,C程序员扮演建筑设计师角色,他仅仅负责设计;至于施工前的一切准备工作则完全由编译程序负责。汇编语言程序开发过程类似第二种方法,汇编语言程序员既熟悉设计,也熟悉施工,他所扮演的既是设计师也是建筑师的角色。他不但出设计图纸,而且详细到原材料采购与施工步骤;至于交给汇编程序的任务仅仅是开列采购单和施工单等施工前的准备。无论C语言还是汇编语言经过编译和汇编后都生成供连接程序使用的中间文件,即.OBJ文件。所不同的是后者在设计过程中充分考虑了施工过程的细节,因而最终的执行效效率要更高些;而前者由于设计与施工分离,设计过程变得容易,但最终的执行效率差些。可见连接程序所扮演的角色是施工前的调度和组织者的角色,而执行程序.EXE才是建筑现场的所有工作人员。,南开大学朱耀庭,1.2.2冯诺依曼计算机的设计思想,在学习使用计算机时,都会用到个人计算机(PersonalComputer,PC)。编写高级语言程序时,即使对计算机体系结构了解不深入,也能够编写出质量较高的程序。可是,当用汇编语言编写程序时,实际上就是在用计算机本身的逻辑,或者说是计算机本身的思维方式,去解决实际问题。因此就要求汇编语言程序设计者,对计算机的体系结构在逻辑层面上要有比较深入的了解,即按照冯诺依曼计算机体系结构的本质去了解所使用的计算机的CPU及其内存。PC是典型的冯诺依曼计算机体系结构。20世纪30年代中期,德国科学家冯诺依曼大胆地提出了抛弃十进制,采用二进制作为数字计算机的数制基础;同时,他还指出要预先编制计算程序,然后由计算机按照人们事前制定的计算顺序来执行数值计算工作。这就是著名的冯诺依曼理论。,南开大学朱耀庭,1.2.2冯诺依曼计算机的设计思想,冯诺依曼理论的要点是:数字计算机采用二进制计数制;计算机应该按照程序顺序执行,而且程序中代码与数据存放在相同的内存空间中。根据冯诺依曼体系结构构成的计算机,必须具有如下功能:把需要的程序和数据送至计算机中;计算机必须具有长期记忆程序、数据、中间结果及最终运算结果的能力;应该具备完成各种算术、逻辑运算和数据传送等数据加工处理的能力;能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作;能够按照要求将处理结果输出给用户。为了完成上述功能,计算机必须具备5大基本组成部件。这包括:输入数据和程序的输入设备,记忆程序和数据的存储器,完成数据加工处理的运算器,控制程序执行的指令译码器和控制器,输出处理结果的输出设备。,南开大学朱耀庭,1.2.2冯诺依曼计算机的设计思想,通过例1-2可以理解冯诺依曼核心思想之一程序和数据存储在同样的存储空间。例1-2用Debug看数据与程序存储在同样的内存空间在Debug下,写一个极其简单的80X86汇编程序,让程序执行时输出一个字符3。在Window下,选择【开始】|【运行】命令,弹出【运行】对话框,在【打开】下拉列表框中输入Debug,单击【确定】按钮,进入DOS环境下的Debug窗口。这时可以按组合键AltEnter使Debug屏幕最大化。在Debug的提示符-下,按以下步骤进行操作。,南开大学朱耀庭,1.2.2冯诺依曼计算机的设计思想,-a0C3C:0100dbb20C3C:0101db330C3C:0102dbb40C3C:0103db020C3C:0104dbcd0C3C:0105db210C3C:0106dbcd0C3C:0107db200C3C:0108-g3Programterminatednormally-q这里首先用Debug的A命令,逐个将数据送入0C3C:0100起始的8个单元。它们是:B233H,B402H,CD21H和CD20H,这是4个4位十六进制数据。可见4个数据存放在0C3C:0100起始的8个单元中,南开大学朱耀庭,1.2.2冯诺依曼计算机的设计思想,后面的g是Debug的执行命令,起始执行地址是0C3C:0100,将此起始地址开始的内存中的内容取出送CPU译码并且执行(这时是将内存中存放的数据作为指令来使用),执行完一条指令,顺序去取下一条指令执行,直到遇到CD20H指令结束程序。可见内存中的数据究竟用作指令还是数据,关键在于如何使用它。如果将其用作数据,可以代表不同类型的数据,详见1.3节;如果像本例一样拿来作为指令,即由CPU解释执行,那它就会指挥计算机执行指令。这就是对冯诺依曼理论中,数据与程序存储在同样的存储空间中的最好理解。,南开大学朱耀庭,1.2.2冯诺依曼计算机的设计思想,当然并不是说所有的数据都可以当作正确的程序执行,只有那些完全正确代表程序指令的数据,才能够作为程序正确执行,并且完成其所担负的任务。如果一定要将任何顺序存放的一组数据当作程序执行,后果将不可预料。这里Debug的g命令隐含着从当前段地址0C3C的位移0100的地方开始执行,取一条指令,执行一条指令,直到CD20为止。这又是对冯诺依曼的计算机应该按照程序顺序执行的一种最直观的解释:即一般情况下顺序存储、顺序执行,除非遇到停机指令或转移指令才停机或改变执行顺序。,南开大学朱耀庭,1.2.3从高级语言的局限性看汇编语言,通常讲,高级语言比汇编语言应用起来更灵活。因为高级语言不需要知道CPU能支持哪些指令,即使将来编译后执行程序的CPU不支持某种特殊运算,我们也不需要关心,因为编译器会根据执行平台自动编译成相应的代码。这就是说对于一个高级语言程序员来说,应用该高级语言允许的任何数据类型及运算方法都是可以的,无需考虑如何执行。例如8051单片机并不支持浮点运算指令,但使用针对8051的C编译器开发程序时,编译器则会自动用8051现有的指令去仿真C程序中的浮点运算。这种方便性同时也暴露出了高级语言的局限性,或者说是弱点,即编译产生的机器指令程序代码很长。尽管现代编译器技术已经有了长足的进步,不少C程序编译的代码已经接近汇编代码,但这仅仅就个别程序而言。通常情况下,无论从代码长度和执行效率讲,同样完成一个功能,使用高级语言开发的程序和使用汇编语言直接开发的程序相比,其效率是低下的。因此,在对程序的空间及时间特性有较高要求的场合,用高级语言是难以胜任的,而用汇编语言直接操作CPU的寄存器、端口及内存所开发出的程序则具有执行代码量少,执行效率高等特点。即能够透明地、直接地操作寄存器及CPU的相应机器指令正是高级语言无法办到的事情,而汇编语言在这种场合恰恰能大有用武之地,这也正是汇编语言与高级语言比较明显的特征区别。由此可见,高级语言与汇编语言相比,最终生成的机器指令程序,具有代码长、占用存储空间大、执行效率低等弱点。,南开大学朱耀庭,1.2.3从高级语言的局限性看汇编语言,例1-3TurboC生成的代码与汇编对比下面是用C语言写的一个输出“Hello,World!”的小程序。#includevoidmain()printf(Hello,World!$);由于C语言程序在编译过程中通常要生成汇编语言的中间程序,所以在TurboC3.0下用以下命令行编译生成汇编语言中间程序。编译过程如下:tcc-c-mt-Shello.cTurboC+Version3.00Copyright(c)1992BorlandInternationalhello.c:Availablememory4148512,南开大学朱耀庭,1.2.3从高级语言的局限性看汇编语言,上述编译所生成的汇编语言程序清单长达3页,为节省篇幅,这里不再列出。这一清单还没有包括将来连接汇编库时调用printf()函数所需要的代码,可见如此小的C程序所生成的汇编程序就这样臃肿。而如果用汇编语言直接编写同样功能的程序,其汇编程序如下:.MODELSMALL.DATASDB“Hello$”.CODEGO:MOVAX,DATAMOVDS,AXMOVDX,OFFSETSMOVAH,9INT21HMOVAH,4CHINT21HENDGO,南开大学朱耀庭,1.2.3从高级语言的局限性看汇编语言,从例1-3可以看出,完成同样功能的汇编程序远比C语言程序来的精炼。当然汇编语言程序写法并不唯一,但这足可以看出用C语言生成的汇编代码要远远长于直接用汇编语言写的代码,更不用说二者生成的机器指令程序了。由此不难看出,与汇编语言相比,高级语言解决同样的问题,最终的机器代码长,占用存储空间大,执行效率低。但用高级语言开发程序相对容易,特别是开发大型程序,因此高级语言和汇编语言各自具有各自的优点和特色,也各自有各自的缺点和薄弱环节。为了解决汇编语言程序开发的难度,在宏汇编和WIN32汇编中,可以使用宏,大量宏的应用可以降低用汇编语言开发程序的难度。,南开大学朱耀庭,1.2.4汇编语言的主要特性,南开大学朱耀庭,1.3计算机中数的表示,南开大学朱耀庭,1.3.1数的表示,计算机中采用二进制计数法,这是因为从容易实现的角度讲,两种稳定状态的物理器件容易实现。从节省元器件角度讲,理论上已经证明e(2.71.)进制计数法最节省元器件,而2在整数中次于3最接近于e,因此计算机中从数据到符号、指令、地址、内容都是用二进制数来表示的。,南开大学朱耀庭,1.十进制计数法,十进制计数法归纳起来有以下几点:(1)以十为基数,有0,1,2,3,4,5,6,7,8,9十个数码。(2)逢十进一。(3)位置原理。位置原理也就是权重,第K位的权重为10K。(4)任意一个十进制数的数值部分N可以表示为:其中,l,r是整数,ak是满足0ak9的整数。例如:123.4=110221013100410-1。在本例中,最左边一位的权重是102,最右边一位的权重是10-1。,南开大学朱耀庭,2.二进制计数法,同十进制计数法的原理一样,二进制计数法归纳起来有以下几点:(1)以二为基数,有0,1两个数码。(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表示前面的数为八进制数,在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.3.2数制转换,二进制、八进制、十六进制数化为十进制数的方法是十分明显的,而十进制数化为二进制数却是比较麻烦的。,南开大学朱耀庭,1.十进制数化为二进制数,首先看下式需要确定12D这个十进制数对应的二进制数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取余数,逆序排列得整数”。这种理解很重要,对于我们有效地解决一些计算机中的应用问题,如:运用寄存器的特性选择合适的进制进行大整数的快速运算等,非常有帮助。,南开大学朱耀庭,2.二进制化八进制和十六进制数,二进制数化八进制数,只要以小数点为界,整数部分将二进制数从右到左每三位一分,每三位用一位八进制表示即可;小数部分将二进制数从左到右每三位一分,每三位用一位八进制表示即可。整数部分最左边不够三位补0,小数部分最右边不够三位补0。例如:10101101.11B=10,101,101.110B=255.6Q究其原理就是因为23=8。,南开大学朱耀庭,2.二进制化八进制和十六进制数,二进制数化十六进制数,只要以小数点为界,整数部分将二进制数从右到左每四位一分,每四位用一位十六进制表示即可;小数部分将二进制数从左到右每四位一分,每四位用一位十六进制表示即可。整数部分最左边不够四位补0,小数部分最右边不够四位补0。例如:10101101.11B=1010,1101.1100B=0AD.CH究其原理就是因为24=16。可以仿照8进制例的推导过程就本例进行推导以加深对问题的理解。注意,在汇编语言中凡字母AF打头的十六进制数应在前面补一位0,这样ADH应写为0ADH。这主要是为了避免汇编程序在翻译时将其与变量名称混淆。比如,在大部分的编译器里ADH是一个合法的变量名,如果ADH不在之前加0,编译器将无法得知这是一个数值还是一个变量。,南开大学朱耀庭,1.3.3ASCII码,ASCII是AmericanStandardCodeforInformationInterchange的缩写,ASCII码是国际标准化组织ISO批准的国际标准。ISO是国际标准化组织InternationalOrganizationforStandardization的缩写。基本ASCII字符集有128个字符,其中96个为可打印字符,包括常用的字母、数字、标点符号等;另外还有32个控制字符。详见附录一ASCII码编码表。,南开大学朱耀庭,1.3.3ASCII码,从ASCII表中可以看出数字符号09的ASCII编码值是4857,其十六进制ASCII编码是从30H39H,二进制编码值是00110000B00111001B;大写英文字母AZ的ASCII编码值是6590,其十六进制ASCII编码值是41H5AH;小写英文字母az的ASCII编码值是97122,其十六进制ASCII编码值是61H7AH;回车CR(CarriageReturn)的ASCII值是0DH,换行LF(LineFeed)的ASCII值是0AH,空格(Space)的ASCII值是20H等。这些都是汇编语言程序设计者在编写输入、输出程序时经常要用到的。,南开大学朱耀庭,1.3.3ASCII码,一个ASCII字符需要一个字节,即8位二进制表示。正是有了ASCII码所表示的字符,西文文本就可以进入计算机,这是一个变革。其重要意义在于语言由字符组成,字符可以进入计算机,意味着文字语言可以进入计算机。由此出现了汇编语言、高级语言,计算机由原始的仅仅使用机器指令,变成了可以使用汇编语言、高级语言;由此出现了文本处理程序,出现了Windows的Word等,计算机由仅仅用于科学计算,扩展到了能够进行与文字处理相关的各个领域。在这一点上,中国人的最大贡献就是给出了汉字国标码、内码、字形码、输入码,由此解决了计算机处理汉字的难题。注意:这里仅仅需要记住数字符号0的ASCII码、大写字符A的ASCII码,以及小写字母a的ASCII码,就可以记住所有数字和字母的ASCII。想想看这是为什么?,南开大学朱耀庭,1.3.3ASCII码,ASCII是AmericanStandardCodeforInformationInterchange的缩写,ASCII码是国际标准化组织ISO批准的国际标准。ISO是国际标准化组织InternationalOrganizationforStandardization的缩写。基本ASCII字符集有128个字符,其中96个为可打印字符,包括常用的字母、数字、标点符号等;另外还有32个控制字符。详见附录一ASCII码编码表。,南开大学朱耀庭,1.3.4数的补码表示,1.无符号数n位二进制数,其所有状态全部用来表示0和自然数,这种数的表示法称作无符号数。因此字节无符号数的表示范围是028-1(255),字无符号数的表示范围为0216-1(65535),双字无符号数的表示范围为0232-1(4294967295)。无符号数可以用二进制、八进制、十六进制或十进制表示,例如字节无符号数00D255D的十六进制可表示为00HFFH。任给一个二进制数,确切地说任给一个具有N位,每位只有0、1两种状态的部件,能否用这些状态中的某些状态表示正数,而另一些状态表示负数,同时又易于正负数的识别和运算呢?这就是计算机中数的表示要解决的问题。这个问题的解决有几种方案:数的原码表示、反码表示和补码表示,其中补码表示最理想。,南开大学朱耀庭,1.3.4数的补码表示,2.数的原码表示设有一个N位二进制数,原码表示法是指用最高位表示符号,最高位为0表示正整数,最高位为1表示负整数,其他位表示这个数的绝对值,这种表示法称作数的原码表示。因此字节原码的表示范围为-(27-1)27-1,即-127127,其中有两个0,即+0:00000000B和-0:10000000B。这种表示法既可以表示负数又可以表示正数,但因为符号位需要单独处理,运算起来不方便。因此这种表示法在现代计算机中已经不大采用。,南开大学朱耀庭,1.3.4数的补码表示,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。任何应该在表示范围内的负整数都可以用这种方法得到。,南开大学朱耀庭,1.3.4数的补码表示,反码表示与原码表示一样,除0以外,最高位为1表示负整数,最高位为0表示正整数。但在运算中符号位仍然影响运算结果,例如-1+2结果应该为1,而其反码运算结果为:11111110+00000010=100000000,这时虽然最高位已经进入进位位,可以不考虑,但这种情况下仍然需要在末尾位加1进行校正。也就是说使用反码表示仍然不方便,所以现代计算机也多不采用这种表示法。,南开大学朱耀庭,1.3.4数的补码表示,4.数的补码表示既然原码和反码表示都不方便计算,那有没有一种既保留原码与反码最高位为1表示负数,最高位为0表示正数的特点,在运算时又不需要单独考虑符号位的带符号整数的表示法呢?有,这就是现代计算机采用的补码表示法。设有一个N位的二进制数,补码表示法是:0和正整数的补码就是其本身;负整数的补码是其绝对值所对应的二进制数各位取反,然后末尾加1。字节补码的表示范围为-2727-1,即-128127。字的补码表示范围为-215215-1,即-3276832767。,南开大学朱耀庭,1.3.4数的补码表示,图1-4从表盘看补码,南开大学朱耀庭,1.3.4数的补码表示,现在我们来看日常生活中的一个例子。如图1-4(a)所示,一个手表,正确的时间是1点,而手表现在却指向2点,问有几种办法校正它?回答是两种,一种办法是将时针逆时针拨一小时,即2-1=1;另外一种办法是将时针顺时针拨11小时,即2+11=13丢12得1,如图1-4(b)所示。后一种方法是利用了表盘只有12种状态,超过12就丢掉了的特点,在数学上称作模12运算,即(2+11)mod12=1。计算机的字长与手表一样也是有限的,字长有限就会出现类似手表的情况。手表的12个状态0、1、2、11,如果用05表示正数05,611分别表示负数-6、-5、-1,这种表示法就是补码表示法。例如:-3+5=(-3)补码+5补码=(9+5)mod12=2,南开大学朱耀庭,1.3.4数的补码表示,运算结果显然是正确的,理论上也完全可以证明:只要参加运算的数和结果都在字长的表示范围内,采用补码表示的整数加减运算的结果都是正确的。现在,将手表表盘改变一下,让它有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-1(2N-1-1),而且仍然可用最高位为1还是为0区分负数和正数。采用补码表示不但保留了反码表示的特点,而且便于运算。它可以实现用加法代替减法。,南开大学朱耀庭,1.3.4数的补码表示,例如,8-7=1可化为8+(-7)=1。方法是:8补+-7补=(00001000+11111001)mod28=100000001mod28=00000001B所谓mod28是以28为模留余,这在硬件上是极易实现的,只要舍去进位就可以了。由此可知补码表示法有极大的优越性。因此字节负数的补码也可以用模256求得,例如-24的补码=256-24=232=11101000B。可见24补上232就是模256,这也就是补码命名的来历。,南开大学朱耀庭,1.3.4数的补码表示,补码表示法既保留了原码、反码表示的最高位表示符号位的特点,又充分发挥了字长有限的长处,利用模运算使得加减法可以用加法代替。数字运算的实质是加减乘除运算。乘法可以用加法代替,除法可以用减法代替,因此加减乘除可以归结为加减运算,所以计算机的核心运算是加减运算。补码的引入,使得减法可以用加法代替,因此就这一意义而言,可以说加减乘除可以用加法代替,计算机的核心就是加法器。,南开大学朱耀庭,1.3.5二进制编码的十进制数BCD码(Binary-CodedDecimal),任何计算机的字长都是有限的,因此无论是整数和浮点数,其数的表示范围都受到了限制。例如即使字长64bit,其所能够表示的带符号整数的范围也仅仅是263263-1,超出这一范围的数就不能够用整数表示和计算。要对任何整数均能够进行计算就必须不受字长的限制。解决这个问题的一种办法就是使用二进制编码的十进制数,即BCD码(Binary-CodedDecimal)。,南开大学朱耀庭,1.3.5二进制编码的十进制数BCD码(Binary-CodedDecimal),BCD码有两种,一种称为压缩型BCD码,它用一个字节表示两位十进制数,高4位00001001表示十进制的十位数字09,低4位表示十进制的个位数字09。例如00010101B表示15D。另一种称非压缩型BCD码,它用一个字节表示一位十进制数,其高4位为0000,低4位00001001B分别表示0。例如00000011B表示3D。后面我们可以看到,BCD码的计算可以不受字长限制,因此可以解决上面提到的类似受字长限制的问题。80X86没有单独的BCD码运算指令,而是通过采用已有的相应二进制数运算,再加上适当的校正指令来共同实现的。校正指令的作用是调整,即将二进制运算的结果调整为正确的BCD码运算结果。,南开大学朱耀庭,1.3.5二进制编码的十进制数BCD码(Binary-CodedDecimal),1.压缩型BCD码运算的实现所谓压缩型BCD码的运算是指参加运算的数是压缩型BCD码,运算的结果也应该是BCD码。例如37+46=83,用压缩型BCD码运算就是指37H46H83H。两个压缩型BCD码的加减法运算,可以先用二进制加减法指令,然后再用相应的校正指令得到,详见7.6节。需要注意的是压缩型BCD码,只有加减运算没有乘除运算。,南开大学朱耀庭,1.3.5二进制编码的十进制数BCD码(Binary-CodedDecimal),2.非压缩型BCD码运算及其校正非压缩型BCD码有加减乘除四种运算,其中加减乘运算是首先用二进制加减乘指令进行,然后再用校正指令校正,而除法运算则是首先对被除数进行校正,然后再用二进制除法完成,详见7.7节。3.BCD码与ASCII码在非压缩型BCD码的高4位上加上3D就变成了09相应的ASCII码。例如:3的BCD码为00000011B,3的ASCII码为00110011B。如果希望在计算机的输出设备显示器、打印机上输出运算结果,就必须将计算机内部的数据用ASCII输出。因此在这种情况下就必须将机器内部的数据形式转换为ASCII的表示形式,这一点在高级语言程序设计时可以不去考虑,但是在汇编语言里必须考虑,必须自己来想办法进行转换。例如将BCD码转换为ASCII码,将机器内部二进制数转换为ASCII表示的十进制数等类似的问题。,南开大学朱耀庭,1.3.6IEEE浮点数,IEEE浮点数由3部分组成,从二进制数的高位到低位依次为符号、指数及尾数字段。浮点数字段的分配如图1-5所示。图1-5浮点数字段的分配(1)图1-5中符号占一位,总是位于浮点数据的最高有效位,0表示正数,1表示负数。(2)指数部分为一整数,指数位的底数为2,采用“偏移码”来表示,即:指数编码值=实际的指数值+基数值。(3)单精度浮点数指数部分的基数值为7FH。尾数部分用来表示数据的有效数字,通常尾数采用规格化形式。,符号,指数,尾数,南开大学朱耀庭,1.3.6IEEE浮点数,IEEE规定,规格化的单精度浮点数和双精度浮点数的尾数有效位隐含一个整数1和一个小数点,隐含部分不需要专门存储。即采用二进制数科学计数法的形如1.XXXXX的实数,该数的前两个字符“1.”不需要存储,是衡定的,只需要将小数点之后的XXXXX以整数形式存储在尾数部分即可。例如二进制数1101.011是非规格化的数,而1.101011B23是规格化的数。其尾数为101011,指数部分由23的指数3,即11B形成,即11+01111111=10000010。,南开大学朱耀庭,1.3.6IEEE浮点数,1.单精度浮点数IEEE单精度浮点数使用4个连续的字节存储单元,即32位来表示一个浮点数。从32位二进制数的高位到低位,依次为:1位符号位,8位指数位及23位尾数位,所能表示的数的范围近似为:1.1810-38|X|3.401038,有效位数为7位。单精度浮点数指数部分的基数值为7FH。单精度浮点数字段分配如图1-6所示。,南开大学朱耀庭,1.3.6IEEE浮点数,例1-5单精度浮点数实例。表1-2通过几个简单实例说明了单精度浮点数是如何用32位二进制数表示的。,南开大学朱耀庭,1.3.6IEEE浮点数,2.双精度浮点数IEEE双精度浮点数使用8个连续的字节存储单元,即64位来表示一个浮点数。从64位二进制数的高位到低位,依次为:1位符号位,11位指数位及52位尾数位,所能表示的数据范围近似为:2.2310-308|X|1.7910308,有效位数为16位。双精度浮点数指数部分的基数值为3FFH。双精度浮点数字段分配如图1-7所示。,南开大学朱耀庭,1.3.6IEEE浮点数,例1-6将实数555.125转换为单精度浮点数格式转换过程如下:(1)确定符号位:正数为0。(2)将555.125转换为二进制数形式,即555.125D=1000101011.001B=1.000101011001B29(3)由:实际的指数值=编码值基数值,有编码值=实际的指数值+基数值,单精度浮点数指数部分的基数值为7FH=127D,所以555.125D指数部分的编码值为(9+127)D=136D=10001000B。(4)尾数部分保留1.000101011001B小数点之后的部分,即000101011001,由于单精度浮点数尾数部分为23位,所以在之后补11个0,得到00010101100100000000000。(5)将所得3部分串起来得到:01000100000010101100100000000000B由于二进制数的书写比较冗长,通常我们会表示成十六进制数,即440AC800H。也就是说555.125D=440AC800H(IEEE单精度浮点数),南开大学朱耀庭,1.3.7从不同角度来看待一个二进制数,一个二进制数或者说一个代码在数字计算机中有着极其深刻的含义。从不同的使用角度可作不同的解释。例如同是00110001B,即31H,可以看成是字符1的ASCII码;可以看成是31D的BCD码;可以看成是49D的二进制表示;既可以看成无符号数49D的原码,也可以看成49D的补码;还可以看成是一个地址,它指内存的31H单元。又如11111000B,即F8H,当将其送入指令译码器可以解释为一条清进位指令CLC;若将其看成无符号数表示248D;若将其看成带符号数的补码形式,它表示-8。可见二进制数在计算机中可以用物理部件的状态表示。当将这种状态传递到CPU的译码器时,它被解释为指令,完成指令的动作。也可以用其表示无符号数或带符号数的补码,还可以表示西文字符的ASCII,中文字符的内码、表示字型码等。也可以表示图像中一个像素点的RGB值,还表示声音数据的一个采样值。可以说对二进制数的认识越深刻,对计算机知识的理解就越深刻。,南开大学朱耀庭,1.3.7从不同角度来看待一个二进制数,正是因为二进制数可以表示指令并且为CPU解释执行,代码指令程序才能够在计算机上运行;正是因为二进制数能够表示ASCII码和各种汉字编码,才有了计算机的各种高级语言和汇编语言,才有了计算机的各种西文和中文文本处理功能;正是因为二进制数能够表示像素值和声音数据,才有了计算机的图像、视频以及音频处理功能;正因为二进制数的各种状态能够表示各种实际工程的控制状态和数据,才有了计算机在控制领域的各种自动控制能力;也正是因为二进制数形成的bit流,才能够有今天的网路时代等。总之,现在的数字化信息时代所有数字化信息的表示、记录、存储、传递、再现统统离不开二进制数。,南开大学朱耀庭,ThankYou!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!