ibm-pc汇编语言程序设计(沈美明第二版)第一章预备知识_第1页
ibm-pc汇编语言程序设计(沈美明第二版)第一章预备知识_第2页
ibm-pc汇编语言程序设计(沈美明第二版)第一章预备知识_第3页
ibm-pc汇编语言程序设计(沈美明第二版)第一章预备知识_第4页
ibm-pc汇编语言程序设计(沈美明第二版)第一章预备知识_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言程序设计,北京理工大学电子工程系,马永锋mayongfeng,简介,主要参考书:张雪兰汇编语言程序设计-从DOS到Windows,清华大学出版社朱耀庭汇编语言程序设计,清华大学出版社沈美明、温冬婵,IBM-PC汇编语言程序设计,清华大学出版社,主要内容:学习关于计算机硬件和计算机语言方面的基础知识;学习汇编语言相关的基础知识、程序设计方法和技巧;为后续课程打下基础;,第1章预备知识,1.1计算机语言1.2计算机组织结构1.3计算机中数的表示,第1章预备知识,1.1计算机语言1.1.1面向机器的语言,(1)机器语言机器语言程序由机器指令构成,这些机器指令按照执行顺序依次排列,运行时依次执行,完成某个特定的计算或任务;机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成:,操作码指出该指令所要完成的操作,即指令的功能;操作数指出参与运算的对象,以及运算结果所存放的位置等。,机器指令与CPU紧密相关,所以,不同种类的CPU所对应的机器指令也就不同。80X86计算机orZ80计算机?,1.1.1面向机器的语言,(2)汇编语言用助记符、符号地址等表示的机器指令称作汇编指令,用汇编指令编写的程序称作汇编指令程序。汇编语言是汇编指令集、伪指令集及其使用规则的统称。伪指令是在程序设计时所需要的一些辅助性说明指令,它不对应具体的机器指令。用汇编语言编写的程序称为汇编语言程序,或汇编语言源程序,在本课程中简称为源程序。汇编语言程序要比用机器指令编写的程序容易理解和维护。汇编语言源程序是一个文本文件,80 x86汇编语言源程序扩展名是.asm,它必须经过翻译才能够变成可执行的机器语言程序,这个翻译过程称作汇编。,(3)汇编程序,用汇编语言编写的程序大大提高了程序的可读性,但失去了CPU能直接识别的特性。把汇编语言编写的源程序翻译成CPU能识别的机器指令序列,我们称该翻译程序为汇编程序。图1.1是翻译程序的翻译过程示意图。目前,常用的汇编程序有:MASM、TASM和DEBUG等。,面向机器的语言,图1.1汇编语言指令到机器指令的示意图,MOVDL,33H;B233HMOVAH,2;B402HINT21H;CD21HINT20H;CD20H,1.1.2非面向机器的计算机语言,非面向计算机的语言按照翻译程序的类型分为编译型语言和解释型语言;(1)编译型计算机语言翻译成机器语言的过程远比汇编的过程复杂,通常经过预处理和多次扫描才能够变成机器语言,这个过程称作编译。编译后的浮动二进制文件要经过连接,才能够生成可执行文件。可执行文件运行时,不需要编译程序在场。例如各种C语言都是编译型语言。(2)解释型计算机语言解释型计算机语言执行时需要翻译程序在场,边解释边执行。如Basic语言、许多脚本语言(Perl、JavaScript语言等)是解释型语言。,1.1.3汇编语言主要特性,举例:编程实现123+456,结果保存到变量sum中。,/C语言实现Main()inta,b,sum;a=123;b=456;sum=a+b;,-机器语言实现输入程序代码:-ECS:100A10B0103060D01A30F01C3设置数据:-EDS010B7B00C8010000运行结果:12F8:010F4302,汇编语言主要特性,-汇编语言实现CODESEGMENTORG100HASSUMECS:CODE,DS:CODEMAINPROGNEARMOVAX,AADDAX,BMOVSUM,AXRETADW123BDW456SUMDW?MAINENDPCODEENDSENDMAIN,汇编程序不能直接运行,把它经过汇编、连接处理后得到.com可执行文件,运行后得到结果。,汇编语句与机器语句一一对应,它是把每条指令及数据用便于记忆的符号书写,是一种符号化了的机器语言,即用指令助记符、符号地址、标号等符号书写程序的语言,汇编语言主要特性,程序占用字节数统计,汇编语言的特点:占用空间少;执行速度快;10倍?直接控制硬件能力强;开发周期长、可移植性差、不易掌握;,有助于理解程序与操作系统、处理器、存储器、外部设备之间的关系和工作原理;在管理专用硬件设备方面提供了更多的控制方法,完成更具专业性的任务;生成更加紧凑的可执行模块,减小存储空间的需求;程序执行效率更高、速度更快;编写、调试程序的复杂性高;应用软件大部分是用高级语言编写,但对于执行效率要求苛刻的部分还需要用汇编语言进行优化改进;常驻内存程序和中断服务例行程序几乎都用汇编语言编写;,汇编语言主要特性,根据应用程序的“可移植性”和“执行效率”来确定是否选用汇编语言下面简单列举几个领域以示说明,但不要把它们绝对化。,1、适用的领域要求执行效率高、反应快的领域,如:操作系统内核,实时系统等;系统性能的瓶颈,或频繁被使用子程序或程序段;与硬件资源密切相关的软件开发,如:设备驱动程序等;受存储容量限制的应用领域,如:嵌入式控制功能等;2、不宜使用的领域大型软件的整体开发;没有特殊要求的一般应用系统的开发等。,汇编语言的使用领域,汇编语言主要特性,2计算机组织结构,1.2.1冯诺依曼结构由运算器、控制器、存储器、输入设备和输出设备五大部分组成;数据和程序以二进制代码的形式不加区别地存放在存储器中,存放位置由地址指定,地址码也是二进制形式;控制器根据存放在存储器中的指令序列(即程序)工作,并由一个程序计数器(PC)控制指令的执行。控制器具有判断能力,能够根据计算结果选择不同的动作流程,微型计算机组成,计算机系统组成:硬件+软件硬件组成:中央处理器(CPU),存储器,输入输出子系统和系统总线,微型计算机组成,计算机软件系统组成,微型计算机的工作过程,微型计算机的工作过程就是执行程序的过程,而程序由指令序列组成,因此,执行程序的过程,就是执行指令序列的过程,即逐条地从存储器中取出指令并完成指令所指定的操作。由于执行每一条指令,都包括取指、译码和执行三个基本步骤,所以,微型计算机的工作过程,也就是不断地取指令、译码和执行的过程,直到遇到停机指令时才结束机器的运行。,优点:处理器简单通用,把复杂问题转移到存放解释程序存储器中,即把复杂的硬件设计转化为复杂的软件设计。,1.2.28086微处理器结构,总线接口部件(businterfaceunit,BIU)负责与存储器、I/O端口传送数据。执行部件(executionunit,EU)负责指令的执行。,8086微处理器,8086CPU的结构是一次划时代的革命,其基础的逻辑结构一直沿用至今,即使最新型的酷睿多核CPU,使用的也还是地址、数据及控制三总线的协同工作方法。无论何种CPU,在工作时都是围绕一个核心,即对某个指定的“地址”进行操作,或者取数或者运算。这个地址可以是某个通用寄存器、内存的某个地址、甚至是某个外设端口。“需要执行的机器指令程序,首先必须存放在内存的某个地方”。理解这一点是汇编语言程序设计的基本要求,用高级语言编写并编译程序时并不需要知道这一点,这是机器语言与高级语言的差异。存放程序的这个地方,在程序执行时由总线接口单元的CS及IP共同来指向。指令通过外部总线从内存中被取出后,会送到BIU的指令流队列,并由EU执行。而这一切都是由控制电路来协调完成的。,8086微处理器,EU中的算术逻辑单元ALU用来维持MPU的状态和标志,管理通用寄存器和指令操作数。EU中寄存器是16位的,数据通路也是16位的,这样便于数据的快速传送。EU从BIU的指令队列中获取指令,译码后开始执行,当指令要求访问内存或端口时,EU请求BIU存取数据。这时EU算出的地址是相对段基的16位位移量,BIU根据指令要求选定相应的段寄存器来得到段基,然后再由段基和位移才能得出操作数的20位的物理地址。20位的物理地址使得EU能直接访问的存储空间为1M字节。BIU用来实现EU的所有总线操作,在EU执行指令时,BIU从存储器中取出后继指令送入指令队列,该队列同时能存放总共6个字节的指令。在绝大多数情况下,这一指令队列能保证EU从该队列中取出马上要执行的指令,而不必到内存中直接取指令。,1.2.38086的寄存器组,寄存器是CPU内部存放操作数的地方,它的操作速度比内存操作数速度快。8086共有14个寄存器,它们都是16位的,可以存放16位二进制数。通用寄存器:4个数据寄存器:AX、BX、CX和DX,每个寄存器又可分为2个8位寄存器2个变址寄存器:DI和SI2个指针寄存器:SP和BP段寄存器4个段寄存器:ES、CS、SS和DS标志寄存器1个标志寄存器:FLAG指令指针寄存器一个指令指针寄存器:IP,通用寄存器的作用,(1)数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。4个16位寄存器:AX:Accumulator,累加器BX:BaseRegister,基址寄存器CX:CountRegister,计数寄存器DX:DataRegister,数据寄存器上述4个寄存器可分为8个8位寄存器,分别为AH和AL、BH和BL、CH和CL、DH和DL。每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器“能分可合”的特性,灵活地处理双字、字和字节等信息。在32位处理器中,有4个32位寄存器:EAX、EBX、ECX和EDX。,通用寄存器的作用,(2)变址寄存器(IndexRegister)SI:SourceIndexRegister,源变址寄存器DI:DestinationIndexRegister,目标变址寄存器它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能。(3)指针寄存器(PointerRegister)它们主要用于访问堆栈内的存储单元,并且规定:BP:基指针(BasePointer)寄存器,用它可直接存取堆栈中的数据SP:堆栈指针(StackPointer)寄存器,用它只可访问栈顶,通用寄存器的作用,通用寄存器的隐含使用及特殊用途,8086在取指令和寻找内存操作数的地址时,采用了分段寻找的方式,在同一时刻可将内存分成4个段:代码段、数据段、堆栈段和特别数据段,段与段之间允许有重叠。4个段寄存器是:CS(CodeSegmentRegister,代码段寄存器)DS(DataSegmentRegister,数据段寄存器)SS(StackSegmentRegister,堆栈段寄存器)ES(ExtraSegmentRegister,附加段寄存器)。这4个寄存器都只能够作为16位寄存器使用。8086外部有20根地址线,它可以直接访问的物理空间为1M字节,其编码区间为:00000H0FFFFFH。而CPU内部存放存储单元偏移量的寄存器(如IP、SP、BP、SI、DI和BX等)都是16位,它们的编码范围仅为:00000H0FFFFH。如何用16位寄存器有效地访问1MB的存储空间,8086采用了内存分段的管理模式,并引入存储器分段的概念。,段寄存器的作用,8086的存储器,计算机存储信息的基本单位是一个二进制位(bit):1或0,每8位组成一个字节;通常所说字长为16位,由2个字节组成;在存储器里以字节为单位存储信息,为了正确存取信息,每一个字节单元给以一个存储器地址。地址从0开始编号,顺序每次加1,地址也是以二进制数表示的;,存储单元的内容存储单元中所存放的二进制信息称为该存储单元的内容或值,并且规定:一个字节的内容是该字节单元内存放的二进制信息;一个字的内容是该字地址所指向的单元及其后继一个单元的内容拼接而成;一个双字的内容是该字地址所指向的单元及其后三个单元的内容拼接而成。在拼接“字内容”时,按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。在拼接“双字内容”时也是如此。,8086内存分段管理模式,8086内存分段管理模式,(1)存储器的分段计算机的内存单元是以“字节”为最小单位进行线性编址的。为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址。16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下:逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0;逻辑段的最大容量为64K,这由16位寄存器的寻址空间所决定。按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。(2)物理地址的形成方式存储单元的逻辑地址分为两部分:段地址和偏移量。由逻辑地址得到其物理地址(PAPhysicalAddress)的计算方法如下:物理地址PA段地址16+偏移量,8086内存分段管理模式,(3)段寄存器的引用段寄存器是因为对内存的分段管理而设置的。一般情况下,段寄存器及其指针寄存器的引用关系方面有如下规定:取指令所用的段寄存器和偏移量一定是用CS和IP;堆栈操作所用的段寄存器和偏移量一定是SS和SP;串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;其它情况,段寄存器除其默认段寄存器外,还可以强行改变为其它段寄存器。,8086内存分段管理模式,控制寄存器,(1)指令指针寄存器IP(InstructionPointer)IP是16位的寄存器,存放着下次将要执行的指令在代码段的偏移量。在80386及其高档处理器处于保护模式时,其指令指针寄存器是32位的EIP。(2)标志寄存器FLAG(FlagsRegister)FLAG寄存器的各位用来存放各种不同的标志。算术运算指令和逻辑运算指令的运行结果都将定性地反映在不同的标志位上,以便后续的条件判断指令根据这些标志实现判断转移,判断转移的实质是修改CS和IP。这也正是计算机能够实现判断转移的底层原理。,6个状态标志:OF、SF、ZF、AF、PF、CF3个控制标志:IF、DF、TF;7位保留;,标志寄存器,标志寄存器中的状态标志位含义如下CF(carryflag):进位标志,在进行字/字节运算产生进位或借位时置1,否则置0。PF(parityflag):奇偶性标志,结果有偶数位为1时置1,否则置0。AF(auxiliarycarryflag):辅助进位标志,当进行字节运算有低4位向高4位进位或借位时置1,否则置0。在作BCD码运算时常常使用。ZF(zeroflag):零标志,当运算结果为0时置1,否则置0。SF(signflag):符号标志,运算结果为负,即结果最高位为1时置1,否则置0。OF(overflowflag):溢出标志,运算溢出时自动置1,当它为1时可用溢出中断指令产生中断。,标志寄存器,标志寄存器中的控制标志位含义如下TF(trapflag):陷阱标志,若IF=1,则在执行指令时产生单步中断。IF(interruptflag):中断标志,若IF=1开中断,响应可屏蔽中断;IF=0,关中断。DF(directionflag):方向标志,DF置1引起串操作指令的变址寄存器自动减值,DF置0引起串操作指令的变址寄存器自动增值。,1.3计算机中数的表示,几个基本概念位(bit)是计算机所能表示的最小最基本的数据单位,它指的是取值只能为0或1的一个二进制数值位。位作为单位时记作b;字节(byte)由8个二进制位组成,通常用作计算存储容量的单位,字节作为单位时记作BK是kelo的缩写,1K=1024=210;M是mega的缩写,1M=1024K=220;G是Giga的缩写,1G=1024M=230;T是tera的缩写,1T=1024G=240。,计算机中数的表示,字长是微处理器一次可以直接处理的二进制数码的位数,它通常取决于微处理器内部通用寄存器的位数和数据总线的宽度。微处理器的字长有4位、8位、16位、32位、64位等。8086为16位微处理器,80386、奔腾为32位微处理器。,计算机中数的表示,1.3.1数值数据的表示进位计数制及其相互转换十进制、二进制、八进制和十六进制采用的都是进位计数制,进位计数制中用少量数码按次序排列成数位,并按由低到高的进位方式进行计数。基数和权是进位计数制的两个基本要素。基数是进位计数制中所用数码的个数,基数为r的进位计数制中需要r个数码,每个数位计满r就向高位进一,即逢r进一。在进位计数制表示的数中,同一数字处在不同位置表示不同的值,它所表示的值是该数字乘以一个由它所处位置所决定的常数,这一常数就是该数位所具有的权。r进制数各位的权是以r为底的幂。,数值数据的表示,(1)二进制二进制的表示元素是:0和1。书写时,在数据后面紧跟一个字母B。如:0101B、10101B等。数据的二进制写起来比较长,通常情况下,程序中不直接用二进制来书写具体的数值,而改用八进制、十进制或十六进制。(2)八进制八进制是一种二进制的变形,三位二进制可变为一位八进制,反之也然。八进制的表示元素是:0、1、7。书写时,在数据后面紧跟一个字母Q。如:1234Q、7654Q、54Q等。(3)十进制十进制是我们最熟悉的一种数据表示形式,其基本元素是:0、1、9。书写时,在数据后面紧跟一个字母D。如:1234D、7674D、5411D等。(4)十六进制十六进制是另一种二进制的变形,四位二进制可变为一位十六进制,反之也然。其基本元素是:09、AF、af,其中:AF依次代表1015。书写时,数据后面紧跟一个字母H。当十六进制数的第一个字符是字母时,在其之前必须添加一个0。如:100H、56EFH、0FFH、0ABCDH等。,BCD码,(5)BCD码二进制编码的十进制数(Binary-CodedDecimal)非压缩型BCD码:用一个字节表示一位十进制数,高四位为0000,低四位00001001分别表示09;压缩型BCD码:一个字节表示两位十进制数,高四位表示十位数字,低四位表示个位数字。,十进制压缩的非压缩的1200010010000000010000001062300000110001000110000011000000010000000119100000100100010000000010010000000100000000,不同基数的数之间的转换,二进制数和十进制数之间的转换二进制数转换为十进制数十进制数转换为二进制数举例:1011100.10111B92.71875D二进制数和十六进制数、八进制数之间的转换四位二进制可变为一位十六进制,反之亦然三位二进制可变为一位八进制,反之亦然举例:11010110111111B=35BFH11010110111111B=32677Q十进制数和十六、八进制数之间的转换借助二进制数为桥梁按定义直接转换,1.3.2基本数据类型,(1)字节一个字节有8位二进制组成,其最高位是第7位,最低位是第0位。通常情况下,存储器按字节编址,读写存储器的最小信息单位就是字节。(2)字由2个字节组成一个字,其最高位是第15位,最低位是第0位。高8位称为高字节,低8位称为低字节。(3)双字用2个字(4个字节)来组成一个双字,其高16位称为高字,低16位称为低字。双字有较大的数据表示范围,它通常是为了满足数据的表示范围而选用的数据类型,也可用于存储远指针。(4)四字由4个字(8个字节)组成一个四字类型,它总共有64个二进制位,有更大的数据表示范围,但在汇编语言中很少使用该数据类型。(6)字符串字符串是由若干个字节组成的,字节数不定,通常每个字节存储一个字符。该数据形式是汇编语言程序中经常使用的一种数据形式。,1.3.3数的补码表示,无符号数的表示n位二进制数,其所有状态全部用来表示0和自然数,可表示的范围是02n1。符号数的表示原码、反码、补码把二进制数的最高一位定义为符号位,符号位为0表示正数,符号位为1表示负数;这种在计算机中使用的、连同符号位一起数值化了的数,称为机器数。机器数所表示的真实的数值,称为真值。对于符号数,机器数常用的表示方法有原码、反码和补码三种。数X的原码记作X原,反码记作X反,补码记作X补。原码:最高位表示符号,数值位用二进制绝对值表示的方法;反码:负数的原码符号位保持不变,其余位取反,正数的反码与原码相同。补码:负数的反码加1得到其补码。正数的补码与原码相同。,数的补码表示,举例:写出一个负数的补码。机器字长16位,写出N=117D的补码表示+117表示为:0000000001110101原码为:1000000001110101反码为:1111111110001010补码为:11111111100010110FF8BH,补码的符号扩展,关于补码表示的符号扩展问题对于用补码表示的数,当从位数较少扩展到位数较多时:正数的符号扩展应该在前面用0补足负数的符号扩展应该在前面用1补足举例:若机器字长为8位,则:+46补00101110,46补11010010如果要将两数扩展到16位系统,则+46补0000000000101110,46补1111111111010010,补码的表示范围,n位补码表示数的范围是2n-1N2n-1-1,8位和16位二进制补码表示数的范围,补码的加法和减法,补码的加法规则为:X+Y补X补+Y补补码的减法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论