多重循环程序设计

例题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

 

你可能感兴趣的:(程序设计)