第讲第5章-控制转移和程序结构PPT推荐.ppt
《第讲第5章-控制转移和程序结构PPT推荐.ppt》由会员分享,可在线阅读,更多相关《第讲第5章-控制转移和程序结构PPT推荐.ppt(34页珍藏版)》请在冰豆网上搜索。
movzxedx,arrayebx*(typearray)addeax,edx;
求和求和incebxloopagainmovsum,eax;
保存结果保存结果循环初始循环初始循环体循环体循环控制循环控制计数控制计数控制例题例题5-11数组求和程序数组求和程序-2movecx,lengthofarrayxoreax,eax;
求和初值为求和初值为0jecxzdone;
数组元素为数组元素为0个个,不求和,不求和movebx,eax;
求和求和incebxloopagaindone:
movsum,eax;
保存结果保存结果计数控制计数控制0A号号DOS功能调用功能调用字符串输入字符串输入功能编号功能编号AH0AH入口参数入口参数DSDX键盘输入缓冲区逻辑地址键盘输入缓冲区逻辑地址(段地址(段地址偏移地址)偏移地址)功能说明功能说明读取从键盘输入的一个字符串(读取从键盘输入的一个字符串(有回显有回显),直到),直到按下回车键。
按下回车键。
键盘输入缓冲区的键盘输入缓冲区的第第1个字节个字节是缓冲区字节大小是缓冲区字节大小(最大为(最大为255),),第第2个字节个字节在调用结束时被功能在调用结束时被功能调用填进输入的字符个数,调用填进输入的字符个数,第第3个字节开始个字节开始存放输存放输入字符的入字符的ASCII码,码,最后最后是回车字符(是回车字符(0DH)。
)。
例题例题5-12输入字符串大小写转换程序输入字符串大小写转换程序-1;
数据段数据段keynum=255keybufdbkeynum;
键盘输入缓冲区键盘输入缓冲区db0dbkeynumdup(0);
代码段代码段movdx,offsetkeybuf;
设置入口参数设置入口参数DXmovah,0ahint21h;
用户用回车键结束用户用回车键结束movdl,0ah;
回车后再进行换行回车后再进行换行movah,2int21h输入输入“Hi”,回车,缓冲区:
,回车,缓冲区:
FF0248690D00例题例题5-12输入字符串大小写转换程序输入字符串大小写转换程序-2movbx,offsetkeybuf+1;
输入字符个数输入字符个数movcl,bx;
作为循环的次数作为循环的次数movch,0again:
incbx;
BX指向输入字符指向输入字符movdl,bx;
取出一个字符取出一个字符cmpdl,a;
小于小写字母小于小写字母“a”jbdispcmpdl,z;
大于小写字母大于小写字母“z”jadisp;
直接去显示直接去显示subdl,20h;
小写字母转换为大写字母小写字母转换为大写字母disp:
movah,2;
显示一个字符显示一个字符int21hloopagain;
循环循环计数控制计数控制例题例题5-13记录字符串特定字符个数程序记录字符串特定字符个数程序movesi,offsetstringxorebx,ebx;
EBX用于记录空格数用于记录空格数again:
moval,esicmpal,0;
判断字符串是否结束判断字符串是否结束jzdonecmpal,20h;
空格的空格的ASCII码是码是20Hjnenext;
不相等、不是空格,转移不相等、不是空格,转移incbx;
相等、是空格,个数加相等、是空格,个数加1next:
incesijmpagain;
继续循环继续循环done:
movspace,ebx;
保存结果保存结果条件控制条件控制p例例1.统计字节数据块:
统计字节数据块:
-1-1,-3-3,55,66,99,中中负元素负元素的个数的个数数据段定义如下:
数据段定义如下:
DATASEGMENTBUFDB-1,-3,5,6,9,;
定义若干字节带符号数定义若干字节带符号数CUNTEQU$BUF;
计算数据块长度计算数据块长度RESULTDW?
;
定义存放结果单元定义存放结果单元DATAENDS;
代码段程序:
MOVBX,OFFSETBUF;
建立数据指针建立数据指针MOVCX,CUNT;
设置循环次数设置循环次数MOVDX,0;
置结果初值置结果初值LP1:
MOVAL,BX;
取数据取数据ANDAL,AL;
设置标志位设置标志位JNSPLUS;
是正数,转去是正数,转去PLUSINCDX;
是负数,负数个数是负数,负数个数1PLUS:
INCBX;
调整数据指针调整数据指针LOOPLP1;
(CX1)0,继续循环,继续循环MOVRESULT,DX;
存入负数个数存入负数个数计数控制计数控制参数初始化参数初始化循环控制循环控制参数修改参数修改p例例2.设:
设:
AX寄存器中有一个寄存器中有一个16位的二进制数位的二进制数要求:
编程统计要求:
编程统计AX中中1(bit)的个数并存入的个数并存入CX;
方法方法1:
当当AX内容为全内容为全0,不必再继续统计,不必再继续统计MOVCX,0;
置置结果计数器结果计数器初值初值LP:
ANDAX,AX;
AX=0否否?
JZEXIT;
是,退出循环是,退出循环SALAX,1;
否,否,AX的最高位移至的最高位移至CF中中JNCZERO;
CF0,转,转ZERO继续循环继续循环INCCX;
CF1,结果计数器加,结果计数器加1ZEO:
JMPLPEXIT:
条件控制条件控制循环次数未知循环次数未知先判断,后执行先判断,后执行;
方法方法2:
每位:
每位和和1“与与”,不等为,不等为0,否则为,否则为1MOVCX,16;
AX中二进制数的位数中二进制数的位数MOVDX,0001HAA:
TESTAX,DXJZLOP;
该位为该位为0,则跳转则跳转INCBXLOP:
SHRAX,1LOOPAAMOVCX,BX状态控制状态控制多重循环多重循环程序设计程序设计p注意注意n循环可以嵌套循环可以嵌套(多重循环多重循环)p多个循环体之间不能交叉多个循环体之间不能交叉p控制条件不能混淆控制条件不能混淆n内循环内循环外循环:
可以外循环:
可以n外外循环循环内内循环:
不可以循环:
不可以n千万不能:
千万不能:
循环回到初始化部分循环回到初始化部分p否则会出现死循环否则会出现死循环p例:
软件延时程序例:
软件延时程序SOFTDLYPROC;
指令执行时间指令执行时间MOVBL,10;
4TDELAY:
MOVCX,2801;
内循环延时内循环延时10ms4TWAIT:
LOOPWAIT;
17TOR5TDECBL;
3TJNZDELAY;
16TOR4TRET;
20TSOFTDLYENDPt=410(4(28011712)316)1220TTT:
CPUCPU的时钟周期,设的时钟周期,设TT210S210S例例.冒泡排序算法冒泡排序算法程序程序
(1)p数组排序问题通常采用数组排序问题通常采用冒泡排序算法冒泡排序算法p例例.n设:
有一个字数组,设:
有一个字数组,p首地址:
首地址:
ARRAYp长度:
长度:
COUNTn要求:
编程按照从大到小的次序排列数组中的数要求:
编程按照从大到小的次序排列数组中的数冒泡排序算法的程序框图冒泡排序算法的程序框图COUNT1COUNT1:
外循环次数外循环次数COUNT2COUNT2:
内循环次数内循环次数ii:
数组下标数组下标若初始数据是反序的若初始数据是反序的
(1)需要进行)需要进行n-1趟排序;
趟排序;
(2)每趟排序要进行)每趟排序要进行n-i次次比较比较(1in-1);
(3)在这种情况下,比较)在这种情况下,比较达到最大值:
达到最大值:
(n-1)/2。
程序清单如下:
DSEGSEGMENTDSEGSEGMENTARRAYARRAYDDWWd1d1,d2d2,d3d3,dndnCOUNTCOUNTCOUNTCOUNTEQUEQUEQUEQU($($($($ARRAY)/2ARRAY)/2ARRAY)/2ARRAY)/2;
数据个数数据个数数据个数数据个数DSEGENDSDSEGENDSCSEGSEGMENTCSEGSEGMENTASSUMECS:
CSEG,DS:
DSEGASSUMECS:
DSEGSTART:
START:
MOVAX,DSEGMOVAX,DSEGMOVDS,AXMOVDS,AXMOVCX,COUNTCOUNT;
内循环变量存于内循环变量存于CX中,中,DECCX;
初值为初值为N-1LOP1:
MOVDI,CX;
外循环变量存外循环变量存DI中中,初值为初值为N-1MOVBX,0;
地址指针预置为地址指针预置为0LOP2:
MOVAX,ARRAYBX;
取相邻两数比较取相邻两数比较CMPAX,ARRAYBX+2JGECTIN;
若符合排列次序若符合排列次序,转移转移XCHGAX,ARRAYBX+2;
若不符合排列次序若不符合排列次序,二数交换二数交换MOVARRAYBX,AX;
存大数存大数CTIN:
ADDBX,22;
修改地址指针修改地址指针LOOPLOP2;
若一遍未比较完若一遍未比较完,继续继续MO