微机原理第八章微型计算机的程序设计_第1页
微机原理第八章微型计算机的程序设计_第2页
微机原理第八章微型计算机的程序设计_第3页
微机原理第八章微型计算机的程序设计_第4页
微机原理第八章微型计算机的程序设计_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

(优选)微机原理第八章微型计算机的程序设计目前一页\总数九十页\编于五点重点:程序设计方法顺序结构程序分支结构程序循环结构程序子程序结构目前二页\总数九十页\编于五点8.1程序设计步骤1.分析问题2.建立数学模型3.确定算法4.绘制程序流程图5.内存分配6.编制程序7.程序调试目前三页\总数九十页\编于五点datasegmenta1db'hellon!',0dh,0ah,'$'dataendsStack1segmentparastack……..Stack1endscodesegmentassumecs:code,ds:data,ss:stack1

start:movax,datamovds,axmovah,4chint21hcodeends

endstart看一个例子数据段堆栈段代码段目前四页\总数九十页\编于五点8-1顺序程序设计补充:二进制编码的十进制数二进制编码的十进制数

就是BCD码(BinaryCodedDecimal)。①压缩BCD码是用4位二进制数表示一位十进制数。一个字节表示两位十进制数。如:10010110B表示96D②非压缩BCD码是用一个字节表示一位十进制数。高4位总是0。如:00001001B表示9D

两种BCD码的编码对照表目前五页\总数九十页\编于五点两种BCD码的编码对照表目前六页\总数九十页\编于五点1.BCD数加法调整指令DAA和AAA(P196)DAA-----两个压缩BCD数相加调整指令:(AL&0FH)>9或者AF=1,则AL加6;(AL&0F0H)>90H或CF=1,则AL加60H;如:MOVAX,3456HADDAL,AH;AL=8AHDAA;AL=90H目前七页\总数九十页\编于五点AAA-----两个非压缩BCD数相加调整指令若(AL&0FH)>9或AF=1,则(AL+6)&0FH送AL,AH加1且CF置1;否则:(AL&0F0H)送AL,AH不变且CF保持0不变;如:MOVAX,0806HADDAL,AH;AL=0EH,AH=08H(没变)MOVAH,0AAA;属于第1种情况,故AL为(AL+6)&0F=14H&0FH=04H;AH=01H目前八页\总数九十页\编于五点【例8.1】的程序段为:stacksegmentstack‘stackdw32dup(0)stackstackendsdatasegmentW1 DW8931HW2 DW5678HSUMDB 3DUP(0)data endscode segmentbegin procfar assumess:stack,cs:code,ds:data pushds subax,ax pushax

目前九页\总数九十页\编于五点

movax,data movds,ax MOVAL,BYTEPTRW1;AL=31H(+78H) ADDAL,BYTEPTRW2;AL=A9H,CF=0,AF=0 DAA ;BCD数加法调整指令;AL=09H,CF=1 MOVSUM,AL MOVAL,BYTEPTRW1+1;AL=89H(+56H) ADCAL,BYTEPTRW2+1;AL=E0H,CF=0,AF=1 DAA ;AL=46H,CF=1 MOVSUM+1,AL MOVSUM+2,0;处理向万位的进位 RCLSUM+2,1;也可用指令ADCSUM+2,0 retbeginendpcodeends endbegin目前十页\总数九十页\编于五点例8.2非压缩BCD数W1与W2(均为字变量)相加,将其和送到SUM字节变量中。datasegmentW1 DW0809H;即89DW2 DW0607H;即67DSUMDB 3DUP(0);一个字节放1位BCD码,用来放加完后的值156data ends目前十一页\总数九十页\编于五点 MOVAX,W1;AX=0809H,W2为0607H ADDAL,BYTEPTRW2;AL=10H,CF=0,AF=1 AAA ;属于第一种情况,故;AL为(AL+06H)&0FH=10H+06H)&0FH;=16H&0FH=06H=AL;;AH加1且CF置CF=1,所以AH=08H+1=09H,则AX=0906H MOVSUM,AL;(SUM)=06H MOVAL,AH;AL=09H ADDAL,BYTEPTRW2+1

