微机原理第三章汇编语言程序设计.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章汇编语言程序设计第一节机器语言、汇编语言与高级语言一、机器语言与汇编语言计算机完成任何一个特定的功能都是通过执行特定的程序来实现的,程序是一系列指令组成的,计算机通过对每条指令的译码和执行来完成一系列操作。计算机最终能理解并执行的是以二进制代码表示的机器语言。例3-1在内存中有一个数据块,其首地址为Buffer(3000H:0200H),其中存放16位的符号数20个。现要找出其中的最大值,并将其存入MAX字单元(其偏移地址为0228H)。借助8086汇编指令我们可以编写出如下程序:;exm3_1findthelargestnumberandstoreinthemaxunitMOVAX,3000HMOVDS,AXMOVSI,0200HMOVCX,14HDECCXMOVAX,[SI]CHKMAX:ADDSI,2CMP[SI],AXJLENEXTMOVAX,[SI]NEXT:LOOPCHKMAXMOV[0288H],AXINT20H汇编以后机器码在内存中的形式如表3-1所示。表中第三列是汇编语言指令,它是用便于记忆的符号和格式来表示每一条实际的机器指令代码。用机器语言来编写程序很不直观,也是不现实的,特别是对于复杂问题。PC机有专门的汇编程序,可以用汇编语言直接编程。二、汇编语言与高级语言汇编语言程序设计的基本单位仍然是机器指令,只是采用助记符表示,便于人们记忆。因此汇编语言对机器的依赖性很大,称为面向机器的语言。每种机器都有它专用的汇编语言,在一种机器上用的汇编语言程序很难搬到另一种机器上使用,即不具备通用性和可移植性。汇编语言程序设计员必须对机器的硬件及软件资源有足够的了解才能设计程序。尽管如此,各种汇编语言在基本原理、基本概念和基本编程方法等方面是相同或相近的。高级语言,如BASIC、FORTRAN、C语言等是进一步发展了的计算机语言。它们是面向过程的语言,不依赖于机器,因而有很好的通用性和可移植性,而且用高级语言设计具有很高的程序设计效率。高级语言优点很多,还要学习汇编语言的理由如下:(1)汇编语言仍然是各种系统软件(如操作系统)设计的基本语言。虽然有人用C语言来编写系统软件,但是要将它翻译成机器语言,还必须用到汇编语言。(2)用汇编语言编写的程序一般比用高级语言编写的程序执行得快,且所占内存较少。(3)在许多实时控制系统中,高级语言并不完全适合,汇编语言就是不可缺少的了。特别是在直接有效地利用机器硬件功能方面,比如中断等就都少不了汇编语言。(4)用高级语言开发中,有时需要编写一些非标准过程,而高级语言可能并不支持。这时就需用汇编语言来补充高级语言在某些特定领域中的功能不足。(5)学习汇编语言对于学习计算机硬件组成及工作原理是十分重要的。三、汇编与连接用汇编语言设计程序首先应根据任务编写汇编语言源程序,文件类型一般标为ASM文件。汇编语言源程序编写有许多规则和方法,本章将予以介绍。可以用各种文本编辑软件建立源文件,如全屏幕编辑软件EDIT,还有WORD等,ASM文件采用ASCII码。通常文件名的后缀是.ASM。汇编语言源程序必须经过翻译才能变为二进制机器代码。在计算机中完成这种翻译工作的软件叫汇编程序或汇编器(Assembler)。MASM.EXE就是汇编程序。如果源程序名为:SAMPLE.ASM则用命令:C:MASMSAMPLE.ASM就可产生目标程序,文件类型一般标为OBJ。为了便于程序调试,同时还产生列表文件,一般标为LST。目标文件一般还不是可执行的程序,目标文件并没有最终解决机器的寻址问题。程序究竟装在内存的哪个区域?目标文件没有指定。另外,多个不同的目标文件以及库文件LIB可以组合在一起形成一个更大的文件。连接装配程序LINK.EXE则用来把指定的目标文件和库文件组装成一个完整的程序文件,并且完成相对地址的调整和对变量引用的处理。在汇编后再用LINK命令:C:LINKSAMPLE则产生SAMPLE.EXE,这是一个可执行文件。EXE文件除了程序、数据等代码之外,还包含一个文件头。这个文件头也称程序段前缀PSP,占256个字节。文件头中包含了操作系统中的装入程序在把该EXE文件装入内存时所需要的有关信息,如重定位表和初始化有关段寄存器信息等。PSP的头两个字节是一条INT20H指令,即返回DOS指令。当一个用户程序运行结束时,可以通过把控制返回给PSP中的这条指令而终止自已的进程。这是由用户程序返回操作系统的传统方法。当DOS加载一个可执行文件的程序代码到内存中去时,它首先为该程序建立一个程序段前缀PSP,然后把可执行的程序代码加载到PSP后续的地址上。(即CS指向地点),而DS和ES初始化在PSP的起始地址。DOS装入EXE文件后的内行分配如图所示。第二节汇编语言源程序的结构如果把例3-1改写为标准的汇编语言源程序,就可以用MASM命令进行汇编,则源程序如下:;exm3_1.asmfindthelargestnumberand;storeinthemaxunitdatasegmentorg0200hbufferdw0,1,-5,10,256,-128,-100,45,6dw3,-15,-67,39,4,20,-1668,-32766dw32765,-525,300countequ($-buffer)/2maxdw?dataendsstacksegmentstack’stack’db100dup(’s’)stackendscodesegmentpara’code’assumecs:code,ds:data,ss:stackstaprocfarpushdsxorax,axpushaxmovax,datamovds,axleasi,buffermovcx,countdeccxmovax,[si]chkmax:addsi,2cmp[si],axjlenextmovax,[si]next:loopchkmaxmovmax,axretstaendpcodeendsendsta一、汇编语言的语句格式下面分析汇编语言源程序的结构。汇编语言包含两类语句:CPU指令语句和汇编语言伪指令语句。指令语句指定CPU做什么操作,如第二章所述;伪指令语句指定汇编器作何种操作,这是这一章要学习的。指令语句都有对应的机器码,而伪指令语句一般不产生机器码(只有少数一些数据定义伪指令会产生机器代码)。1.指令语句的格式汇编语言的CPU指令语句格式如下:[label:]memonic[operand][,operand][;comments]标号域助记符域操作数域注释域四个域中只有助记符域是必不可缺的,其他的域都是可选的。助记符域是指令的操作码助记符,如MOV、ADD、SUB等等。助记符域与操作数域之间至少应留有一个空格。两个操作数之间要有逗号分开。标号一般为转移指令提供目标地址的符号名,例如上例中的CHKMAX。程序员不必去计算相对转移的地址偏移量,汇编器会自动完成这一工作。标号后面跟一个冒号。伪指令前的名字不能后跟冒号。注释域以分号打头。汇编语言中的标号或名字或其他变量名必须是由字母或特殊字符打头的字母数字串,中间不能有空格。合法的字符包括:字母:A~Z或a~z数字:0~9特殊字符:问号(?)、圆点(.)、@、下横线(_)和美元符号($),圆点只能作为第一个字符。标号和名字的长度不超过31个字符,超过部分均被删去。2.汇编伪指令的格式伪指令是针对汇编程序的命令。它可以用来定义段和过程、定义语句、分配内存空间以及完成各种与程序设计有关的重要说明。汇编伪指令也有四个域:[名字]伪指令[操作数][注释]一般来说,只有伪指令域是必须的。对于某些伪指令,名字域也是必须的,但是要注意的是名字域后面不能用冒号(:)相随。域与域之间用空格隔开。伪指令的操作数域是可选的,它可以有多个操作数,只受行长度的限制。有的伪指令操作数域部分的各操作数之间要求用逗号(,)分开,而有些伪指令则要求用空格分开,必须严格遵循有关规定。二、汇编语言源程序的段定义汇编语言源程序的段定义与内存的分段组织直接相关。典型的程序包含代码段、数据段和堆栈段。SEGMENT和ENDS伪指令用于定义各种段。它们的语句格式如下:段名字SEGMENT[可选项](段模块)段名字ENDS段名字必须在两处出现,而且必须一致。SEGMENT和ENDS必须成对出现。SEGMENT定义一个段的开始,ENDS定义一个段的结束。SEGMENT语句可以有三种可选项:定位类型、连接方式和类别。可选项之间用空格符或制表符TAB分开。格式如下:段名SEGMENT[定位类型][连接方式][‘类别’]1.定位类型定位类型指明该段进入内存时从何种类型的边界开始。有四种定位类型:PAGE、PARA、WORD、BYTE。起始地址分别是:PAGE:××××××××××××00000000BPARA:××××××××××××××××0000BWORD:×××××××××××××××××××0BBYTE:××××××××××××××××××××B分别表示以页、段、字、字节为起始地址。若缺省则隐含为PARA。2.连接方式连接方式告诉链接程序本段与其他段的关系。共有六种方式。NONE表示本段与其他段在逻辑上没有关系,每段都有自己的基址。这是隐含方式。PUBLIC链接程序把本段与同名同类别的其他段连接成一个段。STACK表示此段为堆栈段。连接时将所有STACK连接方式的同名段连接成一个段。程序中必须至少有一个STACK段,否则用户必须指令初始化SS和SP;若有多个,初始化时SS指向第一个STACK段。COMMON链接程序为本段和同名同类型的其他段指定相同的基址,因而本段将与同名同类别的其他段相覆盖。段的长度为最长的COMMON段的长度。AT表达式链接程序把本段装在表达式的值所指定的段地址上。例:AT1234H,该段的首地址为12340H。MCODESEGMENTAT2050H;该段从20508H开始,ORG0008H;ORG伪指令给定偏移地址值START:MOVAX,0;该指令与段基址偏移8个字节………….MCODEENDSMEMORY链接程序把本段定位在其他所有同名段之上(即地址较大的区域)。若有多个MEMORY段,则第一个按MEMORY方式处理,其余均按COMMON方式处理。3.类别类别必须用单引号括起来。类别指定同样只在模块连接时才需要。一般对于堆栈段总定义类别为‘STACK’;对代码段通常指定类型为‘CODE’;对数据段则指定为‘DATA’。如果一个程序不准备和其他程序组合,也可以不指定类别。类别名可由用户任意设定。链接程序把类别名相同的段(段名未必相同)放在连续的存储区间内。但仍为不同的段(连接方式为PUBLIC、COMMON的段除外)。在前面例子中的堆栈段定义如下:STACKSEGMENTPARASTACK‘STACK’堆栈段名定位连接方式类别在堆栈段里一般只要简单地定义一下堆栈段空间大小就行了。如DB100DUP(?)语句为堆栈分配了100个字节的空间。堆栈空间的大小取决于程序如何使用堆栈。最大不能超过64KB。定义堆栈空间时还可以给字节以初始化,例如:DB100DUP(‘STACK’)不仅分配了500个字节的堆栈空间。而且还把这个空间初始化为重复100次的’STACK’字符串。其目的是为了在查看内存分配以调试程序时可以方便地找到堆栈空间。一般应直接定义为字空间:DW20DUP(?)三、汇编语言的过程定义代码段的内容主要是程序的可执行码。一个代码段可以由一个或几个过程(子程序)组成,仅由一个过程组成的代码段其形式如下:段名SEGMENT过程名PROCFAR;过程定义语句……;过程体RET过程名ENDP;过程定义结束段名ENDS过程定义由伪指令PROC和ENDP完成。PROC后面的参数指定该过程的属性。属性为FAR代表这个过程是段际过程,属性为NEAR表示该过程是段内过程,省缺时代表NEAR过程。一个程序的主程序通常是FAR过程,如前面例子。但一般主程序不写成过程的形式,举例见后。PROC和ENDP必须成对出现

1 / 132
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功