例题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
二重法排序,其中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
时间: 2024-10-20 16:08:56