;AL=09H+06H=0FH,属于第1种情况 MOVAH,0 AAA ;AL=05H,AH=01H;第一种情况处理:AL=(AL+06H)&0FH,因0FH+06H=15H,故AL=05H,AH=AH+1=0+1=01H,所以AX=0105H MOVWORDPTRSUM+1,AX;(SUM+1)=05,(SUM+2)=01

此句也可表达为MOV[SUM],AL;见P151目前十二页\总数九十页\编于五点2.BCD数减法调整指令DAS和DAA(自看,P198)DAS-----两个压缩BCD数相减调整指令:(AL&0FH)>9,则AL减6;(AL&0F0H)>90H,则AL减60H;如:MOVAX,5634HSUBAL,AH;AL=DEH,有借位DAS;AL=78H,保持借位即134-56AAS-----两个非压缩BCD数相减调整指令目前十三页\总数九十页\编于五点3.非压缩BCD数乘除法调整指令AAM和AAD(P199,自看)目前十四页\总数九十页\编于五点顺序程序设计举例:

例7.7镜子程序,P183-184datasegmentOBUFDB‘>’0DH,0AH,‘$’IBUFDB0FFH,0,255DUP(0)data ends目前十五页\总数九十页\编于五点MOVDX,OFFSETOBUF;显示提示符“>”并回车换行MOVAH,O9INT21HMOVDX,OFFSETIBUF;输入并显示字符串MOVAH,10INT21HMOVBL,IBUF+1MOVBH,0MOVIBUF[BX+2],‘$’MOVDL,0AH;换行MOVAH,2INT21HMOVDX,OFFSETIBUF+2;再显示输入的字符串MOVAH,9INT21H目前十六页\总数九十页\编于五点8.2分支程序设计特点:利用改变标志位的指令和转移指令来实现。无条件转移指令:JMP(见P207)条件转移指令:Jcondshort-label(偏移地址送到IP)特点:满足条件,则实现段内转移;80386开始才可以转移到代码段的任何位置。目前十七页\总数九十页\编于五点目前十八页\总数九十页\编于五点目前十九页\总数九十页\编于五点目前二十页\总数九十页\编于五点目前二十一页\总数九十页\编于五点目前二十二页\总数九十页\编于五点目前二十三页\总数九十页\编于五点目前二十四页\总数九十页\编于五点目前二十五页\总数九十页\编于五点8.3循环程序设计目前二十六页\总数九十页\编于五点目前二十七页\总数九十页\编于五点8.3.2重复控制指令LOOPshort-labelLOOPZshort-label或LOOPEshort-labelLOOPNZshort-label或LOOPNEshort-labelJCXZshort-labelJECXZshort-label共同点:均受CX或EXC的值控制,详见P214-215目前二十八页\总数九十页\编于五点8.3.3单重循环设计举例例8.11计算Z=X+Y,其中X和Y是双字变量分析:双字变量是4个字节,则和可能占5个字节目前二十九页\总数九十页\编于五点目前三十页\总数九十页\编于五点目前三十一页\总数九十页\编于五点目前三十二页\总数九十页\编于五点目前三十三页\总数九十页\编于五点目前三十四页\总数九十页\编于五点目前三十五页\总数九十页\编于五点目前三十六页\总数九十页\编于五点目前三十七页\总数九十页\编于五点作业8.4编写求两个4位非压缩BCD数之和,将和送显示器显示的程序。(P261)分析:两加数各要4个字节单元,可以为DD类型;考虑到进位,和要5个字节单元,另外,输出到显示器的结束符号’$’需要一个单元存放,故共需6个字节。因此,数据段定义为:datasegment

