Files
Operating-System/Experiment/asm-exp/实验七/实验七-加强-1_字符串排序.asm
2026-06-25 00:09:09 +08:00

127 lines
2.6 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; 实验七-加强-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