• 574.00 KB
  • 2022-04-29 14:22:35 发布

最新最新人教版小学六年级数学上册上学期课件分数乘法时解决问题1课件PPT.ppt

  • 75页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'最新人教版小学六年级数学上册上学期课件分数乘法时解决问题1 (4)母鸡的只数相当于公鸡的。(1)乙数是甲数的。(2)乙数的相当于甲数。(3)母鸡只数等于小鸡的只数。下面各题分别把谁看作单位“1”?复习导入 其中一半种各种萝卜。红萝卜地的面积占整块萝卜地的。14大棚共480m28理解题意已知条件整个大棚的面积是480m2。萝卜地的面积占整个大棚面积的。红萝卜地的面积占萝卜地面积的。所求问题红萝卜地的面积是多少平方米。2141新知探究红萝卜地有多少平方米? 刚才用两种方法求出了红萝卜的面积,那么对不对呢?都可以怎样检验?红萝卜的面积乘4表示萝卜地的面积,再乘2就是大棚的面积。预设1:60×4×2=480()把大棚面积平均分成8份,红萝卜地占1份,用1份的面积乘8就是大棚的面积。预设2:60×(4×2)=480()新知探究 其中一半种各种萝卜。红萝卜地的面积占整块萝卜地的。14大棚共480m28新知探究红萝卜地有多少平方米?规范解答解:480××=60(m2)答:红萝卜地有60m2。4121 1.求一个数的几分之几是多少,属于两个量相比的关系。用线段图可以比较清楚地表示出数量之间的关系:单位“1”的量×比较量占单位“1”的几分之几=比较量2.解决连续求一个数的几分之几是多少的实际问题,弄清每一步单位“1”的量是谁最关键。课堂小结 小亮的储蓄箱中有18元,小华储蓄的钱是小亮的,小新储蓄的钱是小华的。小新储蓄了多少元?6532解:18××=10(元)答:小新储蓄了10元。5623巩固练习 《微型计算机原理与接口技术》第5版第4章汇编语言程序设计 §4.3汇编语言程序设计方法与实例 汇编语言程序设计汇编语言程序设计采用结构化程序设计方法。每个程序只有一个入口,必须要有出口,中间内容不能含有死循环语句。程序都按照顺序结构、条件分支结构和循环结构等3种基本结构进行构建。设计时先考虑总体、全局目标,再考虑细节、局部问题,把复杂问题分解为一个个模块或子目标,一步步进行设计。将这些基本结构、子模块合理组合起来,就可构成一个大的程序。 汇编语言程序设计编程时要在程序行上适当加注释。这样设计出来的程序层次分明,结构清楚,可读性强,便于调试。编写较复杂的程序时,一般应先画出程序流程图,将设计步骤细化,再按流程图设计编写程序。下面先从3种基本结构入手,介绍编程方法和应用实例,再介绍实际应用较多的代码转换、过程调用等编程例子,后者也要用到3种基本结构。通过学习这些实例,掌握汇编语言程序设计的基本方法,为编写复杂程序奠定基础。 4.3.1顺序结构程序设计4.3.2分支程序设计4.3.3循环结构程序4.3.4代码转换程序4.3.5过程调用 4.3.1顺序结构程序设计顺序结构程序也称为简单程序,这种程序按指令排列的先后顺序逐条执行。例4.33编写显示一个笑脸字符在显示器上的程序,程序命名为HAPPY.ASM。PROG1SEGMENTASSUMECS:PROG1;只有1个代码段START:MOVDL,1;DL要显示字符;的ASCII码MOVAH,2;AH功能号2INT21H;显示笑脸符MOVAX,4C00HINT21H;返回DOSPROG1ENDSENDSTART 4.3.1顺序结构程序设计如果用循环程序将00FFH先后送入DL,再利用DOS的2号功能调用,则可显示全部的标准和扩展ASCII码,包括全部控制符以及积分符、希腊字母等。例4.34由人机对话从键盘输入1个10进制数(0~9),查表求键入数字的平方值,存入AL寄存器中,并显示有关的提示信息。试编写汇编语言程序。解:数据段中,先给出数字0~9的平方值,逐个存入TABLE开始的内存中,形成表格,以便查找,再给出等待显示的提示信息。代码段由3个部分组成:显示提示信息;等待键入数字;查表求键入数字的平方值,并将结果存入AL中。 程序如下:DATASEGMENTTABLEDB0,1,4,9,16,25,36,49,64,81;数字0~9的平方值BUFDB‘Pleaseinputanumber(0~9):’,0DH,0AH,‘$’;提示信息DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;设置DSMOVDX,OFFSETBUF;设置DX,使字符串首地址=DS:DXMOVAH,9H;9号DOS功能调用INT21H;显示提示信息例4.34 MOVAH,01;1号功能调用,等待键入字符INT21H;AL键入数字的ASCII码ANDAL,0FH;AL截下数字值;(表内元素序号)MOVBX,OFFSETTABLE;BX指向表头地址TABLEMOVAH,0;AX寄存器高字节清0ADDBX,AX;表头地址+键入数字(AL),结果存入BXMOVAL,[BX];查表求得平方值;MOVAX,4C00HINT21H;返回DOSCODEENDSENDSTART例4.34 4.3.1顺序结构程序设计例4.35在存储单元A1和A2中,各存有一个2字节的无符号数,低字节在前,高字节在后。编程将两数相加,结果存入SUM单元,也要求低字节在前,高字节在后,进位存入最后一个字节单元。DATASEGMENTA1DB56H,78H;数A1A2DB4FH,9AH;数A2SUMDB3DUP(0);存两数相加之和,考虑进位位DATAENDS;CODESEGMENTASSUMECS:CODE,DS:DATA BEGIN:MOVAX,DATAMOVDS,AX;设置数据段基址MOVBX,0;BX为地址指针,初值清0CLC;进位位清0MOVAL,A1[BX];取低字节A1ADCAL,A2[BX];与A2低字节相加MOVSUM[BX],AL;存入SUM单元(低字节)INCBX;调整指针MOVAL,A1[BX];取高字节相加ADCAL,A2[BX]MOVSUM[BX],AL;存高字节JNCSTOP;无进位,转STOP例4.35 INCBX;有进位MOVAL,0INCALMOVSUM[BX],AL;进位存入SUM+2单元STOP:MOVAX,4C00HINT21HCODEENDSENDBEGIN例4.35 4.3.1顺序结构程序设计4.3.2分支程序设计4.3.3循环结构程序4.3.4代码转换程序4.3.5过程调用 4.3.2分支程序设计要求程序根据不同条件选择不同的处理方法,即程序处理步骤中出现了分支,应根据某一特定条件,选择其中一个分支执行。例4.36设某学生的英语成绩已存放在AL寄存器中,如果分数低于60分,则打印F,如高于等于85分,则打印G,否则打印P。这就是一个分支程序。程序框图 4.3.2分支程序设计下面介绍一个比较复杂的分支程序,其中也包含了循环程序。例4.37在存储器中以首地址BUF开始存有一串字符,字符串个数用COUNT表示。要求统计数字0~9、字母A~Z和其它字符的个数,并分别将它们的个数存储到NUM开始的3个内存单元中去。在ASCII码表中,数字09的ASCII码为30H~39H,大写字母A~Z的ASCII码为41H~5AH,其余值为其它字符或控制符的ASCII码值。可以将ASCII码分成5个部分或5个分支来处理,其示意图如下 4.3.2分支程序设计程序框图先从BUF单元取出1个字符的ASCII码,经分支程序判断它属于数字、字母还是其它字符,然后使相应计数器的值+1。数字个数存放在DL中,字母个数存放在DH中。接下来分析第2个数,直至所有字符处理完后,将统计出的个数送入相应存储单元。例4.37 DATASEGMENTBUFDB‘+36’,‘PRINT’,‘abc’,‘2A0CH’,‘#’;一串字符COUNTEQU$-BUF;COUNT=字符总个数NUMDB3DUP(?);先后存放存数字、字母;和其它字符个数DATAENDS;CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;设置数据段MOVCH,COUNT;CH数组长度MOVBX,0;BX为基址指针,初值清0MOVDX,0;DH数字个数,DL字母个数,初值清0例4.37 LOOP1:MOVAH,BUF[BX];AH取一个数CMPAH,30H;<30H?JLNEXT;①是,转CMPAH,39H;>39H?JGABC;是,转INCDH;②否,数字个数增1JMPNEXTABC:CMPAH,41H;<41H?JLNEXT;③是,非字母,转CMPAH,5AH;>5AH?JGNEXT;⑤是,非字母,转INCDL;④否,字母个数增1NEXT:INCBX;基地址指针加1DECCH;字符串长度减1JNZLOOP1;未完,取下一个数例4.37 MOVNUM,DH;已完,存数字个数MOVNUM+1,DL;存字母个数MOVAH,COUNTSUBAH,DHSUBAH,DL;计算出其它字符个数MOVNUM+2,AH;存其它字符个数MOVAX,4C00HINT21HCODEENDSENDSTART例4.37 4.3.1顺序结构程序设计4.3.2分支程序设计4.3.3循环结构程序4.3.4代码转换程序4.3.5过程调用 4.3.3循环结构程序要求某段程序反复执行多次,直到满足某些条件时为止,这种程序称为循环结构程序。在循环程序中,常用计数器(如CX寄存器)来控制循环次数。先将计数器置1个初值,用来表示循环操作的次数,每执行一次循环操作后,计数器1,减到0时,表示循环结束。 4.3.3循环结构程序例4.38在一串给定个数的数据中寻找最大值,存放到MAX存储单元中。DATASEGMENTBUFDW1234H,3200H,4832H,5600H;一串字数据COUNTEQU($-BUF)/2;数据个数(循环次数)MAXDW?;存最大值DATAENDS;STACKSEGMENT‘STACK’STAPNDB100DUP(?)TOPEQULENGTHSTAPNSTACKENDS 4.3.3循环结构程序CODESEGMENTMAINPROCFARASSUMECS:CODE,SS:STACKSTART:MOVAX,STACKMOVSS,AXMOVSP,TOPPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVCX,COUNT;CX字符个数LEABX,BUF;BXBUF的偏移地址MOVAX,[BX];AX缓冲器中取一个数例4.38 4.3.3循环结构程序INCBX;修改地址指针INCBXDECCX;循环次数减1AGAIN:CMPAX,[BX];AX与后取的数比较JGENEXT;如AX中数大于等于后者,则转MOVAX,[BX];如后取的数大,则将其送AXNEXT:LOOPAGAIN;没处理完,转(循环操作)RET;返回DOSMAINENDP;处理完,结束CODEENDSENDMAIN本例通过LOOP指令执行循环操作,取字符串的地址指针BX要用指令修正,以指向下个字单元取数进行比较。例4.38 4.3.3循环结构程序例4.39用循环程序设计方法,求A和B两个4字节BCD数之和,它们在内存中以压缩BCD码的形式存放,低字节在前,高字节在后。要求结果以同样形式存放在以SUM开始的单元中。在例4.35中,进行2字节无符号运算时,采用顺序结构程序,用了两段加法程序。本例做4字节的加法运算,用循环结构编程,只要写一段加法程序,反复执行4次即可。 4.3.3循环结构程序DATASEGMENTADB44H,33H,22H,11H;数A,BCD数加后缀HBDB88H,77H,66H,55H;数B,同上SUMDB5DUP(?);存和(含进位)DATAENDSSTACKSEGMENT‘STACK’STAPNDB100DUP(?)TOPEQULENGTHSTAPNSTACKENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK;使用串操作指令要设附加段例4.39 4.3.3循环结构程序START:MOVAX,STACK;设置堆栈段MOVSS,AXMOVSP,TOPPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AX;设置数据段MOVES,AX;设附加段,与数据段相同MOVSI,OFFSETA;SI数A偏移地址MOVBX,OFFSETB;BX数B偏移地址MOVDI,OFFSETSUM;DI和单元地址MOVCX,LENGTHSUM;CX和的长度(含进位位)为5例4.39 4.3.3循环结构程序DECCX;循环次数为4,只要做4次加法CLD;串操作清方向标志,地址增量CLC;进位位清0MOVAH,0;AH存最后一次进位,初值置0GET_SUM:LODSA;AL从A中取1数,SI自动+1ADCAL,[BX];与B数相加,结果送ALDAA;BCD数调整INCBX;B数指针+1STOSSUM;SUM单元结果,DI自动+1LOOPGET_SUM;CXCX-1,CX≠0转循环做加法ADCAH,0;4次后CX=0,将进位加到AH中MOVAL,AHSTOSB;进位存入SUM+4单元例4.39 4.3.3循环结构程序RET;返回DOSMAINENDPCODEENDSENDMAIN本例也是利用LOOP指令执行循环加法操作;利用LODSA指令取A数时,源地址指针SI自动修改;利用STOS指令存数时,目的地址指针DI自动修改;但取B数时,地址指针BX必须用指令修改。例4.39 4.3.3循环结构程序例4.40有一个无符号数组共含5个元素:12,7,19,8,24,它们存放在LIST开始的字单元中,编程将数组中的数按从大到小的次序排列(元素个数n=5)。编程思路:编程时采用冒泡法排序。比较从第1个元素开始,与相邻数比较,若大的在前小的在后,次序就排好了,不要交换,否则交换。然后将小的数与第3个元素比较,经n-1(=4)次比较后,一行中最小的元素7排到了最后面。共循环比较了n-1(=4)次。再作第二轮比较,这轮只要比较n-2(=3)次,即可将数组中的数按从大到小的次序排列好。这是一个多重循环程序。程序稍加修改后,即可实现从小到大的排序。 4.3.3循环结构程序比较过程中数组中数的排列:原始数据12719824第一轮比较后12198247找出最小值7第二轮比较后19122487找出第二小的值8第三轮比较后19241287找出第三小的值12第四轮比较后24191287已排好次序,大循环次数为n-1(=4)例4.40 4.3.3循环结构程序DATASEGMENTLISTDW12,7,19,8,24;数组字单元COUNTEQU($-LIST)/2;数组长度n=10/2=5DATAENDS;SORTSEGMENTASSUMECS:SORT,DS:DATABEGIN:MOVAX,DATAMOVDS,AXMOVCX,COUNT-1;CX比较轮数(大循环次数)LOOP1:MOVDX,CX;DX大循环次数MOVBX,0;地址指针例4.40 4.3.3循环结构程序LOOP2:MOVAX,LIST[BX];AXLIST(i)CMPAX,LIST[BX+2];LIST(i)≥LIST(i+2)?JAENO_CHANGE;是,转XCHGAX,LIST[BX+2];否,交换,使大数在前MOVLIST[BX],AXNO_CHANGE:ADDBX,2;BX增2,取下个数LOOPLOOP2;一轮没比完,转,继续比MOVCX,DX;一轮比完,CX比较轮数LOOPLOOP1;CXCX-1,非0则转下轮比较MOVAX,4C00H;比完,返回DOSINT21HSORTENDSENDBEGIN例4.40 4.3.1顺序结构程序设计4.3.2分支程序设计4.3.3循环结构程序4.3.4代码转换程序4.3.5过程调用 4.3.4代码转换程序在计算机中,经常需要将数据从一种形式转换成另一种形式。例如,把2进制数转换成10进制数,再转换成ASCII码显示出来;把键盘输入的10进制数转换成2进制数,再转换成16进制数等。这就要编写各种代码转换程序。下面介绍几个代码转换程序,为方便起见,程序都以子程序的形式给出。 4.3.4代码转换程序例4.41将AL寄存器中的二进制数转换成非压缩BCD数,存入AX中,再转换成ASCII码后在CRT上显示。设AL中的初值为01100010B=62H,它等于10进制数的98。将它除以10后,可得商为9,余数为8,将其存放入AX中,使AX=0908H,与3030H相加(也可相或),即转换成ASCII码3938H,用2号DOS功能调用即可显示出来。 4.3.4代码转换程序BIN_ASCPROCNEARMOVAH,0MOVBL,10;除数DIVBL;AL商(9),AH余数(8)XCHGAH,AL;AX=0908H(非压缩BCD数)ADDAX,3030H;AX=3938H(ASCII码)MOVCX,AX;CX3938HMOVDL,CHMOVAH,2INT21H;显示9MOVDL,CLMOVAH,2INT21H;显示8RETBIN_ASCENDP例4.41 4.3.4代码转换程序例4.42将键盘输入的一个以回车符为结尾的10进制数(0~65535)转换成2进制数,并存入BX中,如输入一个非10进制数或回车符,则退出程序。编程思想:1)利用DOS1号功能调用,等待从键盘输入一个10进制数字,比如3,则在AL中得到3的ASCII码33H。2)将ASCII码转换成BCD码。截下低4位,判断其是否为数字0~9,若是,则将该数存入BX中,若不是则退出程序。3)再键入下一个数字,如数字5,也要判断其是否为数字0~9。 4.3.4代码转换程序4)将10进制数转换成2进制数。将先键入的数字3乘以10后,与后键入的数5相加(累加),得(310)+5=35。5)再键入第3个数字,如8,将前面累加的数乘以10后与后键入的数累加,可得到[(310+5)10]+8=358,还可继续进行下去,直至键入一个非10进制数或回车符为止。遇回车符表示键入的一个10进制数结束。例4.42 4.3.4代码转换程序程序(子程序形式)如下:DEC_BINPROCNEARMOVBX,0;BX存结果或中间结果,初值清0GET_CHAR:MOVAH,1;DOS1号功能调用INT21H;AL键入数字ASCII码CMPAL,0DH;是回车符JEEXIT;是,转SUBAL,30H;ASCII码转换成10进制数JLEXIT;<0(非数字),则退出CMPAL,9;>0,则与9比较JGEXIT;>9,退出例4.42 4.3.4代码转换程序CBW;是数字0~9,将AL中的字节转换成字,送到AXXCHGAX,BX;将先键入的数(在BX中)AXMOVCX,10MULCX;先键入数10AXXCHGAX,BX;交换后,AXBX,新键入数AXADDBX,AX;累加,结果BXJMPGET_CHAR;循环,键入新数EXIT:RETDEC_BINENDP程序中也用到了分支结构和循环程序的设计方法。例4.42 4.3.4代码转换程序例4.43编写将BX中的二进制数转换成16进制数,并在显示器上显示的子程序。由于每4位二进制数可用一个16进制数表示,所以BX中的二进制数可以转换成4个16进制数字。每次将BX中的数左移4次,可得到一个16进制数,将其转换成ASCII码后,即可在显示器上显示出一个16进制数。重复执行4次,就可将BX中的4个16进制数在显示器上显示出来上。 4.3.4代码转换程序操作过程如图4.11所示图4.112进制数转换成16进制数的ASCII码例4.43 4.3.4代码转换程序;程序入口已为BX存入了一个二进制数。BIN_HEXPROCNEARMOVCH,4;转换后产生4个16进制数字(大循环次数)ROTATE:MOVCL,4;小循环次数(左移4次)ROLBX,CL;对BX左移4次MOVAL,BL;ALBLANDAL,0FH;截得一个16进制数字ADDAL,30H;加30H,转换成ASCII码CMPAL,3AH;与‘9+1’比,>9?JLDISPLAY;≤9,转显示ADDAL,7H;>9,将数字0AH~0FH;转换成ASCII码例4.43 4.3.4代码转换程序DISPLAY:MOVDL,AL;DL待显数字ASCII码MOVAH,2INT21H;显示DL中数字DECCH;4个数字都显示完?JNZROTATE;没有,转大循环RET;显示完,退出BIN_HEXENDP例4.43 4.3.4代码转换程序例4.44将AX中的16位二进数转换成4位压缩BCD数方法很简单,只要将AX中的内容先后除以1000、100和10,每次得到的商即为BCD数的千位、百位和十位数,余数为个位数。麻烦的是除法运算既要分字除和字节除,又要搞清楚每次运算时被除数、除数、商和余数分别放在什么寄存器中。除法指令要求:源操作数为字时,(DX,AX)/源字,结果:AX商,DX余数字节除时,AX/源字节,结果:AL商,AH余数 4.3.4代码转换程序下面给出转换程序,为便于理解,假设存放在AX中的16位二进制数的实际值为9346,转换后应使AX=9346H(压缩BCD数),注释中给出具体的转换步骤。BIN_BCDPROCNEARCMPAX,9999;AX>9999?JBETRAN;小于,转JMPEXIT;大于,转退出TRAN:SUBDX,DX;DX初值清0MOVCX,1000;CX1000DIVCX;(DX,AX)/1000=9…346;(AX=9,DX=346)XCHGAX,DX;交换,使DX=9,AX=346;(下次除法被除数)例4.44 4.3.4代码转换程序MOVCL,4;第一个商9左移4次SHLDX,CL;DX=0090HMOVCL,100;CL100DIVCL;346/100=3…46,AL=3,AH=46ADDDL,AL;将第2次的商加到DL中,;使DX=0093HMOVCL,4;DX左移4次SHLDX,CL;左移后DX=0930HXCHGAL,AH;交换,AX=0346HSUBAH,AH;AX=0046H,;第2次余数做被除数MOVCL,10;CL10DIVCL;AX/10=4…6,结果AL=4,AH=6例4.44 4.3.4代码转换程序ADDDL,AL;4加到DL上,;使DX=0934HMOVCL,4SHLDX,CL;DX左移4次,DX=9340HADDDL,AH;最后一次余数加到;DX上,DX=9346HMOVAX,DX;最后结果:AX=9346HEXIT:RETBIN_BCDENDP例4.44 4.3.1顺序结构程序设计4.3.2分支程序设计4.3.3循环结构程序4.3.4代码转换程序4.3.5过程调用 4.3.5过程调用汇编语言程序中把某些能完成特定功能而又经常要用到的程序段,编写成独立的模块,将它称为过程或子程序。需要执行这段程序时就进行过程调用,执行完毕,再返回到原来调用它的主程序去。采用过程调用结构编程,使程序结构清晰,语句简练不用重复编写某个程序段,也便于修改。子程序本身又可调用其它子程序,称为子程序嵌套。 4.3.5过程调用例4.45用过程调用方法,编程实现将内存中4个BCD数相加,结果存入SUM开始的单元中去的运算。BCD数在内存中存放时,低字节在前,高字节在后。由于每个BCD数各有4个字节,每两个字节相加的运算要重复4次。所以,这种运算可编写成子程序,供主程序调用。 4.3.5过程调用DATASEGMENTNUM_1DB44H,33H,22H,11H;第一个BCD数NUM_2DB88H,77H,66H,55H;第二个BCD数SUMDB5DUP(?);存相加结果DATAENDS;STACKSEGMENTSTACK;堆栈段DW50DUP(?)TOPLABELWORDSTACKENDS;CODESEGMENT;代码段MAINPROCFAR;主过程ASSUMECS:CODE,DS:DATA,SS:STACK例4.45 4.3.5过程调用START:MOVAX,STACK;设置SS:SPMOVSS,AXMOVSP,OFFSETTOPPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AXLEASI,NUM_1;SI数1偏移地址LEABX,NUM_2;BX数2偏移地址LEADI,SUM;DI和数偏移地址CLD;清方向标志CLC;清进位标志例4.45 4.3.5过程调用MOVAH,0;AH存最后一次进位,初值清0MOVCX,4;做4次加法运算LOOP1:CALLADD_B;调用过程(4次)LOOPLOOP1;没完,继续ADCAH,0;已完,进位加到AH中MOVAL,AHSTOSB;进位存入SUM+4单元RET;返回DOSMAINENDP;主过程结束;子程序ADD_B(见下页)例4.45 4.3.5过程调用;子程序ADD_BADD_BPROCNEAR;单字节加法子程序LODSB;AL数1中取一字节,SI自动增1ADCAL,[BX];与数2带进位加DAA;BCD数调整STOSB;存入SUM开始的单元中,;DI自动增1INCBX;调整数2的地址指针RET;返回主程序ADD_BENDPCODEENDSENDMAIN例4.45 例4.46内存中有两个数组ARY1和ARY2,数组长度为20和10,要求编写一个程序,分别累加两个数组的值,存入SUM1和SUM2开始的单元中,低字节在前,高字节在后。累加第1个数组值时,要做20次加法,加法可用子过程实现;累加第2个数组时,要做10次加法,加法也可调相同的子过程来完成,但两次调用前的入口参数和存放结果的单元不同。;数据段DATASEGMENT;数据段ARY1DB20DUP(?);数组1,20个随机数SUM1DB2DUP(?);存数组1各数相加之和ARY2DB10DUP(?);数组2,10个随机数SUM2DB2DUP(?);存数组2相加之和DATAENDS ;堆栈段STACKSEGMENTSTACKDW50DUP(?)TOPLABELWORDSTACKENDS;CODESEGMENT;代码段MAINPROCFAR;主程序ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPPUSHDSSUBAX,AXPUSHAX例4.46 MOVAX,DATAMOVDS,AXLEASI,ARY1;转子前入口参数,;SIARY1首地址MOVCX,LENGTHARY1;CXARY1长度MOVBX,OFFSETSUM1;BX和单元首址CALLSUM;转子过程,求数组1之和LEASI,ARY2;转子前设ARY2之入口参数MOVCX,LENGTHARY2MOVBX,OFFSETSUM2CALLSUM;转子过程,求数组2之和RET;返回DOSMAINENDP;主程序结束;;子程序SUM(见下页);例4.46 SUMPROCNEAR;求和子过程SUMXORAL,AL;AX清0,CF标志清0MOVAH,0;AH存进位,初值清0LOOP1:ADCAL,[SI];数组中取一元素,;带进位累加到ALADCAH,0;进位累加到AH中INCSI;修改地址指针LOOPLOOP1;未完,继续MOV[BX],AL;已处理完,存和数MOV[BX+1],AH;存进位累加值RETSUMENDP;SUM子过程结束;CODEENDSENDMAIN;整个程序结束例4.46 4.3.5过程调用例4.47编写显示回车换行子程序。CRLFPROCNEARMOVDL,0DH;回车符MOVAL,2INT21HMOVDL,0AH;换行符MOVAH,2INT21HRETCRLFENDP 4.3.5过程调用例4.48编写从键盘输入8个10进制数,将它转换成16进制数后在屏幕上显示的程序。首先从键盘输入一个10进制数(0~65536),该数以回车符结束,然后将它转换成16进制数的ASCII码,在显示器上显示出来。重复8次,即可在屏幕上显示8个16进制数。编程时,只要编写一个主程序,再调前面介绍的相关程序,包括:例4.42DEC_BIN程序:将键入10进制数转换成ASCII码,再转换成二进制数,结果存入BX中。例4.43BIN_HEX程序:将BX中的二进制数转换成16进制数,再转换成ASCII码,显示出来。例4.47CRLF显示回车换行子程序。 4.3.5过程调用DEC_HEXSEGMENT;10进制转换成16进制数程序ASSUMECS:DEC_HEXMAINPROCFAR;主程序┆MOVCX,8;调用8次子程序PUSHCX;CX入栈保护REPT:CALLDEC_BIN;10进制二进制,结果在BX中CALLBIN_HEX;二进制16进制及其ASCII码并显示CALLCRLF;显示16进制数后回车、换行POPCX;堆栈中弹出CX,初值为,逐次减1DECCX;CXCX-1PUSHCX;减1后的CX入栈CMPCX,0;CX=0?JNEREPT;非0则转RET;是0则退出MAINENDP;主程序结束例4.48 ;10进制数转换成二进制数,结果存BXDEC_BINPROCNEAR;┆RETDEC_BINENDP;将BX中的二进制数转换成16进制数并显示BIN_HEXPROCNEAR┆RETBIN_HEXENDP;回车换行子程序CRLFPROCNEAR┆RETCRLFENDP;代码段结束DEC_HEXENDPENDMAIN例4.48'