W1DD01020304H W2DD05060708H SUMDB5DUP(0) DB‘$’dataends目前三十八页\总数九十页\编于五点代码段中的核心语句MOVCX,4MOVSI,0MOVDI,4;要在[SUM+4]中放个位,[SUM+0]中放最高位的进位。XORAX,AX;清CFA1:MOVAL,BYTEPTRW1[SI]; ADCAL,BYTEPTRW2[SI] AAA MOVSUM[DI],AL INCSI DECDI LOOPA1 MOVSUM[DI],0 RCLSUM[DI];以上是得到加的结果,放在SUM中。下面是输出到显示器的程序语句

MOVDX,OFFSETSUM MOVAH,09 INT21H

目前三十九页\总数九十页\编于五点作业8.5编写求两个4位压缩BCD数之和,将和送显示器显示的程序。(P261)分析:两个加数各要2个字节单元,可以为DW类型;考虑到进位,和要3个字节单元,另外,输出到显示器的结束符号’$’需要一个单元存放,故共需4个字节。因此,数据段定义为:datasegment

W1DW1234H W2DW5678H SUMDB3DUP(0) DB‘$’dataends目前四十页\总数九十页\编于五点代码段中的核心语句MOVCX,2MOVSI,0MOVDI,2;要在[SUM+2]中放个位,[SUM+0]中放最高位的进位。XORAX,AX;清CFA1:MOVAL,BYTEPTRW1[SI]; ADCAL,BYTEPTRW2[SI] DAA MOVSUM[DI],AL INCSI DECDI LOOPA1 MOVSUM[DI],0 RCLSUM[DI];以上是得到加的结果,放在SUM中。下面是输出到显示器的程序语句

MOVDX,OFFSETSUM MOVAH,09 INT21H

目前四十一页\总数九十页\编于五点作业8.17编写求输入算式’加数1+加数2’的和并送显。(加数及其和均为4位(即指压缩)BCD数,P262)

分析:要求先有屏幕显示输出‘加数1+加数2:’,然后从键盘输入两个4个字节的BCD数,加完后送显。用到的变量:W1和W2因为从键盘输入,均不确定是几位十进制,故需确定其最大位数不超过要用W1目前四十二页\总数九十页\编于五点例6.2将内存(10050)单元的内容拆成两段,每段4位,并将它们分别存入内存(10051)和(10052)单元。即(10050)单元中的低4位放入(10051)单元中的低4位,而(10050)单元中的高4位放入(10052)单元中的低4位。目前四十三页\总数九十页\编于五点开始初始化用间址方法取数到AL用AND指令将该数“与”OFH取得低4位,存入内存(10051)单元再取出原始数到AL逻辑右移得高4位,存入内存(10052)单元暂停逻辑右移得高4位,存入内存(10052)单元目前四十四页\总数九十页\编于五点程序段如下:MOVAX,1000HMOVDS,AX;给段寄存器DS赋值MOVSI,50HMOVAL,[SI];把物理地址为10000H+0050H=10050H

;中的存储内容给ALANDAL,0FH;把AL中的前4位清0,取得低4位值MOV[SI+1],AL;把得到的低4位放到(10051H)单元MOVAL,[SI];再取出需拆字节放到AL中MOVCL,4SHRAL,CL;逻辑右移4次,前4位补0;MOV[SI+2],AL;放入(10052)单元ANDAL,F0HMOVE[SI+2],AL目前四十五页\总数九十页\编于五点6-3、分枝结构程序两分支结构目前四十六页\总数九十页\编于五点多分支结构

