1、movzx edx,arrayebx*(type array)add eax,edx;求和求和 inc ebxloop againmov sum,eax;保存结果保存结果循环初始循环初始循环体循环体循环控制循环控制计数控制计数控制例题例题5-11数组求和程序数组求和程序-2mov ecx,lengthof arrayxor eax,eax;求和初值为求和初值为0jecxz done;数组元素为数组元素为0个个,不求和,不求和mov ebx,eax;求和求和 inc ebxloop againdone:mov sum,eax;保存结果保存结果计数控制计数控制0A号号DOS功能调用功能调用字符串输
2、入字符串输入功能编号功能编号AH0AH入口参数入口参数DS DX键盘输入缓冲区逻辑地址键盘输入缓冲区逻辑地址(段地址(段地址 偏移地址)偏移地址)功能说明功能说明读取从键盘输入的一个字符串(读取从键盘输入的一个字符串(有回显有回显),直到),直到按下回车键。按下回车键。键盘输入缓冲区的键盘输入缓冲区的第第1个字节个字节是缓冲区字节大小是缓冲区字节大小(最大为(最大为255),),第第2个字节个字节在调用结束时被功能在调用结束时被功能调用填进输入的字符个数,调用填进输入的字符个数,第第3个字节开始个字节开始存放输存放输入字符的入字符的ASCII码,码,最后最后是回车字符(是回车字符(0DH)。)
3、。例题例题5-12输入字符串大小写转换程序输入字符串大小写转换程序-1;数据段数据段keynum=255keybufdb keynum;键盘输入缓冲区键盘输入缓冲区db 0db keynum dup(0);代码段代码段mov dx,offset keybuf;设置入口参数设置入口参数DXmov ah,0ahint 21h;用户用回车键结束用户用回车键结束mov dl,0ah;回车后再进行换行回车后再进行换行mov ah,2int 21h输入输入“Hi”,回车,缓冲区:,回车,缓冲区:FF 02 48 69 0D 00 例题例题5-12输入字符串大小写转换程序输入字符串大小写转换程序-2mov
4、bx,offset keybuf+1;输入字符个数输入字符个数mov cl,bx;作为循环的次数作为循环的次数mov ch,0again:inc bx;BX指向输入字符指向输入字符mov dl,bx;取出一个字符取出一个字符cmp dl,a;小于小写字母小于小写字母“a”jb dispcmp dl,z;大于小写字母大于小写字母“z”ja disp;直接去显示直接去显示sub dl,20h;小写字母转换为大写字母小写字母转换为大写字母disp:mov ah,2;显示一个字符显示一个字符int 21hloop again;循环循环计数控制计数控制例题例题5-13记录字符串特定字符个数程序记录字符串
5、特定字符个数程序mov esi,offset stringxor ebx,ebx;EBX用于记录空格数用于记录空格数again:mov al,esicmp al,0;判断字符串是否结束判断字符串是否结束jz done cmp al,20h;空格的空格的ASCII码是码是20Hjne next;不相等、不是空格,转移不相等、不是空格,转移inc bx;相等、是空格,个数加相等、是空格,个数加1next:inc esijmp again;继续循环继续循环done:mov space,ebx;保存结果保存结果条件控制条件控制p例例1.统计字节数据块:统计字节数据块:-1-1,-3-3,5 5,6 6
6、,9 9,中中负元素负元素的个数的个数数据段定义如下:数据段定义如下:DATA SEGMENTBUFDB-1,-3,5,6,9,;定义若干字节带符号数定义若干字节带符号数CUNTEQU$BUF;计算数据块长度计算数据块长度RESULTDW?;定义存放结果单元定义存放结果单元DATA ENDS;代码段程序:MOV BX,OFFSET BUF;建立数据指针建立数据指针MOV CX,CUNT;设置循环次数设置循环次数MOV DX,0;置结果初值置结果初值LP1:MOV AL,BX;取数据取数据ANDAL,AL;设置标志位设置标志位JNSPLUS;是正数,转去是正数,转去PLUSINCDX;是负数,负
7、数个数是负数,负数个数1PLUS:INCBX;调整数据指针调整数据指针LOOPLP1;(CX1)0,继续循环,继续循环MOV RESULT,DX;存入负数个数存入负数个数计数控制计数控制参数初始化参数初始化循环控制循环控制参数修改参数修改p例例2.设:设:AX寄存器中有一个寄存器中有一个16位的二进制数位的二进制数要求:编程统计要求:编程统计AX中中1(bit)的个数并存入的个数并存入CX;方法方法1:当当AX内容为全内容为全0,不必再继续统计,不必再继续统计MOV CX,0;置置结果计数器结果计数器初值初值LP:ANDAX,AX;AX=0否否?JZEXIT;是,退出循环是,退出循环SALAX
8、,1;否,否,AX的最高位移至的最高位移至CF中中JNCZERO;CF0,转,转ZERO继续循环继续循环INCCX;CF1,结果计数器加,结果计数器加1ZEO:JMPLPEXIT:条件控制条件控制循环次数未知循环次数未知先判断,后执行先判断,后执行;方法方法2:每位:每位和和1“与与”,不等为,不等为0,否则为,否则为1MOV CX,16 ;AX中二进制数的位数中二进制数的位数MOV DX,0001HAA:TEST AX,DXJZLOP ;该位为该位为0,则跳转则跳转INCBX LOP:SHRAX,1LOOPAAMOV CX,BX状态控制状态控制多重循环多重循环程序设计程序设计p注意注意n循环
9、可以嵌套循环可以嵌套(多重循环多重循环)p多个循环体之间不能交叉多个循环体之间不能交叉p控制条件不能混淆控制条件不能混淆n内循环内循环外循环:可以外循环:可以n外外循环循环内内循环:不可以循环:不可以n千万不能:千万不能:循环回到初始化部分循环回到初始化部分p否则会出现死循环否则会出现死循环p例:软件延时程序例:软件延时程序SOFTDLYPROC;指令执行时间指令执行时间MOVBL,10;4TDELAY:MOVCX,2801;内循环延时内循环延时10ms 4TWAIT:LOOP WAIT;17T OR 5TDECBL;3TJNZDELAY;16T OR 4TRET;20TSOFTDLYENDP
10、t=410(4(28011712)316)1220TT T:CPUCPU的时钟周期,设的时钟周期,设T T210S210S例例.冒泡排序算法冒泡排序算法程序程序(1)p数组排序问题通常采用数组排序问题通常采用冒泡排序算法冒泡排序算法p例例.n设:有一个字数组,设:有一个字数组,p首地址:首地址:ARRAY p长度:长度:COUNT n要求:编程按照从大到小的次序排列数组中的数要求:编程按照从大到小的次序排列数组中的数冒泡排序算法的程序框图冒泡排序算法的程序框图 COUNT1COUNT1:外循环次数外循环次数COUNT2COUNT2:内循环次数内循环次数i i:数组下标数组下标若初始数据是反序的
11、若初始数据是反序的(1)需要进行)需要进行n-1趟排序;趟排序;(2)每趟排序要进行)每趟排序要进行n-i次次比较比较(1in-1);(3)在这种情况下,比较)在这种情况下,比较达到最大值:达到最大值:(n-1)/2。程序清单如下:DSEG SEGMENT DSEG SEGMENT ARRAY ARRAY D DW W d1 d1,d2d2,d3d3,dndn COUNT COUNT COUNT COUNTEQUEQUEQUEQU($($($($ARRAY)/2ARRAY)/2ARRAY)/2ARRAY)/2;数据个数数据个数数据个数数据个数 DSEG ENDS DSEG ENDS CSEG
12、SEGMENT CSEG SEGMENTASSUME CS:CSEG,DS:DSEGASSUME CS:DSEG START:START:MOV AX,DSEG MOV AX,DSEG MOV DS,AX MOV DS,AX MOVCX,COUNTCOUNT;内循环变量存于内循环变量存于CX中,中,DECCX;初值为初值为N-1LOP1:MOVDI,CX;外循环变量存外循环变量存DI中中,初值为初值为N-1MOVBX,0 ;地址指针预置为地址指针预置为 0LOP2:MOVAX,ARRAYBX;取相邻两数比较取相邻两数比较CMPAX,ARRAYBX+2JGECTIN;若符合排列次序若符合排列次序,转移转移XCHG AX,ARRAYBX+2;若不符合排列次序若不符合排列次序,二数交换二数交换MOVARRAYBX,AX ;存大数存大数CTIN:ADD BX,2 2;修改地址指针修改地址指针LOOP LOP2 ;若一遍未比较完若一遍未比较完,继续继续MO
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1