多重循环程序设计
例题1:给十个单字节无符号数排序:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 ;功能名称,说明二重循环的实现 2 DSEG SEGMENT 3 BUFFER DB 23,12,45,32,127,3,9,58,81,72 4 N EQU 10 5 DSEG ENDS 6 ; 7 CSEG SEGMENT 8 ASSUME CS:CSEG,DS:DSEG 9 START: MOV AX,DSEG 10 MOV DS,AX 11 MOV BX ,OFFSET BUFFER -1 12 MOV SI, 1 13 FORI:MOV DI,SI 14 INC DI 15 FORj:MOV AL,[BX+SI] 16 CMP AL,[BX+DI] 17 JBE NEXTJ 18 XCHG AL,[BX+DI] 19 MOV [BX+SI],AL 20 NEXTJ:INC DI 21 CMP DI,N 22 JBE FORJ 23 NEXTI:INC SI 24 CMP SI,N-1 25 JBE FORI 26 ; 27 MOV AH,4CH 28 INT 21H 29 CSEG ENDS 30 END START
二重法排序,其中SI相当于控制外层循环变量I,DI相当于内层循环变量J,为了使I从1开始递增,排序数组开始地址先减一,之后再存入BX寄存器
例题2:给字符数据排序
;设字符串1在数据段1中,字符串2在数据段2中,写一个程序
;判别字符串2是否是字符串1的子字符串,如果是子字符串,则把字符串2中的flag单元置为0
;否则将其置为0,设字符串以0结尾
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 ;设字符串1在数据段1中,字符串2在数据段2中,写一个程序 2 ;判别字符串2是否是字符串1的子字符串,如果是子字符串,则把字符串2中的flag单元置为0 3 ;否则将其置为0,设字符串以0结尾 4 5 ; 6 DSEG1 SEGMENT 7 STRM DB "THIS IS A STRING!",0;假设在数据段1中的字符串 8 DSEG1 ENDS 9 ; 10 DSEG2 SEGMENT 11 STRS DB "STRING",0;假设在数据段2中的字符串 12 FLAG DB ? 13 DSEG2 ENDS 14 ; 15 CODE SEGMENT 16 ASSUME CS:CODE,DS:DSEG1,ES:DSEG2 17 START: MOV AX,DSEG1 18 MOV DS,AX ;数据段1中的段值DS 19 MOV AX,DSEG2 20 MOV ES,AX ;数据段2中的段值ES 21 ; 22 MOV DI ,OFFSET STRS;检测字符串2的长度 23 MOV BX,DI ;保存字符串2的首地址 24 XOR CX,CX ;清空计数器 25 DEC DI 26 WHILE1: INC DI ;调整指针 27 INC CX ;计数器加1 28 CMP BYTE PTR ES:[DI],0;字符串2时候结束 29 JNZ WHILE1 ;没结束继续跳转到while1 30 DEC CX ;得到字符串2的长度 31 MOV DX,CX ;保存 32 ; 33 MOV SI,OFFSET STRM ;去字符串1的首地址 34 MOV BP,SI 35 FORI:MOV CX,DX;设置要比较的字符串个数 36 MOV DI,BX;设置首地址 37 FORJ:MOV AL,ES:[DI]; 38 CMP [SI],AL;比较一字节 39 JNZ NEXT1;不等,从字符串1的下一个字符开始 40 NEXTJ:INC DI 41 INC SI 42 LOOP FORJ;继续下一个字符的比较 43 MOV FLAG,1;设置子字符串标志 44 JMP OVER 45 NEXT1:CMP BYTE PTR [SI],0;判断字符串1是否结束 46 JZ NOTF;结束的话进行跳转 47 INC BP 48 MOV SI,BP 49 JMP FORI 50 NOTF:MOV FLAG,0 51 OVER:MOV AH,4CH 52 INT 21H 53 CODE ENDS 54 END START