多重循环程序设计

例题1:给十个单字节无符号数排序:

 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
View Code

二重法排序,其中SI相当于控制外层循环变量I,DI相当于内层循环变量J,为了使I从1开始递增,排序数组开始地址先减一,之后再存入BX寄存器

例题2:给字符数据排序

;设字符串1在数据段1中,字符串2在数据段2中,写一个程序
;判别字符串2是否是字符串1的子字符串,如果是子字符串,则把字符串2中的flag单元置为0
;否则将其置为0,设字符串以0结尾

 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
View Code
原文地址:https://www.cnblogs.com/fengdashen/p/3705097.html