目前四十七页\总数九十页\编于五点例6.3求AX累加器和BX寄存器中两个无符号数之差的绝对值,结果放在内存(2800)单元中。分析:不知AX与BX中数的大小,故需先判断谁大,然后用大的减小的才可求得绝对值,其流程图如图6-5目前四十八页\总数九十页\编于五点开始初始化,清CFAX-BXAXAX内存(2800和(2801)单元暂停逻辑右移得高4位,存入内存(10052)单元AX-BX≥0AX-BXAXBX内存(2800和(2801)单元否是目前四十九页\总数九十页\编于五点相应程序段如下(p141)

CLCSUBAX,BXJCAA;进位位为1,就转移到AAMOVDI,2800HMOV[DI],AXHLTAA:SUBBX,AXMOVDI,2800HMOV[DI],BXHLT目前五十页\总数九十页\编于五点例6.4从外设71号中取一个数M,判断其值是否在10和20之间,即10≤M<20.

如果M≥20H,则送0FFH给外设73H;

如果M<10,则送00H给外设73H;

如果10≤M<20,则送88H给外设73H.

分析:根据题意,我们可以看出这是一个需要两次判断M大小的问题。我们可以先判M是否大于10,再判M是否大于20。

(2)根据解决问题的思路,我们先画出程序流程图,如下图所示。从图6中程序流程图来看,两个分支都要“回归”原程序。

(3)编制的程序如下:目前五十一页\总数九十页\编于五点目前五十二页\总数九十页\编于五点相关程序段如下(p142)

START:INAL,71H;将71H端口的字节读入AL

CLC;清除CF

CMPAL,10;AL-10,结果不返回

JCLP1;小于10转LP1

CMPAL,20;AL-20,结果不返回

JCLP2;10AL<20转LP2

MOVBL,0FFH;将0FFH送入BL寄存器

LP3:OUT73H,BL;将0FFH输出到73H端口

HLT;暂停

LP1:MOVBL,00

JMPLP3

LP2:MOVBL,88H

JMPLP3

只能用累加器AX/AL作为执行输入/输出过程的机构,故要改为AL。故OUT73H,BL替换为:MOVAL,BLOUT73H,AL目前五十三页\总数九十页\编于五点赋初值条件循环体修改YN开始6-4、循环程序设计1、先判断条件,然后执行循环体。目前五十四页\总数九十页\编于五点赋初值循环体修改条件?NY开始2、先执行循环体,然后判断条件。特点:至少执行一次循环体。目前五十五页\总数九十页\编于五点例6.5求两个多字节数之和,这两个数在10050H地址开始的内存单元中,连续存放,低位在小地址一端,结果放在这两个数之后。设这两个多字节数均为8个字节。流程图如下:目前五十六页\总数九十页\编于五点初始化段地址DS:1000H第一个数指针SI=50H第二个数指针DI=58H结果指针BX=60H循环次数CX=4清除进位位CF取一个字AXCX=0YN开始和数=前一次+(指针)即AXAX+[DI]+CF

SISI+2修改指针DIDI+2计数器CXCX-1暂停结果和的指针起始值应该为60H,请分析!目前五十七页\总数九十页\编于五点相关程序段如下(p144)START:MOVAX,1000HMOVDS,AXMOVSI,50H;第一个指数指针SI=50HMOVDI,58H;第二个指数指针DI=58HMOVBX,60H;结果指针60HCLC;清进位CF=0AA:MOVAX,[SI];取一个字到AXADCAX,[DI];AX=AX+[DI]+CFMOV[BX],AX;存一个字到BX;

PUSHF;保护进位CF;

ADDSI,2;修改第一个数的指针SI=SI+2ADDDI,2;修改第二个数的指针DI=DI+2ADDBX,2;修改结果指针BX=BX+2POPF;恢复标志寄存器

LOOPAA;CX=CX-1,若CX≠0,转AAHLT;CX=0,暂停目前五十八页\总数九十页\编于五点例2、编程序统计AX寄存器中1的个数。(采用AX=0?做为循环的条件)(本题即书上第六章习题第6.6题,见P152)其程序流程图如下图目前五十九页\总数九十页\编于五点目前六十页\总数九十页\编于五点程序如下:CODESEGMENTASSUMECS:CODESTART:MOVCX,0;存1的个数AGAIN:TESTAX,0FFFFHJZBSALAX,1;算术左移一位,此处用SHL(逻辑左移)也可JNCA;进位不等于1,则转A;INCCX;进位为1,CX=CX+1;A:JMPAGAINB:MOVAH,4CH;相当于B:HLTINT21HCODEENDS ENDSTART目前六十一页\总数九十页\编于五点例6.6要求设计一个软件延时程序,延时时间约1ms左右。

(1)分析题目:此题是想让计算机做一些无用的操作,来拖延时间。我们可以从指令手册中查得各条指令所需的时间节拍,但一般指令执行时间只有几个时钟周期,亦即只有几个微秒,为了能用较少的指令来编较长时间的延时,我们可以利用循环程序结构。(2)程序流程图如图6-11所示。目前六十二页\总数九十页\编于五点目前六十三页\总数九十页\编于五点

在这个框图中,初始化部分由于没有数据操作问题,因此也就不用设置间接地址指针。另外,延时的时间主要取决于循环体及循环次数。我们从手册上可以查得PUSHF和POPF指令分别为10和8个时钟节拍,LOOPBX指令为3.4个时钟节拍在此循环体需要用10+8+3.4=21.4拍,而每个时钟节拍是根据此系统的晶振频率而定的。假设此系统用的是8Hz的晶振,则每个时钟节拍需要0.125微秒因此我们可以根据下列公式算出循环次数:目前六十四页\总数九十页\编于五点目前六十五页\总数九十页\编于五点目前六十六页\总数九十页\编于五点目前六十七页\总数九十页\编于五点6-5子程序子程序:相对主程序而言,是被主程序调用的程序.子程序调用示意图:

目前六十八页\总数九十页\编于五点子程序是程序设计中经常使用的程序结构,通过把一些固定的、经常使用的功能做成子程序的形式,可以使源程序及目标程序大大缩短,提高程序设计的效率和可靠性。对于一个子程序,应该注意它的入口参数和出口参数。入口参数是由主程序传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。另外,子程序所使用的寄存器和存储单元往往需要保护,以免影响返回后主程序的运行。主程序在调用子程序时,一方面初始数据要传给子程序,另一方面子程序运行结果要传给主程序,因此,主子程序之间的参数传递是非常重要的。目前六十九页\总数九十页\编于五点参数传递一般有三种方法实现。

(1)利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。(2)利用存储单元。这种参数传递方法,把所需传递的参数直接放在子程序调用指令代码之后。(3)利用堆栈。这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数,其程序流程图如下图所示。目前七十页\总数九十页\编于五点堆栈程序流程图目前七十一页\总数九十页\编于五点例6.7延时1秒的子程序段(见P148)DELAYS:PUSHFPUSHBXPUSHCXMOVBX,3E8HMOVCX,176HLP2:MOVCX,176HLP1:PUSHFPOPFLOOPLP1DECBXJNZLP2POPCXPOPBXPOPFRETSUB_DELAYSPROCNEARSUB_DELAYSENDP把寄存器FR、BX、CX的内容压进堆栈,以保护CPU现场按“先入后出”原则把栈中内容弹回到寄存器中去,以恢复CPU现场。目前七十二页\总数九十页\编于五点例6.8

找一个数据块中的最大数,其中数据块的长度>1,并且放在内存(2001)单元中,而数据块本身是从(2002)单元开始存放的,最后,把找出的最大值放到(2000)单元中。假设这段数据块中的数都是无符号的8位数。(1)分析题目:此题必定是个循环程序,而且在处理部分应包括判断分支环节。(2)根据指令系统,我们可以采用寻找最大值的计算方法。目前七十三页\总数九十页\编于五点

首先,我们用00值放在AL累加器中作为最大值;然后,用数据块的第一个数和AL中的数做比较,如果比00大,则用这个数取代00,放入AL中;接着取出第二个数与AL中的数做比较,如果比它大,取而代之,否则不取代,如此往复,直至最后一个数。这样,最后AL累加器中必定存放着最大的数。这就是寻找最大值的方法,而数据块的总长度(数的个数)就是循环次数。(3)绘制出此计算过程的程序流程如图6-l5所示。目前七十四页\总数九十页\编于五点目前七十五页\总数九十页\编于五点目前七十六页\总数九十页\编于五点改为子程序时的

程序段MAX:PUSHFPUSHAXPUSHCXPUSHSISTART:MOVSI,2001HMOVCL,[SI]INCSIMOVAL,00MOVCH,00HLP:CLCCMPAL,[SI]JCBBJMPAABB:MOVAL,[SI]AA:INCSILOOPLPMOV[2000H],ALHLTPOPSIPOPCXPOPAXPOPFRETSUB1PROCNEAR/FARSUB1ENDP目前七十七页\总数九十页\编于五点目前七十八页\总数九十页\编于五点1、调用程序和子程序在同一代码段子程序的类型应为NEARcod1segment………

CALLSUB1…..

SUB1PROCNEAR…….RETSUB1ENDP

cod1ends红色部分为子程序子程序调用方式介绍:目前七十九页\总数九十页\编于五点2、调用程序和子程序不在同一代码段子程序的类型应为FAR。子程序SUB1的类型是FAR,可段间调用,也可段内调用.CODE2SEGMENT……..

SUB1PROCNEAR

…….RETSUB1ENDP……..

CALLSUB1

…….CODE2ENDSCODE1SEGMENT………

CALLFARPTRSUB1……..

CODE1ENDS目前八十页\总数九十页\编于五点

CODE2SEGMENT……..

SUB1PROCNEAR

…….SUB1ENDP……..

CALLSUB1;段内调用

…….CODE2ENDS

子程序SUB1的类型是FAR,可段间调用,也可段内调用.目前八十一页\总数九十页\编于五点6.6查表程序要点:1)确定表格的起始地址(或称基地址)给BX2)确定要查找对象在表中的序号,(或称索引值)给AL。3)要用到换码指令XLAT,将累加器中的值变为内存表格中的某一个值。注:表格的起始地址为内存物理地址中的偏移地址目前八十二页\总数九十页\编于五点例6.9:在5.2节中表5-2所列的十进制的7段显示码实例,用程序来实现,假设这段数据存放在2000H开始的内存中,取出“5”所对应的7段码。程序段为:START:MOVBX,2000HMOVAL,5XLATHLT目前八十三页\总数九十页\编于五点例2编一子程序利用XLAT指令把十六进制数转换成ASCII码。假设ASCII码存放在以DAT1为首地址的数据区中,对应的十六进制数放在以DAT2为首地址的数据区中,转换结果送以DAT3为首地址的数据区中。分析:首地址即基址DAT1送给BX,ASCII码表总共有7FH(即128)个字符。所以索引值要从0变到128(存放在DAT2为首地址的数据区中),需要用到循环将得到的值送到以DAT3为首地址的数据区中。查表核心程序语句为:

MOVBX,2000H(表的首地址)

MOVAL,5(表中对应的偏移量,即索引值)

XLAT此程序段的结果是将查到的结果送到累加器AX中目前八十四页\总数九十页\编于五点SUB1PROCNEARSTART:LEASI,[DAT2];或为MOVSI,DAT2LEADI,[DAT3];或为MOVDI,DAT3MOVBX,DAT1MOVCX,16LP1:MOVAL,[SI];或为LODSB,即从RAMAX/ALXLATMOV[DI],AL;STOSB,即从AX/ALRAM

INCSI;若用了LODSB与STOSB,则不用此两句,

INCDI

;因为串操作时SI和DI作自动增量修改

温馨提示

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

评论

0/150

提交评论