第四章汇编语言程序设计2010春_第1页
第四章汇编语言程序设计2010春_第2页
第四章汇编语言程序设计2010春_第3页
第四章汇编语言程序设计2010春_第4页
第四章汇编语言程序设计2010春_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

第4章汇编语言程序设计,4.1汇编语言程序设计方法4.2汇编语言源程序的基本结构顺序、循环、分支、子程序4.3常用程序设计举例,4.1.1程序的设计步骤与方法汇编和高级语言程序设计的过程:首先对问题进行分析,然后确定算法,再根据算法流程编写程序,最后是调试程序。汇编语言程序设计的独特点在于:(1)用汇编语言进行程序设计时,对数据的存放、寄存器和工作单元的使用等要由设计者安排。而高级语言程序设计时,这些工作都由计算机软件安排,程序设计者不必考虑。,(2)汇编语言程序设计要求设计人员必须对所使用的计算机的硬件结构有较为详细的了解。特别是对各类寄存器、端口、定时器/计数器、中断等内容要熟悉,以便在程序设计时能熟练使用。,汇编语言程序的设计步骤:(1)分析问题,抽象出描述问题的数学模型(2)确定解决问题的算法(3)分配存储空间及工作单元(4)根据算法绘制流程图(5)编写源程序(6)上机调试,程序质量的判断标准:程序的执行时间短;占用的内存单元少;程序的语句行数少。,4.1.2汇编语言源程序的编辑和汇编,1.汇编语言源程序的编辑编辑好的源程序应以“.ASM”扩展名存盘2.汇编语言源程序的汇编源程序经机器汇编之后,若无语法错误,一般将生成两个新文件,它们的扩展名分别是.OBJ和.LST。,例4-1将内部RAM从30H开始的10个单元的内容相加,其和保存于A(假设其和仍为8位数)。,列表文件(.LST)信息如下:地址机器码汇编语言源程序注释ORG2000H;定义程序起始地址20007830START:MOVR0,#30H;初始地址送R020027A0AMOVR2,#10;循环初始值送R220047400MOVA,#00H;累加和初始值送A200626LOOP:ADDCA,R0;完成累加200708INCR0;修改地址2008DAFCDJNZR2,LOOP;循环判断200A80FESJMP$;暂停END;程序结束INCLUDEINHASHTABSTART:2000LOOP:2006目标文件(.OBJ)信息如下:2000200C78307A0A74002608DAFC80FE,4.2汇编语言源程序的基本结构,共有四种结构形式:顺序结构、循环结构、分支结构和子程序结构。,方法一:用逻辑指令将高、低半字节分开,对数字09加上30H即可得到所对应的ASCII码30H39H。ORG2000HMOVA,40H;取数ANLA,#0FH;分离出低半字节ADDA,#30H;变为ASCII码MOV42H,A;保存MOVA,40H;重新取数SWAPA;高、低半字节交换ANLA,#0FH;分离出高半字节ADDA,#30H;变为ASCII码MOV41H,A;保存END,例4-2将40H单元的高、低半字节的两个BCD码拆开并变成其ASCII码,并分别存入41H和42H单元,4.2.1顺序结构,方法二:采用BCD数除以10H的方法,可把处于高、低半字节的两个BCD码分别移到A和B的低4位,然后再各自与30H相“或”即变为ASCII码。参考程序如下:ORG2000HMOVA,40H;取数MOVB,#10H;送被除数DIVAB;分离高、低半字节ORLB,#30H;低4位调整为ASCII码MOV42H,BORLA,#30H;高4位调整为ASCII码MOV41H,AEND,例4-2将40H单元的高、低半字节的两个BCD码拆开并变成其ASCII码,并分别存入41H和42H单元,例(附1)求两个8位无符号数的和。设两个8位无符号数分别存放在内部RAM20H和21H单元,所求和(不超过255)存放在22H单元。ORG2000HSTART:MOVR0,#20HMOVA,R0INCR0ADDA,R0INCR0MOVR0,ASJMP$END,只有这一种方法吗?,例(附2)求两个8位无符号数的和。设两个8位无符号数分别存放在内部RAM20H和21H单元,所求和(不超过255)存放在22H单元。ORG2000HSTART:MOVA,20HADDA,21HMOV23H,ASJMP$END,4.2.2循环程序设计,图a为先执行后判断,相当于直到(until)型循环。图b为先判断后执行,相当于当(do-while)型循环。,循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。,循环:单重循环多重循环(二重以上)循环嵌套。在多重循环程序中,只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉,另外,也不允许从循环程序的外部跳入循环程序的内部。,例4-3把外部RAM5000H50FFH单元的内容清零。ORG2000HSTART1:MOVDPTR,#5000H;循环初始化MOVR0,#00HMOVA,#00HLOOP1:MOVXDPTR,A;循环体INCDPTRINCR0DJNZR0,LOOP1;循环控制END,例4-4将内部RAM从40H开始连续单元的数据传送到外部RAM从2000H开始的连续单元中,当所传送的数据为0FFH时,传送停止。解:ORG2000HMOVR0,#40H;循环初始化MOVDPTR,#2000HLOOP:MOVA,R0CJNEA,#0FFH,LOOP1;循环控制SJMPNEXTLOOP1:MOVXDPTR,A;循环体INCR0INCDPTRSJMPLOOPNEXT:SJMP$END,例4-5从P1口重复256次读数并取平均值,平均值的整数和小数部分分别保存于内部RAM的30H和31H单元中。解:假设将R2R3作为16位寄存器以保存连续256次读数的累加和ORG4000HINTEGEREQU30HDECIMALEQU31HAVR:MOVR2,#0;循环初始化MOVR3,#0MOVR4,#0;累加次数为256AVR1:MOVA,P1;循环体ADDA,R3;累加至低8位JNCAVR2;无进位则暂存结果INCR2;有进位则高8位加增1AVR2:MOVR3,A;暂存低8位DJNZR4,AVR1;循环控制MOVINTEGER,R2MOVDECIMAL,R3END,例(附2)设单片机外部数据存储器起始地址为3000H的数据块中有100个补码,要求逐一检查,若为负数则求补后放回,正数则不变。ORG1000HSTART1:MOVR7,#64H;设置循环初始值MOVDPTR,#3000HLOOP1:MOVXA,DPTRJNBACC.7,LOOP2CPLAINCAMOVXDPTR,ALOOP2:INCDPTR;外部RAM单元加1DJNZR7,LOOP1END,例(附3)有10个无符号数依次存放在内部RAM30H开始的单元中,求其和,并将结果放在R2和R3中。ORG2000HMOVR0,#30HMOVR2,#00HMOVR3,#00HMOVR7,#0AHNEXT:MOVA,R0;设置循环初始值ADDA,R3MOVR3,AMOVA,R2ADDCA,#00HMOVR2,AINCR0DJNZR7,NEXTSJMP$END,例4.6设MCS-51单片机的时钟频率为fosc=12MHz,试设计延时50ms的延时程序。延时程序所花费的时间是该程序指令的总机器周期数与机器周期的乘积。通常,延时程序采用MOV和DJNZ指令来实现。单循环延时程序,最大的循环次数位256,则程序段为:MOVR0,#00H;机器周期数为1DJNZR0,$;机器周期数为2若单片机晶振为12MHz,则一个机器周期为1us。延时时间:(1+2562)1s513s。需采用多重循环。,MOVR1,#MLOOP:MOVR2,#NNOPDJNZR2,$DJNZR1,LOOP内层循环的机器周期数为Tn=1+1+2*N,总机器周期数为Tm(Tn+2)*M+1.设N=123,M=200,则延时时间为50.001ms。,修改后程序清单:ORG2000HMOVR1,#0C8H(200)LOOP:MOVR2,#7BH(123)NOPDJNZR2,$DJNZR1,LOOPSJMP$END,补充例4设三字节无符号数相加被加数:内部RAM22H20H单元(低位在低字节),加数:内部RAM32H30H单元(低位在低字节),结果:存于内部RAM22H20H单元,进位位存于23H单元。利用ADDC指令进行多字节加法运算。,ORG4200HMOVR0,#20H;被加数的低字节地址MOVR1,#30H;加数的低字节地址MOVR2,#03H;循环次数CLRCLOOP:MOVA,R0ADDCA,R1;低字节相加MOVR0,A;存放字节相加结果INCR0INCR1DJNZR2,LOOP;循环控制MOVA,#00HADDCA,#00HMOVR0,A;进位位送23HEND,4.2.3分支程序分支程序的基本结构:单分支和多分支。其特点是:各处理模块是相互排斥的。,13条条件转移指令,分别为:JZ,JNZ:累加器判零转移指令;CJNE:比较条件转移指令;DJNZ:减1条件转移指令;JC,JNC,JB,JNB,JBC:位控制条件转移指令等四类。,(1)单重分支结构例4-7片内RAMDATA1和DATA2两个单元中各存有一个无符号数字,将两个数中的小者存入MIN单元。,ORG4000HMINEQU30HDATA1EQU31HDATA2EQU32HMOVA,DATA1;第一数送ACLRCCJNEA,DATA2,UNEQU;两数比较SJMPSTORE;相等,DATA1作为小的数UNEQU:JCSTORE;有借位,DATA1为小MOVA,DATA2;无借位,DATA2为小STORE:MOVMIN,A;小者送RAMEND,例4-8片内RAM两个单元中存有不相等的有符号数字X和Y,比较两数的大小,并将大数存入MAX单元。,若X-Y0,则当(OV)0时,XY;当(OV)1时,XY;若X-Y0,则当(OV)0时,XY;当(OV)1时,XY。,图4-6例4-8的流程图,ORG1000HXDEQU31HYDEQU32HMAXEQU30HCLRCMOVA,XDSUBBA,YD;X-Y,形成OV标志JZXMAX;若X=Y,则转向FINISHJBACC.7,NEG;若(X-Y)X,存YSJMPFINISHXMAX:MOVA,XD;XY,存XFINISH:MOVMAX,A;大数送MAX单元END,例4-8片内RAM两个单元中存有不相等的有符号数字X和Y,比较两数的大小,并将大数存入MAX单元。,(2)多重分支结构例附5设x,y分别存放在内部RAM30H和40H中,根据x的值,给y赋值为01H,00H,0FFH(-1).,ORG2000HMOVA,30HJZDONEJBACC.7,LOOPMOVA,#01HSJMPDONELOOP:MOVA,#0FFHDONE:MOV40H,ASJMP$END,(3)散转结构例设R7的内容为0n,对应的处理程序入口地址分别为PROG0PROGn,编写散转程序。跳转方法:逐个比较,类似CASE。使用散转指令JMPA+DPTR。设(R7)0n,对应的处理程序入口地址分别为PROG0PROGn,且按照一定的规律排列。,ORG2000HMOVDPTR,#TAB;设置处理程序入口首地址MOVA,R7CLRCRLCA;JNCNEXTINCDPHNEXT:JMPA+DPTR;转向形成的散转地址入口TAB:AJMPPROG0;直接转移地址表AJMPPROG1AJMPPROGn,例4-9在内部RAM20H和21H单元中有两个无符号的数,由22H中的值决定对该数完成加、减、乘或除运算(20H单元的数为被减数或被除数),运算规则及结果保存处见表4-1。,ORG1000HMOVA,22HMOVB,21HRLAMOVDPTR,#TABJMPA+DPTRNOPTAB:AJMPADDM;散转表AJMPSUBMAJMPMULMAJMPDIVMADDM:MOVA,20H;加法运算ADDA,BMOV30H,AMOVA,#0ADDCA,#0MOV31H,ASJMPFINISH,SUBM:MOVA,20H;减法运算SUBBA,BMOV40H,ASJMPFINISHMULM:MOVA,20H;乘法运算MULABMOV51H,BMOV50H,ASJMPFINISHDIVM:MOVA,20H;除法运算DIVABMOV61H,AMOV60H,BFINISH:END,4.2.4子程序设计子程序与一般程序的主要区别是在子程序的末尾有一条子程序返回指令(RET),其功能是执行完子程序后通过将堆栈内的断点地址弹出到PC而返回到主程序中。在编写子程序时应注意以下几点:(1)要给每个子程序赋一个名字。实际上是一个入口地址的代号。(2)在子程序的末尾必须有子程序返回指令RET。(3)要能正确地传递参数。首先要有入口条件,说明进入子程序时它所要处理的数据如何得到,另外,要有出口条件,即处理的结果是如何存放的。,(4)注意保护现场和恢复现场。注意保存主程序和子程序共同涉及的,但值不同的累加器、寄存器和单元的内容。保护现场:PUSH恢复现场:POP(5)注意子程序的通用性。主程序调用子程序的指令:“LCALL”,“ACALL”。子程序返回指令:RET。子程序可以嵌套,嵌套次数从理论上说是无限的,但实际上由于受堆栈深度的影响,嵌套次数是有限的。,例4-10在图3-11的P1口与LED的连接示意图中,若使得LED0LED7依次点亮,其延时时间分别从1s至8s,LED7点亮之后又从LED0开始循环。编写汇编语言源程序实现该功能。,ORG1000HMOVA,#1;主程序NEXT1:MOV20H,#0MOVR3,#8NEXT:INC20HMOVR4,20HMOVP1,AACALLDELAYRLADJNZR3,NEXTSJMPNEXT1DELAY:MOVR7,#10;1s延时子程序DELAY3:MOVR6,#200DELAY2:MOVR5,#125DELAY1:DJNZR5,DELAY1;1254500s0.5msDJNZR6,DELAY2;0.5ms2000.1sDJNZR7,DELAY3;0.1s2001sDJNZR4,DELAYRETEND,例4-11两个无符号数据块的首地址分别为30H和40H,每个数据块的第一个字节都存放着数据块的长度(小于15),求各数据块中最大值的乘积,并将结果存入50H(乘积低字节)和51H(乘积高字节)。解:可将求最大值的过程编写成一个子程序,子程序的入口参数是数据块的首地址,存放在R1中,返回参数即为最大值,存放在A中,参考程序如下:,ORG1000H;主程序MOVR1,#30H;置入口条件参数ACALLFMAX;调用求最大值子程序MOVB,A;第一个最大值存放于BMOVR1,#40H;置入口条件参数ACALLFMAX;调用求最大值子程序MULAB;求乘积MOV50H,A;存乘积低字节MOV51H,B;存乘积低高字节SJMP$,ORG1200H;子程序FMAX:MOVA,R1;取数据块长度MOVR2,A;R2中存放数据块的长度INCR1;改变地址指针MOVA,R1;将第一个数放入ADECR2;数据个数减1LOOP1:INCR1;修改地址指针CLRCSUBBA,R1;相减比较大小JNCLOOP2;A中的数为大,跳向MOVA,R1;否则,更换大数到ASJMPLOOP3LOOP2:ADDA,R1;恢复原最大值LOOP3:LOOP3:DJNZR2,LOOP1;若未比较完,则循环RETEND,例:将R0和R1所指的内部RAM中两个多字节无符号数相加,结果存入R0所指的内部RAM中。NADD:CLRCNADD1:MOVA,R0ADDCA,R1MOVR0,AINCR0INCR1DJNZR7,NADD1JNCNADD2MOVR0,#01HINCR0NADD2:DECR0RET,4.3常用程序设计举例4.3.1代码转换类程序计算机内部的运算一般都是用二进制,而在计算机与外设的数据传送中常采用BCD码、ASCII码和其它代码,因此,就存在代码转换的问题。在程序设计中常采用算法处理和查表方式来实现代码转换。,十六进制数与ASCII码之间的转换将A中存放的一位十六进制数转换成其所对应的ASCII码存入A中。解:HEXAS:CLRCSUBBA,#10JCLOOPADDA,#7LOOP:ADDA,#10ADDA,#30HEND,例4-12将从30H单元开始的连续8个单元中存放的十六进制数转换成其所对应的ASCII码,并分别存放在从40H开始的16个单元中。解:ORG2000HMOVR0,#30H;设定地址指针MOVR1,#40HMOVR7,#8;循环次数NEXT:MOVA,R0;高字节转换SWAPAANLA,#0FHACALLHEXASMOVR1,AINCR1MOVA,R0;低字节转换ANLA,#0FHACALLHEXASMOVR1,AINCR1;修改地址指针INCR0DJNZR7,NEXTNOPSJMP$,HEXAS:CLRC;十六进制转换成ASCII码子程序SUBBA,#10JCLOOPADDA,#7LOOP:ADDA,#10;补偿减掉的10ADDA,#30HRETEND,例把外部RAM30H3FH单元中的ASCII码依次转换为十六进制数,并存入内部RAM60H67H单元之中。假设:被转换的ASCII为十六进制数(0F)的ASCII,则,因为:09ASCII3039HAFASCII4146H若(30H)41HA1041H30H11H17,因为一个字节可装两个转换后得到的十六进制数,即两次转换才能拼装为一个字节。为了避免在程序中重复出现转换程序段,因此通常采用子程序结构,把转换操作编写为子程序。,ORG5000HMAIN:MOVR0,30H;设置ASCII码地址指针MOVR1,60H;设置十六进制数地址指针MOVR7,08H;字节个数AB:ACALLTRAN;调用转换子程序SWAPA;A高低字节交换MOVXR1,AINCR0ACALLTRAN;调用转换子程序XCHDA,R1;十六进制数拼装INCR0INCR1DJNZR7,AB,子程序(TRAN):TRAN:CLRCMOVXA,R0;取ASCII码SUBBA,#30HCJNEA,#0AH,BBAJMPBCBB:JCDONEBC:SUBBA,#07H;大于等于0AH,再减07HDONE:RETEND,例4-13将两字节十六进制整数转换成三字节的BCD码。若待转换的双字节十六进制整数在R6、R7中(R6中为高位),转换后的三字节BCD码整数存于R3、R4和R5中(R3中为高位)。解:二进制数b7b6b5b4b3b2b1b0B所对应的十进制数X可按照下式计算因此,只要按照十进制运算法则,将bi(i=7,6,1,0)按权相加,就可以得到相应的十进制数X。参考程序如下:ORG2000HHEBCD:MOVA,#0;BCD码初始化MOVR3,AMOVR4,AMOVR5,AMOVR2,#16;循环次数NEXT:CLRCMOVA,R7;R7右移一位并送回RLCAMOVR7,AMOVA,R6;R6右移一位并送回RLCAMOVR6,A,MOVA,R5;(R5)2并调整为BCD码ADDCA,R5DAAMOVR5,AMOVA,R4;(R4)2并调整为BCD码ADDCA,R4DAAMOVR4,AMOVA,R3ADDCA,R3MOVR3,A;若万位数不超过6,则不用调整DJNZR2,NEXT;处理完16位了吗?NOPEND,4.3.2查表程序常用于非线性修正、非线性函数转换以及代码转换等。专用的查表指令:MOVCA,A+DPTR;远程查表,64KB通过以下三步操作实现查表。将所查表格的首地址送入DPTR;将要查找的数据序号,即数据在表中的位置送入累加器A中;执行查表指令MOVCA,A+DPTR进行读数并存结果存于累加器A。,MOVCA,A+PC;近程查表,0+256B其实现查表也可通过以下三步操作来完成。将要查找的数据序号,即数据在表中的位置送入累加器A中;把从查表指令到表的首地址间的偏移量与A值相加;执行查表指令MOVCA,A+PC进行读数,查表结果送累加器A。,例4-14用查表指令编程实现将从30H单元开始的连续8个单元中存放的十六进制数转换成其所对应的ASCII码,并分别存放在从40H开始的16个单元中。ORG2000HASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37H;ASCII码表DB38H,39H,41H,42H,43H,44H,45H,46HMOVR0,#30H;设定地址指针MOVR1,#40HMOVR7,#8;循环次数MOVDPTR,#ASCTABNEXT:MOVA,R0;高字节转换SWAPAANLA,#0FHMOVCA,A+DPTR;查表MOVR1,AINCR1MOVA,R0;低字节转换ANLA,#0FHMOVCA,A+DPTR;查表MOVR1,AINCR1;修改地址指针INCR0DJNZR7,NEXTNOPEND,例4-15在一个巡回检测系统中,需对8路输入进行控制,每路都有一最大允许值,为双字节数,且不全相同。控制时,需将输入值与最大值比较,若超过则进行报警。编写一子程序使其能查找每路的最大允许值。解:该查表运算中自变量X是单字节,而因变量Y是两字节的数。假设被检测路数存放在R7中(入口参数),07路的最大允许值依次存放在ROM中,查询得到的最大值存放在30H(低字节)和31H(出口参数)中,则参考程序如下:ORG1000HMOVDPTR,#TABLEMOVA,R7RLA;乘2进行地址修正MOVR7,AMOVCA,A+DPTR;查表取高字节MOV31H,AINCDPTRMOVA,R7MOVCA,A+DPTR;查表取低字节MOV30H,ATABLE:DW1245H,2345H,1022H,2390H;最大允许值表DW3421H,2388H,2366H,2147HRET,例若累加器A中存放的是一位BCD码。通过查表将其转换成为相应的七段显示码,并存入寄存器B中。七段数码显示管连接方式:共阳极和共阴极两种。共阳极是低电平为有效输入,共阴极为高电平为有效输入。假设数码显示管为共阴极。09的七段码为3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。由于代码没有规律,一般采用查表完成。,3FH,若以DPTR为基址,程序段如下:ORG2000HMOVA,#05HMOVDPTR,#TABMOVCA,A+DPTRMOVB,ASJMP$TAB:DB3FH,06H,5BH,4FH,66H,DB6DH,7DH,07H,7FH,6FH,若以PC为基地址,则程序段如下:MOVA,#05HADDA,#01HMOVCA,A+PCRETTAB:DB3FH,06H,5BH,4FH,66H,DB6DH,7DH,07H,7FH,6FH,例4-16若内部RAM30H中存放的是一位BCD码,通过查表将其转换成为相应的七段显示码,并存入寄存器31H中。解:09的共阴极字形代码为3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。ORG1000HMOVA,30HADDA,#04H;地址修正MOVCA,A+PCMOV31H,A;2字节指令SJMP$;2字节指令TAB:DB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FHEND,4.2.6逻辑操作程序例4-17写出图4-7所示电路的逻辑表达式,并编程实现其功能解:该电路图的最简逻辑表达式为,ORG1000HXBITP1.0;输入逻辑变量YBITP1.1ZBITP1.2FBITP1.3;输出逻辑变量EXOR:MOVC,XANLC,/YMOVF,C;保存结果于F位MOVC,YANLC,/XORLC,FANLC,ZMOVF,C;F()MOVC,XANLC,Y;XYORLC,FMOVF,CEND,例4-18在图3-7中,假设K1、K2和K3分别表示X、Y和Z三人对某一提案的表决,当K闭合时,表示其同意该方案;当K断开时,表示不同意该方案。当多数人同意时,输出F为1。假设P1.7连接一共阴极LED,将结果用LED显示出来。编程实现此功能。解:根据数字电路中组合逻辑电路的设计知识,得出该逻辑电路的最简逻辑函数式是F=XY+XZ+YZ,据此设计的参考程序如下:ORG1000HXBITP1.0YBITP1.1ZBITP1.2MOVC,X;实现XYANLC,YMOV20H,CMOVC,X;实现XZANLC,ZMOV21H,CMOVC,Y;实现YZANLC,ZORLC,21HORLC,20HMOVP1.7,CNOPEND,例设P1.0P1.3为准备就绪信号输入端,当该4位输入全为1时说明各项工作已准备好,单片机可顺序执行主程序,否则循环等待。ORG2000HLOOP:MOVA,P1ANLA,#0FHCJNEA,#0FH,LOOPMAIN:,例用软件实现逻辑函数。其中X、Y、Z、W、F均为位变量,分别对应P1.0、P1.1、P1.2、P1.3和P1.7。由开关为P1.0、P1.1、P1.2、P1.3输入值,而由P1.7输出该逻辑函数值。,ORG5000HXBITP1.0YBITP1.1ZBITP1.2WBITP1.3FBITP1.7TEMPBIT20H.0MOVC,XANLC,YANLC,Z;CXYZMOVTEMP,C;暂存XYZANLC,WORLC,TEMP;CXYZWXYZMOVTEMP,CMOVC,XANLC,/YANLC,W;CORLC,/TEMP;CMOVF,C;输出最后结果END,思考题与习题,4-1把外部RAM5000H的内容拆开,高位送5001H,低位送5002H。4-2把外部RAM3000H开始的100字节的内容传送到从外部RAM3500H开始的连续单元中。4-3设有100个有符号数,连续存放在外部RAM以2000H为首地址的存储区中,编程统计其中正数、负数和零的个数,并分别存放在R5、R6和R7。4-4外部RAM1000H开始连续存放20个双字节无符号数,低字节在前,高字节在后,编写求和程序,将结果存入内部RAM30H,31H,32H单元中。4-5编程计算片内RAM40H47H单元中无符号数的算术平均值(假设和仍为8位数),结果存放在50H(商)和51H(余数)中。,4-6从内部RAM30H开始存有一无符号数据块,其长度在2FH单元中。求出数据块中最小值和最大值并分别存入R6和R7中。4-7将上题中“无符号数”改为“有符号数”,求出其中的最小值和最大值(参考例4-8)。4-8从外部RAM首地址为1000H、长度为50H的数据块中找出第一个ASCII码#,并将其地址送到1050H和1051H单元中,如果没有#,则使1050H和1051H单元的内容为0。4-9把外部RAM30H3FH单元中的ASCII码依次转换为十六进制数,并存入内部RAM60H67H单元之中。4-10假设晶振频率fosc=6MHz,根据图3-11的线路设计灯亮程序。要求将8只发光二极管间隔地分两组,每组4只,两组交叉轮流发光,反复循环不止,每组灯亮持续时间为1s。4-11用软件实现逻辑函数。其中X、Y、Z、W、F均为位变量,分别对应P1.0、P1.1、P1.2、P1.3和P1.7。由P1.0、P1.1、P1.2、P1.3输入值,而由P1.7输出该逻辑函数值。,4-1把外部RAM5000H的内容拆开,高位送5001H,低位送5002H。MOVDPTR,#5000HMOVXA,DPTRMOVR1,ASWAPAANLA,#0FHINCDPTRMOVXDPTR,AMOVA,R1ANLA,#0FHINCDPTRMOVXDPTR,A,4-2把外部RAM3000H开始的100字节的内容传送到从外部RAM3500H开始的连续单元中。MOVDPTR,#3000HMOVR7,#100LOOP:MOVXA,DPTRMOVR1,AMOVA,DPHADDA,#5MOVDPH,AMOVA,R1MOVXDPTR,AMOVA,DPHCLRCSUBBA,#05MOVDPH,ADJNZR7,LOOP,4-3设有100个有符号数,连续存放在外部RAM以2000H为首地址的存储区中,编程统计其中正数、负数和零的个数,并分别存放在R5、R6和R7。MOVDPTR,#2000HMOVR0,#100MOVR5,#0;正数个数MOVR6,#0;负数个数MOVR7,#0;0个数LOOP:MOVXA,DPTRJZZEROJBACC.7,NEGINCR5SJMPLOOP1NEG:INCR6SJMPLOOP1ZERO:INCR7LOOP1:INCDPTRDJNZR0,LOOP,4-4外部RAM1000H开始连续存放20个双字节无符号数,低字节在前,高字节在后,编写求和程序,将结果存入内部RAM30H,31H,32H单元中。MOVDPTR,#2000HMOVR7,#20MOV30H,#0MOV31H,#0MOV32H,#0LOOP:MOVXA,DPTRADDA,30HMOV30H,AINCDPTRMOVXA,DPTRADDA,31HMOV31H,AJNCLOOP1INC31HLOOP1:INCDPTRDJNZR7,LOOP,4-5编程计算片内RAM40H47H单元中无符号数的算术平均值(假设和仍为8位数),结果存放在50H(商)和51H(余数)中。MOVR0,#40HMOVR7,#8CLRCLOOP:ADDA,#R0INCR0DJNZR7,LOOPMOVB,#8DIVABMOV50H,AMOV51H,B,4-6从内部RAM30H开始存有一无符号数据块,其长度在2FH单元中。求出数据块中最小值和最大值并分别存入R6和R7中。,MOVR0,#30HMOVA,R0MOVR6,AMOVR7,ADEC2FHLOOP:INCR0CLRCMOVA,R6SUBBA,R0JNCMINCLRCMOVA,R7SUBBA,R0JNCLOOP1MAX:MOVA,R0MOVR7,ASJMPLOOP1MIN:MOVA,R0MOVR6,ALOOP1:DJNZ2FH,LOOP,4-8从外部RAM首地址为1000H、长度为50H的数据块中找出第一个ASCII码#,并将其地址送到1050H和1051H单元中,如果没有#,则使1050H和1051H单元的内容为0。,MOVDPTR,#1000HMOVR7,#50HLOOP:MOVXA,DPTRCJNEA,#23H,LOOP1SJMPDONE1LOOP1:INCDPTRDJNZR7,LOOPCLRAMOVXDPTR,AINCDPTRMOVXDPTR,ASJMPDONEDONE1:MOVR1,DPLMOVR2,DPHMOVDPTR,#1050HMOVA,R1MOVXDPTR,AINCDPTRMOVA,R2MOVXDPTR,ADONE:END,4-9把外部RAM30H3FH单元中的A

温馨提示

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

评论

0/150

提交评论