127 lines
2.6 KiB
NASM
127 lines
2.6 KiB
NASM
; 实验七-加强-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 |