; 实验七-加强-1: 字符串排序程序 ; 功能: 对字符串数组按字典序排序(冒泡排序) DATAS SEGMENT STRING_COUNT EQU 5 ; 字符串数量 STRING_1 DB 'apple', 0 ; 第1个字符串 STRING_2 DB 'orange', 0 ; 第2个字符串 STRING_3 DB 'banana', 0 ; 第3个字符串 STRING_4 DB 'grape', 0 ; 第4个字符串 STRING_5 DB 'melon', 0 ; 第5个字符串 POINTERS DW STRING_1, STRING_2, STRING_3, STRING_4, STRING_5 DASH DB 0DH, 0AH, '-', 0DH, 0AH, '$' DATAS ENDS STACKS SEGMENT DB 64 DUP(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS, SS:STACKS START: MOV AX, DATAS MOV DS, AX MOV CX, STRING_COUNT - 1 ; 外循环次数 OUTER_LOOP: MOV DI, 0 ; DI指向第0个字符串 MOV DX, STRING_COUNT - 1 ; 内循环次数 = n - 1 - i SUB DX, CX MOV BX, 0 ; BX用于索引指针数组 INNER_LOOP: ; 获取两个字符串的指针 MOV SI, WORD PTR POINTERS[BX] ; 第一个字符串指针 MOV DI, WORD PTR POINTERS[BX+2] ; 第二个字符串指针 ; 比较两个字符串 CALL STRCMP ; 返回值:AX < 0 第一个较小,=0 相等,>0 第一个较大 ; 如果第一个字符串 > 第二个字符串,则交换 CMP AX, 0 JLE NO_SWAP ; 交换指针 MOV AX, WORD PTR POINTERS[BX] MOV BP, WORD PTR POINTERS[BX+2] MOV WORD PTR POINTERS[BX], BP MOV WORD PTR POINTERS[BX+2], AX NO_SWAP: ADD BX, 2 ; 移动到下一对指针 DEC DX JNZ INNER_LOOP DEC CX JNZ OUTER_LOOP ; 显示排序后的字符串 MOV CX, STRING_COUNT MOV SI, 0 DISPLAY_LOOP: MOV DI, WORD PTR POINTERS[SI] CALL DISP_STR LEA DX, DASH MOV AH, 09H INT 21H ADD SI, 2 DEC CX JNZ DISPLAY_LOOP ; 程序结束 MOV AH, 4CH INT 21H ; 字符串比较函数 ; 输入: SI=字符串1, DI=字符串2 ; 输出: AX = 比较结果 STRCMP PROC PUSH SI PUSH DI COMPARE_LOOP: MOV AL, [SI] MOV BL, [DI] CMP AL, BL JNE COMPARE_DONE CMP AL, 0 JE COMPARE_DONE INC SI INC DI JMP COMPARE_LOOP COMPARE_DONE: MOV AX, 0 MOV AL, [SI] MOV BL, [DI] SUB AX, BX ; AX = AL - BL POP DI POP SI RET STRCMP ENDP ; 显示字符串函数 ; 输入: DI=字符串地址 DISP_STR PROC PUSH AX PUSH DX MOV DX, DI MOV AH, 09H INT 21H POP DX POP AX RET DISP_STR ENDP CODES ENDS END START