您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 单片机原理与C51基础赵丽清-第4章汇编语言程序设计
第4章:汇编语言程序设计第4章目录4.1汇编语言程序概述4.1.1源程序的编辑和汇编4.1.2伪指令4.1.3汇编语言程序设计步骤4.2汇编语言程序设计4.2.1顺序程序设计4.2.2分支程序设计4.2.3循环程序设计4.3子程序及其调用4.3.1子程序的设计注意事项4.3.2参数传递4.1汇编语言程序概述4.1.1源程序的编辑和汇编–为了克服机器语言难读、难记忆的缺点,人们采用英文字符来代替这些机器码,这些英文字符被称作助记符。–用助记符表示的指令称为汇编语言。用汇编语言编写程序的过程称为汇编语言的程序设计。–汇编语言程序只有转变成二进制的机器语言单片机才能认识和执行。同常把这一“翻译”过程称为编译或汇编。能够完成这一翻译过程的软件称为汇编程序或编译器。–经过编译或汇编得到的能够下载(烧录)到单片机中的0、1的代码称为目标程序。4.1汇编语言程序概述4.1.1源程序的编辑和汇编1、源程序的编辑–现在单片机应用系统的程序编辑工作几乎都借助于个人PC机来完成。Keil或WAVE等集成开发环境都具有编辑功能。编写好的汇编语言源程序应以“*.ASM”扩展名存盘,以备编译器调用。2、源程序的汇编–将汇编语言源程序转换为机器码这个转换过程称为汇编或编译,能完成该转换功能的软件称为编译器。–汇编常用的方法有两种:一是手工汇编,二是机器汇编。•①手工汇编时,把程序用助记符指令写出后,人为查找指令代码表,逐个把助记符指令翻译成机器码。•②机器汇编是在计算机上使用编译软件对源程序进行汇编。4.1汇编语言程序概述4.1.2伪指令–伪指令是程序员发给编译器的命令,“伪”表示其不能命令CPU执行某种操作,也没有对应的机器代码,伪指令也称为编译器的控制命令。–伪指令具有控制汇编程序的输入/输出、定义数据和符号、分配存储空间等功能。4.1汇编语言程序概述4.1.2伪指令1、汇编起始伪指令ORG格式:[标号:]ORG16位地址(符号地址也可)功能:规定程序块或数据块存放的起始地址。例如:ORG8000H(符号地址也可)START:MOVA,#30H……该伪指令规定第一条指令在ROM中从地址8000H单元开始存放,即标号START的值为8000H。4.1汇编语言程序概述4.1.2伪指令1、汇编起始伪指令ORG–通常,在一个汇编语言源程序的开始,都要设置一条ORG伪指令来指定该程序在存储器中存放的起始位置。若省略ORG伪指令,则该程序段从0000H单元开始存放。–在一个源程序中,可以多次使用ORG伪指令,以规定不同程序段或数据段存放的起始地址,但在源程序中,要求16位地址值由小到大顺序排列,且不允许空间重叠。例如:ORG2000H……ORG2500H……ORG3000H4.1汇编语言程序概述4.1.2伪指令1、汇编起始伪指令ORG这种顺序是正确的。若按下面的顺序排列则是错误的,因为地址出现了交叉。ORG2500H……ORG2000H……ORG3000H4.1汇编语言程序概述4.1.2伪指令2、汇编结束伪指令END格式:[标号:]END[表达式]功能:结束汇编。汇编程序遇到END伪指令后即结束汇编。处于END之后的源程序将不被汇编。该指令在源程序的最后一行,且只能在程序中出现一次。4.1汇编语言程序概述4.1.2伪指令3、字节数据定义伪指令DB格式:[标号:]DB8位字节数据表功能:从标号指定的地址单元开始,将数据表中的字节数据按顺序依次存入。数据表可以是一个或多个字节数据、字符串或表达式,各项数据用“,”分隔,一个数据项占一个存储单元。•例如:ORG1000H•TAB:DB-2,-4,100,30H,‘A’,‘C’•……•汇编后:(1000H)=0FEH,(100lH)=0FCH,(1002H)=64H,(1003H)=30H,(1004H)=41H,(1005H)=43H。用单引号括起来的字符以ASCII码存入,负数用补码存入。4.1汇编语言程序概述4.1.2伪指令4、字数据定义伪指令DW格式:[标号:]DW16位字数据表功能:从标号指定的地址单元开始,将数据表中的字数据按从左到右的顺序依次存入程序存储器中。注意:16位数据存入时,先存高8位,后存低8位。例如:ORG1400HDATA:DW324AH,3CH……汇编后:(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH4.1汇编语言程序概述4.1.2伪指令5、赋值伪指令EQU格式:符号名EQU常值表达式或符号名=常值表达式功能:将表达式的值定义为一个指定的符号名。LENEQU10HSUNEQU41HBLOCKEQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUN,A该指令的功能是把22H单元开始存放的10个数进行求和,并将结果送入21H单元。注意:用EQU定义的符号不允许重复定义,用“=”定义的符号允许重复定义。4.1汇编语言程序概述4.1.2伪指令6、定义位地址为符号名伪指令BIT格式:符号名BIT位地址该指令的功能是将位地址赋给指定的符号名。位地址表达式可以是绝对地址,也可以是符号地址。如:STBITP1.0;将P1.0的位地址赋给符号名STCFBIT0D7H;将位地址为D7H的位定义为符号名CF注意:用BIT定义的“符号名”不允许重复定义。4.1汇编语言程序概述4.1.3汇编语言程序设计步骤使用汇编语言设计一个程序大致上可分为以下几个步骤。(1)分析题意,明确要求。(2)确定算法。(3)画程序流程图,用图解来描述和说明解题步骤。(4)分配内存工作单元,确定程序与数据区存放地址。(5)编写源程序。(6)程序优化。(7)上机调试、修改和最后确定源程序。4.2汇编语言程序设计4.2.1顺序程序设计顺序结构程序是一种最简单、最基本的程序(也称为简单程序),它是一种无分支的直线形程序,按照程序编写的顺序依次执行。【例4-2】设一个2位十进制数的十位数字以ASCII码的形式存放在片内RAM的31H单元,32H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在30H单元。4.2汇编语言程序设计4.2.1顺序程序设计解:由于ASCII码30H~39H对应BCD码的0~9,所以只要保留ASCII的低4位,而高4位清零即可。实现程序如下:ORG0040HSTART:MOVA,31H;取十位ASCII码ANLA,#0FH;保留低半字节SWAPA;移至高半字节MOV20H,A;存于20H单元MOVA,32H;取个位ASCII码ANLA,#0FH;保留低半字节ORL20H,A;合并到结果单元SJMP$4.2汇编语言程序设计4.2.2分支程序设计1、单分支选择结构程序的判别仅有两个出口,两者选一,称为单分支选择结构,它在程序设计中的应用极为普遍。【例4-3】求单字节有符号数的二进制补码,设待求数据存放于累加器A中。解:正数补码是其本身,负数补码是其反码加1。因此,程序应首先判断被转换数的符号,负数进行转换,正数本身即为补码。参考程序如下:CMPT:JNBAcc.7,RETU;(A)0,不需转换MOVC,Acc.7;符号位保存CPLA;(A)求反,加1ADDA,#1MOVAcc.7,C;符号位存在A的最高位RETU:RET4.2汇编语言程序设计4.2.2分支程序设计2、多分支选择结构当程序的判别部分有两个以上的出口流向时,为多分支选择结构。【例4-4】已知40H单元内有一自变量X,其以补码的形式存放,按如下条件编写程序求Y的值,并存入41H单元。4.2汇编语言程序设计4.2.2分支程序设计2、多分支选择结构解:ORG2000HXY:MOVA,40H;A←(40H)JZDONE;X=0,转DONEJNBACC.7,POS;X0,转POSMOVA,#0FFH;X0,A←-1的补码SJMPDONE;转DONEPOS:MOVA,#01H;A←+1DONE:MOV41H,A;存Y值RET4.2汇编语言程序设计4.2.3循环程序设计在很多实际程序中会遇到需多次重复执行某段程序的情况,这时可把这段程序设计为循环程序,这有助于缩短程序,同时也节省了程序的存储空间,提高程序的质量。1、当型、直到型循环当型循环,是指在执行循环体之前,先判断某一个条件是否为真。如果是真,则执行循环体,否则将结束循环。执行完循环体之后继续判断条件,如果仍为真,再度执行循环体。如此周而复始,直至条件为假的时候为止。直到型循环,是指在判断某一个条件之前,首先执行循环体。然后再判断某一条件是否为真。若是真,那么再度执行循环体,执行完循环体后又接着判断条件。如此循环往复,直到给定条件的逻辑值为假时便退出循环。4.2汇编语言程序设计4.2.3循环程序设计1、当型、直到型循环在单片机的指令系统中没有能直接完成这两种类型循环的指令,但通过条件转移指令与无条件转移指令的配合使用,就可以实现上述两种循环。循环程序一般由四部分组成:(1)置循环初值。即设置循环过程中有关工作单元的初始值,如置循环次数、地址指针及工作单元清零等。(2)循环体。即循环的工作部分,完成主要的计算或操作任务,是重复执行的程序段。这部分程序应特别注意,因为它要重复执行许多次,若能少写一条指令,实际上就是少执行某条指令若干次,因此应注意优化程序。(3)循环修改。每循环一次,就要修改循环次数、数据及地址指针等。(4)循环控制。根据循环结束条件,判断是否结束循环。4.2汇编语言程序设计4.2.3循环程序设计1、当型、直到型循环【例4-5】编写查找最大值程序。假设从内部RAM30H单元开始存放10个无符号数,找出其中的最大值送入内部RAM的MAX单元。解:寻找最大值的方法很多,最基本的方法是比较和交换依次进行的方法,即先取第一个数和第二个数比较,并把前一个数作为基准,若比较结果基准数大,则不做交换,再取下一个数来做比较;若比较结果基准数较小,则用较大的数来代替原有的基准数,即做一次交换。然后再以基准数和下一个数做比较。总之,要保持基准数是到目前为止最大的数,比较结束时,基准数就是所求的最大值。4.2汇编语言程序设计4.2.3循环程序设计程序如下:ORG0200HMOVR0,#30H;数据首地址送R0MOVA,@R0;取第一个数做基准数送AMOVR7,#09H;比较次数送计数器R7LOOP:INCR0;修改地址指针,指向下一地址单元MOV40H,@R0;要比较的数暂存40H中CJNEA,40H,CHK;两数作比较CHK:JNCLOOP1;A大,则转移MOVA,@R0;A小,则将较大数送ALOOP1:DJNZR7,LOOP;计数器减1,不为零,继续MOVMAX,A;比较完,存结果END4.2汇编语言程序设计4.2.3循环程序设计1、当型、直到型循环【例4-6】编写数据检索程序。假设从内部RAM60H单元开始存放着32个数据,查找是否有“$”符号(其ASCII码为24H),如果找到就将数据序号送入内部RAM2FH单元,否则将FFH送入内部RAM2FH单元。解:数据检索就是在指定数据区中查找关键字。比如在考勤系统中,有时需要查找某个职工上下班情况,或磁卡就餐系统中将某个磁卡挂失或销户等就属于这类问题,所以其实有价值较高。4.2汇编语言程序设计4.2.3循环程序设计程序如下:ORG0300HMOVR0,#60H;数据区首地址送R0MOVR7,#20H;数据长度送计数器R7MOV2FH,#00H;工作单元清零LOOP:MOVA,@R0;取数送ACJNEA,#24H,LOOP1;与“$”比较,不等转移SJMPHERE;找到,转结束(序号在2FH单元)LOOP1:INCR0;修改地址指针INC2FH;序号加1DJNZR7,LOOP;计数器减1,不为零,继续MOV2FH,#0FFH;未找到,标志送2FH单元HERE:AJMPHERE;程序结束END4.2汇编语言程序设计4.2.3循环程序设计1、循环嵌套循环
本文标题:单片机原理与C51基础赵丽清-第4章汇编语言程序设计
链接地址:https://www.777doc.com/doc-4026577 .html