资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章汇编语言程序设计,本章内容,汇编语言中的伪指令,汇编语言程序举例,汇编语言的汇编,第四章 汇编语言程序设计,计算机程序设计语言通常分为三类:,机器语言:能被计算机直接识别和执行,但它不易为人们编写和阅读,因此,人们一般不再用它来进行程序设计。,高级语言:一种面向过程和问题并能独立于机器的通用程序设计语言,是一种接近人们自然语言和常用数字表达式的计算机语言。编程的速度快而且编程者不必熟悉机器内部的硬件结构而可以把主要精力集中于掌握语言的语法规那么和程序的结构设计方面。但程序执行的速度慢且占据的存储空间较大。,汇编语言:一种面向机器的语言,它的助记符指令和机器语言保持着一一对应的关系。也就是说,汇编语言实际上就是机器语言的符号表示。用汇编语言编程时,编程者可以直接操作到机器内部的存放器和存储单元,能把处理过程描述得非常具体。因此通过优化能编制出高效率的程序,即可节省存储空间又可提高程序执行的速度,在空间和时间上都充分发挥了计算机的潜力。在实时控制的场合下,计算机的监控程序大多采用汇编语言编写。,第一节 伪指令及汇编语言源程序汇编,一、伪指令,伪指令:不属于指令集中的指令,在汇编时不产生目标代码,不影响程序的执行,仅指明在汇编时执行一些特殊的操作。,例如,为程序指定一个存储区,将一些数据、表格常数存放在指定的存储单元,对位地址赋用户名称,说明源程序段或数据块起始地址等。,1、定义起始地址伪指令ORG,格式:ORG 操作数,说明:操作数为一个16位的地址,它指出了下面的那条指令的目标代码的第一个字节的程序存储器地址。在一个源程序中,可以屡次定义ORG伪指令,但要求规定的地址由小到大安排,各段之间地址不允许重复。,例:ORG 0000H,LJMP MAIN,ORG 1000H,MAIN:MOV A,30H,ADD A,20H,2、定义赋值伪指令EQU,格式:字符名称 EQU 操作数,说明:该指令是用来给字符名称赋值。在同一个源程序中,任何一个字符名称只能赋值一次。赋值以后,其值在整个源程序中的值是固定的,不可改变。对所赋值的字符名称必须先定义赋值后才能使用。其操作数可以是8位或16位的二进制数,也可以是事先定义的表达式。,例:BUF EQU 58H;字符名称BUF的值等于58H,LOOP EQU 2000H;LOOP为2000H,作为16位地址,3、定义数据地址赋值伪指令DATA,格式:字符名称 DATA 操作数,说明:DATA伪指令的功能和EQU伪指令相似,不同之处是DATA伪指令所定义的字符名称可先使用后定义,也可先定义后使用。在程序中它常用来定义数据地址。,4、定义字节数据伪指令DB,格式:标号:DB数据表,说明:该伪指令是用来定义假设干字节数据从指定的地址单元开始存放在程序存储器中。数据表是由8位二进制数或由加单引号的字符组成,中间用逗号间隔,每行的最后一个数据不用逗号。,DB伪指令确定数据表中第一个数据的单元地址有两种方法,一是由ORG伪指令规定首地址,二是由DB前一条指令的首地址加上该指令的长度。,例:ORG 1050H,TAB:DB 44H,24H,00H,81H,DB 24H,14H,00H,42H,DB 96H,40H,C,g,5、定义双字节数据伪指令DW,格式:标号:DW数据表,说明:该伪指令与DB伪指令的不同之处是,DW定义的是双字节数据,而DB定义的是单字节数据,其他用法都相同。在汇编时,每个双字节的高8位数据要排在低地址单元,低8位数据排在高地址单元。,6、定义预留空间伪指令DS,格式:标号:DS操作数,说明:该伪指令是用于告诉汇编程序,从指定的地址单元开始如由标号指定首址,保存由操作数设定的字节数空间作为备用空间。要注意的是DB、DW、DS伪指令只能用于程序存储器,而不能用于数据存储器。,例:ORG 1200H,LOOP:DS 0AH,7、定义位地址赋值伪指令BIT,格式:字符名称BIT位地址,说明:该伪指令只能用于有位地址的位片内RAM和SFR块中,把位地址赋予规定的字符名称,常用于位操作的程序中。,例:X0 BIT 00H,X1 BIT 01H,8、定义汇编结束伪指令END,格式:标号:END,说明:汇编结束伪指令END是用来告诉汇编程序,此源程序到此结束。在一个程序中,只允许出现一条END伪指令,而且必须安排在源程序的末尾。否那么,汇编程序遇到END伪指令就结束,对END伪指令后面的所有语句都不进行汇编。通常在END前不用标号。,例如:MOV A,30H,ADD A,31H,MOV 32H,A,END,第二节、汇编语言源程序汇编,用汇编语言编写的源程序称为汇编语言源程序。但是单片机不能直接识别在汇编语言中出现的助记符、字母、数字、符号,需要通过汇编将其转换成用二进制代码表示的机器语言程序,才能够识别和执行。汇编通常由专门的汇编程序来进行,通过编译后自动得到对应于汇编源程序的机器语言目标程序,这个过程叫机器汇编。另外还可用人工汇编。,1、汇编程序的汇编过程,汇编过程是将汇编语言源程序翻译成目标程序的过程。机器汇编通常是在计算机上与MCS一51单片机仿真器联机通过编译程序实现汇编。汇编程序是两次扫描。第一次扫描是进行语法检查并建立该源程序使用的全部符号地址表。在这个表中,每个符号地址后面跟着一个对应的值。第一次扫描中如有错误那么显示出错信息,扫描完,显示出错数目,然后返回编辑状态。这时可对源程序进行修改。如没有错误可进行第二次扫描,最后生成目标程序的机器码并得到对应于符号地址即标号地址的实际地址值。第二次扫描还产生相应的列表文件,此文件中有与每条源程序相对应的机器码、地址和编辑行号以及标号地址的实际地址等,可作为程序调试时使用。,2、人工汇编,由程序员根据MCS-51的指令集将汇编语言源程序的指令逐条人工翻译成机器码的过程叫人工汇编。人工汇编同样采用两次汇编方法。第一次汇编,首先查出各条指令的机器码,并根据初始地址和各条指令所占的字节数,确定每条指令所在的地址单元。第二次汇编,求出标号地址所代表的实际地址及相对应地址偏移量的具体补码值。,第三节 汇编语言程序设计举例,汇编语言程序设计通常的步骤是:,1建立数学模型根据课题要求,用适当的数学方法来描述和建立数学模型。,2确定算法,绘制程序流程图算法是程序设计的根本依据。程序流程图是编程时的思路表达。,3编写源程序合理选择和分配内存单元、工作存放器。按模块结构具体编写源程序。,4汇编及调试程序通过汇编生成目标程序,经过屡次调试,对程序运行结果进行分析,不断修正源程序中的错误,最后得到正确结果,到达预期目的。,编写一个应用系统的汇编语言源程序,其程序结构一般有顺序结构、分支结构、循环结构、子程序结构等,如下图。下面主要介绍几种根本的程序设计方法。,一、顺序程序设计,顺序程序:各类结构化程序块中最简单的一种。它按程序执行的顺序依次编写,在执行程序过程中不使用转移指令,只是顺序执行。,例 把A中的压缩BCD码转换成二进制数。,解:此程序采用将A中的高半节十位乘以10,再加上A的低半字节个位的方法。编程如下:,MOV R2,A;暂存,ANL A,F0H;屏蔽低4位,SWAP A,MOV B,10,MUL AB;A中高半字节乘10,MOV R3,A,MOV A,R2;取原BCD数,ANL A,0FH;取BCD数个位,ADD A,R3;个位与十位数相加,RET,二、分支程序的设计,分支程序主要是根据判断条件的成立与否来确定程序的走向。因此在分支程序中需要使用控制转移类指令。可组成简单分支结构和多分支结构。在程序设计时常借助程序框图来指明程序的走向。,一般情况下,每个选择分支均需有单独一段程序,在程序的起始地址赋予一个地址标号,以便当条件满足时转向指定地址单元去执行相应的程序。,1、单分支选择结构,当程序的判断仅有两个出口,两者选一,称为单分支结构。通常用条件判断指令来选择并确定程序的分支出口。这类单分支选择结构有三种典型的形式,见图。,1图a,当条件满足时执行分支程序2,否那么执行分支程序1。,2图b,当条件满足时跳过程序段1,从程序段2执行,否那么顺序执行程序段1,再执行程序段2。,3图c,这是分支结构的一种特殊形式。当条件满足时,停止执行程序段1。,例 设内部RAM 40H和41H单元中存放2个8位无符号二进制数,试编程找出其中的大数存人30H单元中。,解:MOV A,40H,CJNE A,41H,LOOP;取2个数进行比较,LOOP:JNC LOOP1;根据CY值,判断单分支出口,MOV A,41H;41H单元中是大数,LOOPl:MOV 30H,A;40H单元中是大数,2、多分支选择结构,当程序的判别局部有两个以上的出口流向时,称为多分支选择结构。一般有两种形式,见图。,例:设变量X的值存放在内部RAM的30H单元中,编程求解以下函数式,将求得的函数值Y存入40H单元。,X1 X100,Y 0 10X100,X一1 X10,解:自变量X的值在三个不同的区间所得到的函数值Y不同,编程时要注意区间的划分。程序流程图如图4一4所示。程序如下:,MOV A,30H;取自变量X值,CJNE A,#10,LOOP;与10比较,A中值不改变,LOOP:JC LOOP2;假设X100,转LOOP3,MOV 40H,00H;因10X100,故Y=0,SJMP EXIT,LOOP2:DEC A;因X100,故Y=X1,MOV 40H,A,EXET:RET,例 某温度控制系统,采集的温度值Ta放在累加器A中。此外,在内部RAM54H单元存放控制温度下限值T54,在55H单元存放控制温度上限值(T55)。假设TaT55,程序转向JW降温处理程序;假设TaT54,那么程序转向SW升温处理程序;假设T55TaT54,那么程序转向FH返回主程序。有关程序段如下:,CJNE A,55H,I.OOP1;Ta55,转向LOOP1,AJMP FH;Ta=T55,返回,I.OOPl:JNC JW;(CY)=0,说明TaT55,转降温处理程序,CJNE A,54H,LOOP2;TaT54,转向LOOP2,AJMP FH;Ta=T54,返回,LOOP2:JC SW;(CY)1,说明TaT54,转升温处理程序,FH:RET;T55TaT54,返回主程序,三、循环程序设计,1、循环结构的组成,循环结构由4局部组成:初始化局部、循环处理局部、循环控制局部和循环结束局部。循环结构组成图见图。,1初始化局部用来设置循环处理之前的初始状态,如循环次数的设置、变量初值的设置、地址指针的设置等。,2循环处理局部又称为循环体,是重复执行的数据处理程序段,它是循环程序的核心局部。,3循环控制局部这局部用来控制循环继续与否。在重复执行循环体的过程中,不断修改和判断循环控制变量,直到满足结束循环的条件为止。它通常由修改地址指针、修改控制变量和检测判断循环结束条件等三局部组成。,4结束局部这局部是对循环程序全部执行结束后的结果进行分析、处理和保存。,典型循环结构见图所示。图a为先处理后判断的结构,图b为先判断后处理的结构。,根据循环程序的结构不同也可分为单重循环和多重循环。,对循环次数的控制有多种:循环次数是的,可用循环次数计数器控制循环;假设循环次数是未知的,可以按条件控制循环。,2循环程序设计,在一个循环程序的循环体中不包含另外的循环结构称为单重循环。,例 设有一字符串以回车符为结束标志,并存放在内部RAM40H单元开始的连续存储单元中,编写测试字符串长度的程序。,分析:为测试字符串的长度,应使用逐个字符依次与回车符(ODH)比较的方法。为此需要设里一个字符串指针和一个长度计数器,字符串指针用于指定字符,长度计数器用于累加字符串的长度。如比较不相等,那么长度计数器和字符串指针都加1,以继续往下比较;如果比较相等,那么表示该字符为回车符,字符串结束,长度计数器的值就是字符串的长度。,MOV R7,0FFH;设里长度计数器初
展开阅读全文