一个完整的字符串比较子函数,专为EMU8086设计,实现了标准C库中strcmp()
函数的功能
字符串比较子函数
; 功能:比较两个以null结尾的字符串
; 输入:DS:SI = 字符串1的地址
; ES:DI = 字符串2的地址
; 输出:AX = 比较结果
; AX = 0 -> 字符串相等
; AX > 0 -> 字符串1 > 字符串2
; AX < 0 -> 字符串1 < 字符串2
; 使用寄存器:AX, BX, SI, DI
; 保留寄存器:CX, DX, BP, SP, DS, ES
; 测试字符串比较函数
ORG 100H
START:
; 设置数据段
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
; 测试字符串1
MOV SI, OFFSET STR1
MOV DI, OFFSET STR2
CALL STRING_COMPARE
; 此时AX包含比较结果
; 测试字符串2
MOV SI, OFFSET STR3
MOV DI, OFFSET STR4
CALL STRING_COMPARE
; 程序结束
MOV AH, 4CH
INT 21H
; =============================================
; 字符串比较子函数
; 功能:比较两个以null结尾的字符串
; 输入:DS:SI = 字符串1的地址
; ES:DI = 字符串2的地址
; 输出:AX = 比较结果
; AX = 0 -> 字符串相等
; AX > 0 -> 字符串1 > 字符串2
; AX < 0 -> 字符串1 < 字符串2
; 使用寄存器:AX, BX, SI, DI
; 保留寄存器:CX, DX, BP, SP, DS, ES
; =============================================
STRING_COMPARE PROC NEAR
PUSH BX ; 保存BX寄存器
COMPARE_LOOP:
; 从字符串1加载字符
MOV AL, [SI] ; AL = DS:[SI]
; 从字符串2加载字符
MOV BL, ES:[DI] ; BL = ES:[DI]
; 比较两个字符
CMP AL, BL
JNE CHAR_DIFFERENT ; 字符不同
; 检查是否到达字符串结尾
TEST AL, AL ; AL == 0?
JZ STRINGS_EQUAL ; 是,字符串相等
; 移动到下一个字符
INC SI
INC DI
JMP COMPARE_LOOP
CHAR_DIFFERENT:
; 计算差值 (AL - BL)
SUB AL, BL ; AL = AL - BL
; 符号扩展到AX
;MOVSX AX, AL ; 将8位有符号数扩展到16位
JMP COMPARE_DONE
STRINGS_EQUAL:
XOR AX, AX ; AX = 0 (字符串相等)
COMPARE_DONE:
POP BX ; 恢复BX寄存器
RET ; 返回调用者
STRING_COMPARE ENDP
; 数据段
;.DATA
STR1 DB 'hello', 0
STR2 DB 'hello', 0 ; 等于STR1
STR3 DB 'apple', 0
STR4 DB 'banana', 0 ; 大于STR3
END START