资源描述
第四章第四章 80C5180C51汇编语言程序设计汇编语言程序设计主要内容:主要内容:顺序程序的设计顺序程序的设计循环程序的结构与设计循环程序的结构与设计子程序结构与设计子程序结构与设计教学目的通过通过本章学习,使学生:本章学习,使学生:了解汇编语言源程序的结构了解汇编语言源程序的结构掌握使用汇编语言进行程序设计掌握使用汇编语言进行程序设计4.1 4.1 汇编语言汇编语言程序程序设计的步骤与设计的步骤与基本结构基本结构1.1.汇编语言程序设计的基本步骤汇编语言程序设计的基本步骤使使用用程程序序设设计计语语言言编编写写程程序序的的过过程程称称为为程程序序设设计计。在在程程序序设设计计过过程程中中,应应在在完完成成规规定定功功能能的的前前提提下下,使使程程序序占占用用空空间间小小,执执行行时时间间短短。同同时时,在在程程序序设设计计时时要要按按照照规规定定的步骤进行。的步骤进行。程序设计步骤如下:程序设计步骤如下:(1 1)分析问题,确定算法和解题思路。)分析问题,确定算法和解题思路。(2 2)根据算法和解题思路画出程序流程图。)根据算法和解题思路画出程序流程图。(3 3)根据流程图编写程序。)根据流程图编写程序。(4 4)程序调试,找出错误更正后再调试直至通过。)程序调试,找出错误更正后再调试直至通过。(5 5)编写相关说明。)编写相关说明。2.2.程序的基本结构程序的基本结构n由于所处理的问题不同,不同程序的结构也就不尽相由于所处理的问题不同,不同程序的结构也就不尽相同。但是,结构化程序的基本结构只有三种:顺序结同。但是,结构化程序的基本结构只有三种:顺序结构、分支结构、循环结构。三种基本结构的流程图:构、分支结构、循环结构。三种基本结构的流程图:图图4.1 4.1 程序的基本结构流程程序的基本结构流程4.24.2 汇编语言程序程序设计汇编语言程序程序设计n顺顺序序结结构构的的程程序序多多用用来来处处理理比比较较简简单单的的问问题题。特特点点是是:程程序序中中的的语语句句由由前前向向后后顺顺序序执执行行,最最后一条指令执行完毕,整个程序也随之结束后一条指令执行完毕,整个程序也随之结束4.2.1 4.2.1 顺序程序设计顺序程序设计例例4.1 4.1 将将20H20H中存放的压缩中存放的压缩BCDBCD数转换成二进制数数转换成二进制数存放在累加器存放在累加器A A中。中。编程如下:编程如下:ORGORG1000H1000HSTARTSTART:MOVMOVA A,20H20H;取数,(;取数,(A A)(20H20H)ANLANLA A,#0F0H#0F0H;屏蔽低;屏蔽低4 4位位SWAPSWAP A A;高低;高低4 4位互换位互换MOVMOVB B,#0AH#0AH;(;(B B)1010MULMULABAB;BCDBCD数的高数的高4 4位乘以位乘以1010MOVMOVB B,A A;乘积暂存;乘积暂存B BMOVMOVA A,20H20H;取数;取数ANLANLA A,#0FH#0FH;屏蔽高;屏蔽高4 4位位ADDADDA A,B B;得到结果;得到结果ENDEND例例4.2 4.2 设设两两个个1616位位无无符符号号数数,分分别别存存放放在在30H30H、31H31H单单元元和和32H32H、33H33H单单元元,求求它它们们的的和和,结结果果保保存存在在34H34H和和35H35H单元中。默认为(低字节和高字节)单元中。默认为(低字节和高字节)编程如下:编程如下:MOVMOVA A,30H30HADD A ADD A,32H32HMOVMOV34H 34H,A AMOV MOV A A,31H31HADDCADDCA A,33H33HMOVMOV35H 35H,A A例例4.3 4.3 将内部将内部RAM30HRAM30H单元的高单元的高4 4位和位和31H31H单元的低单元的低4 4位拼成一个数,存入位拼成一个数,存入32H32H单元。单元。编程如下:编程如下:MOV A MOV A,30H30HANLANLA A,0F0H0F0HMOV 32H MOV 32H,A AMOV A MOV A,31H31HANL A ANL A,#0FH#0FHORLORLA A,32H32HMOVMOV32H 32H,A A例例4.4 4.4 计算计算Y=X1+X2Y=X1+X2X3X3X1=38H X1=38H ,X2=2AH X2=2AH,X3=19H X3=19H ,Y=BUFY=BUF编程如下:编程如下:START:START:MOVMOVA A,#38H#38H ADDADDA A,#2AH#2AHCLRCLRC CSUBBSUBB A A,#19H#19HMOVMOVBUF BUF,A A4.2.2 4.2.2 分支程序设计分支程序设计n分分支支程程序序就就是是条条件件分分支支程程序序,即即根根据据不不同同的的条条件,执行不同的程序段。件,执行不同的程序段。例例4.5 4.5 设设变变量量X X存存放放于于VARVAR单单元元,函函数数值值Y Y存存放放在在FUNCFUNC单元。试按照下式的要求给单元。试按照下式的要求给Y Y赋值。赋值。编程如下:编程如下:VARVAREQUEQU30H30HFUNCFUNC EQUEQU31H31HMOVMOVA A,VARVAR;取出;取出X XJZJZCOMPCOMP;X X0 0则转移到则转移到COMPCOMPJNBJNBACC.7 ACC.7,POSIPOSI;X0X0则转移到则转移到POSIPOSIMOVMOVA A,#0FFH#0FFH;X0X0X0则则Y Y1 1COMPCOMP:MOVMOVFUNCFUNC,A A;存函数值;存函数值ORGORG8000H8000HCLRCLRC CMOVMOVA A,40H40HCJNECJNE A A,41H,41H,COMPCOMPSJMPSJMP DONEDONECOMPCOMP:JNCJNCDONEDONEMOVMOVA A,41H41HDONEDONE:MOVMOV42H 42H,A ASJMPSJMP$ENDENDORGORG8000H8000HCLRCLRC CMOVMOVA A,40H40HSUBBSUBB A A,41H41HJNCJNCLOOPLOOPMOVMOV42H 42H,41H41HRETRETLOOPLOOP:MOVMOV42H 42H,40H40HRETRET例例4.6 4.6 将将存存储储单单元元40H40H和和41H41H中中较较大大的的一一个个数数存存入入42H42H单元中单元中例例4.74.7从从内内部部RAM RAM 22h22h单单元元开开始始存存有有一一个个无无符符号号数数数数据据块块,长长度度n n存存于于21h21h中中。求求出出数数据据块块中中的的最最小小数,存于数,存于20h20h中。中。初始化初始化y x y x取新数取新数 yN 10?yyNNEND编程如下:编程如下:ORGORG0030H0030HMOVMOVR0,#22HR0,#22H;数据块起始地址数据块起始地址MOVMOVR1,21H R1,21H;数据个数数据个数n nMOVMOV20H,#0FFH20H,#0FFH;最大数最大数LOOP:LOOP:MOVMOVA,R0A,R0;取新数取新数INCINCR0 R0 ;为取下一个新数作准备为取下一个新数作准备CJNECJNE A,20H,LOOP1A,20H,LOOP1 ;与原最大数比较与原最大数比较LOOP1:LOOP1:JNC NEXT JNC NEXT ;大,原最小数保留大,原最小数保留MOV 20H,A MOV 20H,A ;小,改变最小数小,改变最小数NEXT:NEXT:DJNZ R1,DJNZ R1,LOOP LOOP ;循环循环ENDENDORGORG4000H4000HSTARTSTART:MOVMOVA A,30H30HJZJZLP2LP2JBJBACC.7 ACC.7,LP1LP1MOVMOV31H 31H,#01H#01HRETRETLP1LP1:MOVMOV31H 31H,#0FFH#0FFHRETRETLP2LP2:MOVMOV31H 31H,#00H#00HRETRET例例4.84.8 设变量设变量X X放在放在30H30H单元中结果放在单元中结果放在31H31H单元中单元中n散转程序设计散转程序设计例例4.9 4.9 根据根据R7R7中的内容,转向各个子中的内容,转向各个子程序。程序。R7R70 0,转入,转入Prog0Prog0R7R71 1,转入,转入Prog1Prog1R7R72 2,转入,转入Prog2Prog2R7R7n n,转入,转入PrognProgn处处理理 0处处理理 1处处理理 nR7=?01nORGORG0030H0030HJUMP1:JUMP1:MOVMOVDPTR,#TABDPTR,#TABCLRCLRA A MOVMOVA,R7A,R7ADDADDA,R7A,R7AJMPAJMPA+DPTRA+DPTRORGORG0100H0100HTAB:TAB:AJMPAJMPProg0Prog0AJMPAJMPProg1Prog1AJMPAJMPProg2Prog2*AJMP AJMP 即把即把PCPC指向子指向子程序的起始地址;程序的起始地址;*R7 x 2 R7 x 2 是是AJMP AJMP A+DPTRA+DPTR的机器码匹配;的机器码匹配;此处此处 n127;n127;*如用如用LJMP A+DPTRLJMP A+DPTR,则,则R7 x 3,R7 x 3,程序还要作程序还要作相应修改。相应修改。MOVMOVDPTR DPTR,#KEY#KEYMOVMOVA A,50H50HRLRLA AADDADDA A,50H50HJMPJMPA+DPTRA+DPTRKEY KEY:LJMPLJMP KEY0KEY0LJMPLJMP KEY1KEY1 .LJMPLJMP KEYnKEYn例例4.10 4.10 根据根据50H50H单元内容转向各处理程序,处理单元内容转向各处理程序,处理程序的入口地址分别是程序的入口地址分别是 KEY0KEY0、KEY1KEY1、KEY2KEY2、.KEYn.KEYn。(散转指令)(散转指令)FRTFRT:MOVMOVA A,40H40H;取行李重量;取行李重量G G放在放在40H40HMOVMOVR3 R3,A AMOVMOVB B,#03H#03H;M=G3M=G3MULMULABABMOVMOVR2 R2,A A;暂存;暂存3 G3 G在在R2R2MOVMOVA A,R3R3;取回;取回G GCJNECJNE A A,#06H#06H,L1L1;G5?G5?L1L1:JCJCWETCWETC;是,转至;是,转至WETCWETCSUBBSUBB A A,#05H#05H;否则;否则M=3G+2(G-5)M=3G+2(G-5)RLCRLCA AADDADDA A,R2 R2 MOVMOVR2,AR2,AWETCWETC:MOVMOV41H 41H,A A;最后结果;最后结果M M存存41H41H ENDEND例例11:11:行李计价:行李计价:当当G5G5,M=G3M=G3;当当G G5 5,M=G3+(G-5)(5-3)M=G3+(G-5)(5-3)指出本程序的条件限制指出本程序的条件限制4.2.3 4.2.3 循环程序设计循环程序设计n循环程序一般由循环程序一般由4 4部分组成:部分组成:(1 1)置循环初值)置循环初值(2 2)循环体)循环体(3 3)循环修改)循环修改(4 4)循环控制)循环控制图图4.2 4.2 循环程序结构流程图循环程序结构流程图例例4.12 4.12 在在外外部部RAM RAM 2000H2000H单单元元开开始始存存放放有有2020个个无无符符号号数数,找出其最大值,把它放在内部找出其最大值,把它放在内部RAM30HRAM30H单元中。单元中。解:解:ORGORG1000H1000HMAIN:MAIN:MOV DPTR MOV DPTR,#2000H#2000HMOV R7 MOV R7,#20#20MOV R5 MOV R5,#00H#00HLOOP:LOOP:MOVX A MOVX A,DPTRDPTRCLR CCLR CSUBB A SUBB A,R5R5JC NEXTJC NEXTMOVX A MOVX A,OPTROPTRMOV R5 MOV R5,A AINC DPTRINC DPTRNEXT:DJNZNEXT:DJNZR7 R7,LOOPLOOPMOVMOV30H 30H,R5R5ENDEND例例4.13 4.13 编编写写无无符符号号数数排排序序程程序序。假假设设在在片片内内RAMRAM中中,起起始始地地址址为为40H40H的的1010个个单单元元中中存存放放有有1010个个无无符符号号数数。试试进进行行升升序排序。序排序。解解:数数据据排排序序采采用用冒冒泡泡排排序序法法。执执行行时时从从前前向向后后进进行行相相邻邻数数的的比比较较,如如数数据据的的大大小小次次序序与与要要求求的的顺顺序序不不符符就就将将这这两两个个数数互互换换,否否则则不不互互换换。对对于于升升序序排排序序,通通过过这这种种相相邻邻数数的的互互换换,使使小小数数向向前前移移动动,大大数数向向后后移移动动;从从前前向向后后进进行行一一次次冒冒泡泡(相相邻邻数数的的互互换换),就就会会把把最最大大的的数数换换到到最最后后;再再进进行行一一次次冒冒泡泡,就就会会把把次次大大的的数数排排在在倒倒数数第第二二的的位位置置。依依此此类类推推,完完成成由由小小到到大大的的排排序。程序中:序。程序中:R7R7做比较次数计数器,做比较次数计数器,初始值为初始值为09H09H,位地址位地址00H00H作为冒泡过程中是否有数据互换的标志位作为冒泡过程中是否有数据互换的标志位若若(00H)00H)0 0,表明无互换发生,已排序完毕,表明无互换发生,已排序完毕若若(00H)00H)1 1,表明有互换发生。,表明有互换发生。图图4.3 4.3 冒泡法排序程序流程图冒泡法排序程序流程图程序如下:程序如下:程序如下:程序如下:ORG 4000HORG 4000HSTART:START:MOVMOVR0 R0,#40H#40H;数据区首址送;数据区首址送R0R0MOVMOVR7R7,#09H#09H;各次冒泡比较次数送;各次冒泡比较次数送R7R7CLRCLR00H00H;互换标志位清零;互换标志位清零LOOPLOOP:MOVMOVA A,R0R0;取前数送;取前数送A A中中MOVMOV2BH 2BH,A A;暂存到;暂存到2BH2BH单元中单元中INCINCR0R0;修改地址指针;修改地址指针MOVMOV2AH 2AH,R0R0;取后数暂存到;取后数暂存到2AH2AH单元中单元中CLRCLRC C;清;清CYCYSUBSSUBS A A,R0R0;前数减后数;前数减后数JCJCNEXTNEXT;前数小于后数,则转(不互换);前数小于后数,则转(不互换)MOVMOVR0 R0,2BH2BH;前数大于后数,两数交换;前数大于后数,两数交换;续前续前续前续前DECDECR0R0MOVMOVR0 R0,2AH2AHINCINCR0R0;地址加;地址加1 1,准备下一次比较,准备下一次比较SETBSETB 00H00H;置互换标志;置互换标志NEXTNEXT:DJNZDJNZ R7 R7,LOOPLOOP;未比较完,进行下一次比较;未比较完,进行下一次比较JBJB00H 00H,STARTSTART;有交换,表示未排完序,进行下一;有交换,表示未排完序,进行下一;轮冒泡;轮冒泡ENDEND例例4.8 4.8 编写编写50ms50ms软件延时程序。软件延时程序。解:软件延时程序一般都是由解:软件延时程序一般都是由DJNZ Rn,relDJNZ Rn,rel指令构成。指令构成。执行一条执行一条DJNZDJNZ指令需要两个机器周期。在使用指令需要两个机器周期。在使用12 MHz12 MHz晶晶振时,一个机器周期为振时,一个机器周期为1s1s,执行一条,执行一条DJNZDJNZ指令需要两指令需要两个机器周期,即个机器周期,即2s2s。延时。延时50 ms50 ms需用双重循环,源程序需用双重循环,源程序如下:如下:DELDEL:MOVMOVR7 R7,#125#125;执行时需;执行时需1 1个机器周期个机器周期DELIDELI:MOVMOVR6 R6,#200#200DEL2DEL2:DJNZDJNZ R6 R6,DEL2 DEL2;200 2=400s200 2=400s;(内循环时间);(内循环时间)DJNZ R7 DJNZ R7,DEL1DEL1;0.4 ms 125=50ms0.4 ms 125=50ms;(外循环时间);(外循环时间)RETRET例例4.14 4.14 一一组组1010个个数数存存放放在在片片内内RAM RAM 50H50H开开始始的的连连续单元,求和,高字节放续单元,求和,高字节放R3R3,低字节放,低字节放R4R4中。中。源程序:源程序:ADD1:ADD1:MOV R7,#10MOV R7,#10;循环次数;循环次数n n1010MOV R3,#0MOV R3,#0;存放结果的高;存放结果的高8 8位位MOV R4,#0MOV R4,#0;存放结果的低;存放结果的低8 8位位MOV R0,#50HMOV R0,#50H;求和的数据存放在从内部;求和的数据存放在从内部RAM 50HRAM 50H;开始的单元中开始的单元中 ;注意(;注意(50H50H)?不知道)?不知道LOOP:LOOP:MOVMOVA,R4 A,R4;ADDADDA,R0A,R0;(;(R4)+(50H)AR4)+(50H)AMOVMOVR4,AR4,A;结果送回结果送回R4R4CLRCLRA A ADDCADDC A,R3A,R3;把进位位;把进位位C C加到高加到高8 8位去位去MOVMOVR3,AR3,AINCINCR0R0;为下一轮循环作准备;为下一轮循环作准备DJNZDJNZ R7,R7,LOOP LOOPENDEND解释:解释:高8位 低8位 (R3)(R4)+(50H)C (A)MOVMOVA,R4 A,R4 ADDADDA,R0 A,R0 MOVMOVR4,AR4,ACLRCLRA A ADDCADDCA,R3 A,R3 MOVMOVR3,AR3,A(50H)中是什么,不知道,)中是什么,不知道,不能用不能用 ADD A,50H4.2.4 4.2.4 查表程序查表程序n程程序序设设计计中中,有有时时会会遇遇到到比比较较复复杂杂的的运运算算或或转转换换过过程程,直直接接编编程程的的困困难难较较大大,采采用用查查表表的的方方法法使使解解决决这这种种问问题题的的有有效效涂涂径径。在在编编程程时时可可以以很很方方便便地地通通过过DBDB伪伪指指令令把表格的内容存入把表格的内容存入ROMROM。n用于查表的指令有两条:用于查表的指令有两条:MOVCMOVCA A,A+DPTRA+DPTRMOVCMOVCA A,A+PCA+PC使用使用DPTRDPTR作为基地址查表,可通过三步操作来完成:作为基地址查表,可通过三步操作来完成:将所查表格的首地址存入将所查表格的首地址存入DPTRDPTR数据指针寄存器;数据指针寄存器;将将所所查查表表的的项项数数(即即在在表表中中的的位位置置是是第第几几项项)送送到到累累加器;加器;执执行行查查表表指指令令MOVC MOVC A A,A+DPTRA+DPTR,进进行行读读数数,查查表表的的结结果送回累加器果送回累加器A A。例例4.15 4.15 计算计算X X2 2,设,设X X为小于为小于1010的非负整数,存放在内部的非负整数,存放在内部RAM 20HRAM 20H单元中,结果保存在内部单元中,结果保存在内部RAM 21HRAM 21H单元中。单元中。解解:计计算算平平方方运运算算,可可采采用用乘乘法法实实现现,也也可可采采用用查查表表的的方法实现,本例采用查表程序设计。方法实现,本例采用查表程序设计。源程序如下:源程序如下:SQRSQR:MOVMOVDPTRDPTR,#TAB#TABMOVMOVA A,20H20HMOVCMOVCA A,A+DPTRA+DPTRMOVMOV21H21H,A ARETRETTABTAB:DBDB0 0,1 1,4 4,9,169,16DBDB2525,3636,4949,6464,8181例例4 4.16 16 利用查表法求函数值利用查表法求函数值Y=3XY=3X2 2,X=0X=09 9。设。设X X存放在存放在30H30H单元中,单元中,Y Y存放在存放在31H31H单元中。单元中。编程如下:编程如下:START START:MOVMOVDPTR DPTR,#TAB#TAB MOVMOVA A,30H30HMOVCMOVCA A,A+DPTRA+DPTRMOVMOV31H 31H,A ATABTAB:DBDB0 0,3 3,1212,2727,4848,7575DB 108DB 108,147147,192192,243243 ENDEND4.9.6 4.9.6 子程序子程序n为能完成某种功能单独编成一为能完成某种功能单独编成一个独立的可以被反复使用的程个独立的可以被反复使用的程序段,过个独立的程序段称序段,过个独立的程序段称为为子程序子程序。n子程序子程序放在放在程序存储器程序存储器的特定的特定区域,执行时由区域,执行时由主程序主程序来调用来调用它。它。n子程序调用子程序调用,就是暂时中断主,就是暂时中断主程序的执行,而转到子程序的程序的执行,而转到子程序的入口地址去执行子程序,执行入口地址去执行子程序,执行完毕后,自动返回主程序,主完毕后,自动返回主程序,主程序再继续向下执行。程序再继续向下执行。CALLSCALLS主程序主程序子程序子程序SRETn80C5180C51单片机指令系统提供了两条子程序调用指令单片机指令系统提供了两条子程序调用指令:ACALLACALL addr11addr11和和 LCALLLCALLaddr16addr16n指指令令中中的的地地址址为为子子程程序序的的入入口口地地址址,在在实实际际的的程程序序中中通通常用常用标号来代表标号来代表。n在在主主程程序序调调用用子子程程序序时时,只只需需执执行行调调用用指指令令,单单片片机机即即可可先先将将当当前前的的PCPC值值压压入入堆堆栈栈,然然后后将将PCPC值值修修改改为为指指令令中标号所代表的地址,从而实现了子程序的调用。中标号所代表的地址,从而实现了子程序的调用。n子子程程序序中中应应该该有有返返回回指指令令RETRET或或RETIRETI,以以确确保保子子程程序序能能够够正正确确返返回回。执执行行RETRET指指令令时时单单片片机机将将原原来来存存在在堆堆栈栈中中的的断断点点送送回回PCPC,保保证证了了子子程程序序返返回回主主程程序序中中调调用用的的地地方继续执行。方继续执行。n由由此此可可见见,子子程程序序从从子子程程序序标标号号开开始始,到到RETRET或或RETIRETI指指令令结束结束。现场保护与恢复现场保护与恢复调调用用子子程程序序后后,CPUCPU处处理理权权转转到到了了子子程程序序,在在转转子子程程序序前前,CPUCPU有有关关寄寄存存器器和和内内存存有有关关单单元元是是主主程程序序的的现现场场,若若这这个个现现场场信信息息还还有有用用处处,那那么么在在调调用用子子程程序序前前要要设设法法保保护护这这个个现现场场。恢恢复复现现场场是是保保护护现现场场的的逆逆操操作作。当当用用堆堆栈栈保保护护现现场场时时,还还应应注注意意恢恢复复现现场场的的顺顺序序不不能能搞搞错错,否否则不能正确地恢复主程序的现场。则不能正确地恢复主程序的现场。参数的传递参数的传递参参数数传传递递是是指指主主程程序序与与子子程程序序之之何何相相关关信信息息或或数数据据的的传传递递。在在调调用用子子程程序序时时,主主程程序序应应先先把把有有关关参参数数(常常称称为为入入口口参参数数)放放到到某某些些约约定定的的位位置置,子子程程序序在在运运行行时时,从从约约定定的的位位置置等等到到有有关关参参数数。同同样样,子子程程序序在在运运行行给给束束前前,也也应应把把运运行行结结果果(常常称称为为出出口口参参数数)送送到到约约定定位位置置,在在返返回回主主程程序序后后,主主程程序序可可以以从从这这些些地地方方得得到到所所需需的的结结果,这就是所谓的参数传递。果,这就是所谓的参数传递。n子程序的设计的要点子程序的设计的要点子程序入口用标号作为子程序名子程序入口用标号作为子程序名调用子程序之前设置好堆栈调用子程序之前设置好堆栈用用返返回回指指令令RETRET结结束束子子程程序序,并并保保证证堆堆栈栈栈栈顶顶为为调调用用程序的返回地址程序的返回地址子程序嵌套须考虑堆栈容量子程序嵌套须考虑堆栈容量提供足够的调用信息提供足够的调用信息:如如:子子程程序序名名、子子程程序序功功能能、入入口口参参数数和和出出口口参参数数、子子程程序序占占用用的的硬硬件件资资源源、子子程程序序中中调调用用的的其其他他子子程程序序名。名。n关于子程序与主程序之间的参数传递关于子程序与主程序之间的参数传递p按子程序与主程序之间传递参数的方式分类按子程序与主程序之间传递参数的方式分类入口参数入口参数:调用子程序之前,需要传给子程序的参数。:调用子程序之前,需要传给子程序的参数。出口参数出口参数:子程序送回调用程序的结果参数。:子程序送回调用程序的结果参数。p选用不同的参数传递方式。选用不同的参数传递方式。寄存器传送参数寄存器传送参数存储器传送参数存储器传送参数堆栈传送参数堆栈传送参数p应满足通用性的要求,不针对具体数据编程应满足通用性的要求,不针对具体数据编程如:如:1.1.子程序功能为求单字节数的立方:子程序功能为求单字节数的立方:A AA A3 3,入口参数和出口参数为:入口参数和出口参数为:A A2.2.子程序功能为求单字节数的子程序功能为求单字节数的n n次方:次方:(41(41H)(42H)H)(42H)(40H)(40H)A A,入口参数:入口参数:(40H)(40H)和和A A,出口参数:出口参数:(42(42H)(41H)H)(41H)。例例例例4.17 4.17 4.17 4.17 计算计算计算计算 ,用子程序结构实现。用子程序结构实现。用子程序结构实现。用子程序结构实现。设设设设a a a a,b b b b,c c c c存于内部存于内部存于内部存于内部RAMRAMRAMRAM的三个单元的三个单元的三个单元的三个单元30H30H30H30H,31H31H31H31H,32H32H32H32H。解解:用用子子程程序序来来实实现现,即即通通过过两两次次调调用用查查平平方方表子程序来得到,并在主程序中完成相加。表子程序来得到,并在主程序中完成相加。平方表子程序的入口参数和出口参数都是平方表子程序的入口参数和出口参数都是A A。ORGORG1000H1000HMOVMOVA A ,30H30H;取第一个操作数;取第一个操作数ACALLACALL SQRSQR;第一次调用;第一次调用MOVMOVR1R1,A A;暂存于;暂存于R1R1MOVMOVA A ,31H31H;取第二个操作数;取第二个操作数ACALLACALL SQRSQR;再次调用;再次调用ADDADDA A ,R1R1MOVMOV32H,A 32H,A;完成;完成 MOV 32HMOV 32H,A ASJMPSJMP$;暂停;暂停SQRSQR:INCINCA A;查表位置调整;查表位置调整MOVCMOVCA A ,A+PCA+PC;查平方表;查平方表RETRETTABTAB:DBDB0 0,1 1,4 4,9 9,1616;平方表平方表DBDB2525,3636,4949,6464,8181ENDENDuu数制转换程序设计数制转换程序设计数制转换程序设计数制转换程序设计例例4.18 4.18 二进制转换成二进制转换成BCDBCD码。码。;程序名:;程序名:BINBCD1BINBCD1;功能:;功能:0 0FFHFFH内的二进制数转换为内的二进制数转换为BCDBCD数数;入口:;入口:A A存要转换的二进制数存要转换的二进制数;出口;出口:R0 R0 存放存放BCDBCD数数 百、十、个位数的地址百、十、个位数的地址BINBCD1:BINBCD1:MOVMOVB,#100B,#100DIVDIVABABMOVMOVR0,A R0,A INCINCR0R0MOVMOVA,#10 A,#10 XCHXCHA,BA,B;(A)(A)原(原(B B),),(B)=10(B)=10 DIVDIVABAB MOVMOVR0,AR0,A INCINCR0R0 XCHXCHABAB MOVMOVR0,A R0,A RETRET例例4.19 4.19(1 1)十六进制数转换为)十六进制数转换为ASCIIASCII码;(码;(2 2)ASCIIASCII码码转换为十六进制数转换为十六进制数(09的的ASCII码:码:3039H,AF的的ASCII码:码:4146H)(2 2)解)解AHEXAHEX:CLR CCLR CSUBBSUBBA A,#30H#30HN N:JC JC N1N1SJMPSJMPAEAEN1N1:SUBBSUBB A A,#11H#11HCJNECJNEA A,#06H#06H,N2N2N2N2:JNC ERRJNC ERRADDADDA A,#0AH#0AHSJMP SJMP AEAEERRERR:MOV AMOV A,#0FFH#0FFHAEAE:RETRET(1 1)解)解HASCHASC:CJNECJNEA A,#0AH#0AH,N NN N:JNC JNC N1N1ADDADDA A,#30H#30HSJMPSJMPSESEN1N1:ADDADDA A,#37H#37HSESE:RETRET部分习题参考答案4.54.5MOV DPTRMOV DPTR,#2000H#2000HMOV AMOV A,DPTRDPTR MOV 20H,A MOV 20H,A4.84.8(CYCY)=0=0,(,(ACAC)=1=1,(,(OVOV)=0=0,(,(P P)=0=04.114.11(A)=1BH,(B)=09H,OV=1,CY=0,P=0(A)=1BH,(B)=09H,OV=1,CY=0,P=04.124.12(1)AND A,#0F0H(1)AND A,#0F0H(2)OR A,#0FH(2)OR A,#0FH(3)XOR A,#0FH(3)XOR A,#0FH(4)XOR A,#0FFH(4)XOR A,#0FFH部分习题参考答案4.13 RL A4.13 RL AMOV B,AMOV B,ARL ARL ARL ARL AADD A,BADD A,B4.15 4.15 MOV R2,#04MOV R2,#04MOV R0,#30HMOV R0,#30HMOV R1,#40HMOV R1,#40HCLR CCLR CLOOP:LOOP:MOV A,R0MOV A,R0SUBB A,R1SUBB A,R1MOV R0,AMOV R0,AINC R0INC R0INC R1INC R1DJNZ R2,LOOPDJNZ R2,LOOP部分习题参考答案4.164.16MOV A,BCDMOV A,BCDAND A,#0FHAND A,#0FHOR A,#30HOR A,#30HMOV BC1,AMOV BC1,AMOV A,BCDMOV A,BCDAND A,#0F0HAND A,#0F0HSWAP ASWAP AOR A,#30HOR A,#30HMOV BCD2,AMOV BCD2,A4.174.17LED:DB 3FH,06H,5BH,4FH,66H,6DH,LED:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,83H,C67DH,07H,7FH,6FH,77H,83H,C6H,A1H,86H,8EHH,A1H,86H,8EHMOV DPTR,#LEDMOV DPTR,#LEDMOV A,A+DPTRMOV A,A+DPTR4.18 4.18 对对X X单元求绝对值并将结果送到单元求绝对值并将结果送到Y Y存储单元。存储单元。部分习题参考答案4.194.19MOV DPTR,#1000HMOV DPTR,#1000HMOV R2,100MOV R2,100MOV A,DPTRMOV A,DPTRCJNE A,#0,NQUCJNE A,#0,NQUSJMP ZEROSJMP ZERONQU:NQU:JNC POSIJNC POSIZERO:INC 22HZERO:INC 22HSJMP RETSJMP RETNEG:NEG:INC 21HINC 21HSJMP RETSJMP RETPOSI:POSI:INC 20HINC 20HRET:RET:SJMP$SJMP$4.204.20 ORG 2000HORG 2000HMOV R2,20MOV R2,20MOV 30H,#00HMOV 30H,#00HMOV R0,#40HMOV R0,#40HLOOP:LOOP:MOV A,R0MOV A,R0CJNE A,30H,NEXT1CJNE A,30H,NEXT1NEXT1:JC NEXTNEXT1:JC NEXTMOV 30H,AMOV 30H,ANEXT:NEXT:INC R0INC R0DJNZ R2,LOOPDJNZ R2,LOOPSJMP$SJMP$ENDEND部分习题参考答案4.214.21ORGORG2000H2000HCUBE:CUBE:DBDB1,2,8,27,1,2,8,27,64,125,21664,125,216MOVMOVDPTR,#CUBEDPTR,#CUBEDECDECA AMOVMOVA,A+DPTRA,A+DPTRSJMPSJMP$ENDEND4.224.22ORGORG2000H2000HCLRCLRC CMOVMOVA,30HA,30HSUBBSUBB A,31HA,31HJNBJNBACC.7,POSIACC.7,POSI CPLCPLA A ADDADDA,#01HA,#01H POSIPOSI:MOVMOV32H,A32H,A SJMPSJMP$ENDEND 4.234.23ORG 2000HORG 2000HMOV A,30HMOV A,30HADD A,32HADD A,32HMOV 34H,AMOV 34H,AMOV A,31HMOV A,31HADDC A,33HADDC A,33HMOV 35H,AMOV 35H,ASJMP$SJMP$ENDEND
展开阅读全文