微机原理第八章微型计算机的程序设计

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

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

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

资源描述

1第八章微型计算机的程序设计顺序结构程序分支结构程序循环结构程序子程序结构2重点:程序设计方法顺序结构程序分支结构程序循环结构程序子程序结构38.1程序设计步骤1.分析问题2.建立数学模型3.确定算法4.绘制程序流程图5.内存分配6.编制程序7.程序调试4datasegmenta1db'hellon!',0dh,0ah,'$'dataendsStack1segmentparastack……..Stack1endscodesegmentassumecs:code,ds:data,ss:stack1start:movax,datamovds,axmovah,4chint21hcodeendsendstart看一个例子数据段堆栈段代码段58-1顺序程序设计补充:二进制编码的十进制数二进制编码的十进制数就是BCD码(BinaryCodedDecimal)。①压缩BCD码是用4位二进制数表示一位十进制数。一个字节表示两位十进制数。如:10010110B表示96D②非压缩BCD码是用一个字节表示一位十进制数。高4位总是0。如:00001001B表示9D两种BCD码的编码对照表6两种BCD码的编码对照表十进制数压缩BCD码非压缩BCD码0000000000000100010000000120010000000103001100000011………9100100001001100001000000000001000000001100010001000000010000000112000100100000000100000010………71.BCD数加法调整指令DAA和AAA(P196)DAA-----两个压缩BCD数相加调整指令:(AL&0FH)9或者AF=1,则AL加6;(AL&0F0H)90H或CF=1,则AL加60H;如:MOVAX,3456H•ADDAL,AH;AL=8AH•DAA;AL=90H8AAA-----两个非压缩BCD数相加调整指令若(AL&0FH)9或AF=1,则(AL+6)&0FH送AL,AH加1且CF置1;否则:(AL&0F0H)送AL,AH不变且CF保持0不变;如:MOVAX,0806H•ADDAL,AH;AL=0EH,AH=08H(没变)•MOVAH,0•AAA;属于第1种情况,故AL为(AL+6)&0F=14H&0FH=04H;AH=01H9【例8.1】的程序段为:•stacksegmentstack‘stack•dw32dup(0)stack•stackends•datasegment•W1DW8931H•W2DW5678H•SUMDB3DUP(0)•dataends•codesegmentbeginprocfarassumess:stack,cs:code,ds:datapushdssubax,axpushax10movax,datamovds,axMOVAL,BYTEPTRW1;AL=31H(+78H)ADDAL,BYTEPTRW2;AL=A9H,CF=0,AF=0DAA;BCD数加法调整指令;AL=09H,CF=1MOVSUM,ALMOVAL,BYTEPTRW1+1;AL=89H(+56H)ADCAL,BYTEPTRW2+1;AL=E0H,CF=0,AF=1DAA;AL=46H,CF=1MOVSUM+1,ALMOVSUM+2,0;处理向万位的进位RCLSUM+2,1;也可用指令ADCSUM+2,0retbeginendpcodeendsendbegin11例8.2非压缩BCD数W1与W2(均为字变量)相加,将其和送到SUM字节变量中。•datasegment•W1DW0809H;即89D•W2DW0607H;即67D•SUMDB3DUP(0)•;一个字节放1位BCD码,用来放加完后的值156•dataends12MOVAX,W1;AX=0809H,W2为0607HADDAL,BYTEPTRW2;AL=10H,CF=0,AF=1AAA;属于第一种情况,故;AL为(AL+06H)&0FH=10H+06H)&0FH;=16H&0FH=06H=AL;;AH加1且CF置CF=1,所以AH=08H+1=09H,则AX=0906HMOVSUM,AL;(SUM)=06HMOVAL,AH;AL=09HADDAL,BYTEPTRW2+1;AL=09H+06H=0FH,属于第1种情况MOVAH,0AAA;AL=05H,AH=01H;第一种情况处理:AL=(AL+06H)&0FH,因0FH+06H=15H,故AL=05H,AH=AH+1=0+1=01H,所以AX=0105HMOVWORDPTRSUM+1,AX;(SUM+1)=05,(SUM+2)=01此句也可表达为MOV[SUM],AL;见P151132.BCD数减法调整指令DAS和DAA(自看,P198)DAS-----两个压缩BCD数相减调整指令:(AL&0FH)9,则AL减6;(AL&0F0H)90H,则AL减60H;如:MOVAX,5634H•SUBAL,AH;AL=DEH,有借位•DAS;AL=78H,保持借位即134-56AAS-----两个非压缩BCD数相减调整指令143.非压缩BCD数乘除法调整指令AAM和AAD(P199,自看)15顺序程序设计举例:例7.7镜子程序,P183-184•datasegment•OBUFDB‘’0DH,0AH,‘$’•IBUFDB0FFH,0,255DUP(0)•dataends16MOVDX,OFFSETOBUF;显示提示符“”并回车换行MOVAH,O9INT21HMOVDX,OFFSETIBUF;输入并显示字符串MOVAH,10INT21HMOVBL,IBUF+1MOVBH,0MOVIBUF[BX+2],‘$’MOVDL,0AH;换行MOVAH,2INT21HMOVDX,OFFSETIBUF+2;再显示输入的字符串MOVAH,9INT21H178.2分支程序设计特点:利用改变标志位的指令和转移指令来实现。1.无条件转移指令:JMP(见P207)2.条件转移指令:Jcondshort-label(偏移地址送到IP)特点:满足条件,则实现段内转移;80386开始才可以转移到代码段的任何位置。1819202122232425268.3循环程序设计27288.3.2重复控制指令1.LOOPshort-label2.LOOPZshort-label或LOOPEshort-label3.LOOPNZshort-label或LOOPNEshort-label4.JCXZshort-label5.JECXZshort-label共同点:均受CX或EXC的值控制,详见P214-215298.3.3单重循环设计举例例8.11计算Z=X+Y,其中X和Y是双字变量分析:双字变量是4个字节,则和可能占5个字节303132333435363738作业8.4编写求两个4位非压缩BCD数之和,将和送显示器显示的程序。(P261)分析:两加数各要4个字节单元,可以为DD类型;考虑到进位,和要5个字节单元,另外,输出到显示器的结束符号’$’需要一个单元存放,故共需6个字节。因此,数据段定义为:datasegmentW1DD01020304HW2DD05060708HSUMDB5DUP(0)DB‘$’dataends39代码段中的核心语句•MOVCX,4•MOVSI,0•MOVDI,4;要在[SUM+4]中放个位,[SUM+0]中放最高位的进位。•XORAX,AX;清CFA1:MOVAL,BYTEPTRW1[SI];ADCAL,BYTEPTRW2[SI]AAAMOVSUM[DI],ALINCSIDECDILOOPA1MOVSUM[DI],0RCLSUM[DI];以上是得到加的结果,放在SUM中。下面是输出到显示器的程序语句MOVDX,OFFSETSUMMOVAH,09INT21H40作业8.5编写求两个4位压缩BCD数之和,将和送显示器显示的程序。(P261)分析:两个加数各要2个字节单元,可以为DW类型;考虑到进位,和要3个字节单元,另外,输出到显示器的结束符号’$’需要一个单元存放,故共需4个字节。因此,数据段定义为:datasegmentW1DW1234HW2DW5678HSUMDB3DUP(0)DB‘$’dataends41代码段中的核心语句•MOVCX,2•MOVSI,0•MOVDI,2;要在[SUM+2]中放个位,[SUM+0]中放最高位的进位。•XORAX,AX;清CFA1:MOVAL,BYTEPTRW1[SI];ADCAL,BYTEPTRW2[SI]DAAMOVSUM[DI],ALINCSIDECDILOOPA1MOVSUM[DI],0RCLSUM[DI];以上是得到加的结果,放在SUM中。下面是输出到显示器的程序语句MOVDX,OFFSETSUMMOVAH,09INT21H42作业8.17编写求输入算式’加数1+加数2’的和并送显。(加数及其和均为4位(即指压缩)BCD数,P262)分析:要求先有屏幕显示输出‘加数1+加数2:’,然后从键盘输入两个4个字节的BCD数,加完后送显。用到的变量:W1和W2因为从键盘输入,均不确定是几位十进制,故需确定其最大位数不超过要用W143例6.2将内存(10050)单元的内容拆成两段,每段4位,并将它们分别存入内存(10051)和(10052)单元。即(10050)单元中的低4位放入(10051)单元中的低4位,而(10050)单元中的高4位放入(10052)单元中的低4位。44开始初始化用间址方法取数到AL用AND指令将该数“与”OFH取得低4位,存入内存(10051)单元再取出原始数到AL逻辑右移得高4位,存入内存(10052)单元暂停逻辑右移得高4位,存入内存(10052)单元45程序段如下:MOVAX,1000HMOVDS,AX;给段寄存器DS赋值MOVSI,50HMOVAL,[SI];把物理地址为10000H+0050H=10050H;中的存储内容给ALANDAL,0FH;把AL中的前4位清0,取得低4位值MOV[SI+1],AL;把得到的低4位放到(10051H)单元MOVAL,[SI];再取出需拆字节放到AL中MOVCL,4SHRAL,CL;逻辑右移4次,前4位补0;MOV[SI+2],AL;放入(10052)单元ANDAL,F0HMOVE[SI+2],AL466-3、分枝结构程序两分支结构47多分支结构48例6.3求AX累加器和BX寄存器中两个无符号数之差的绝对值,结果放在内存(2800)单元中。分析:不知AX与BX中数的大小,故需先判断谁大,然后用大的减小的才可求得绝对值,其流程图如图6-549开始初始化,清CFAX-BXAXAX内存(2800和(2801)单元暂停逻辑右移得高4位,存入内存(10052)单元AX-BX≥0AX-BXAXBX内存(2800和(2801)单元否是50相应程序段如下(p141)CLCSUBAX,BXJCAA;进位位为1,就转移到AAMOVDI,2800HMOV[DI],AXHLTAA:SUBBX,AXMOVDI,2800HMOV[DI],BXHLT51例6.4从外设71号中取一个数M,判断其值是否在10和20之间,即10≤M20.如果M≥20H,则送0FFH给外设73H;如果M10,则送00H给外设73H;如果10≤M20,则送88H给外设73H.分析:根据题意,我们可以看出这是一个需要两次判断M大小的问题。我们可以先判M是否大于10,再判M是否大于20。(2)根据解决问题的思路,我们先画出程序流程图,如下图所示。从图6中程序流程图来看,两个分支都要“回归”原程序。(3)编制的程序如下:5253相关程序段如下(p142)START:INAL,71H;将71H端口的字节读入ALCLC;

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

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

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

×
保存成功