汇编字符串比较函数

一个完整的字符串比较子函数,专为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

cpp 复制代码
; 测试字符串比较函数
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
相关推荐
Lxx_Zw13 小时前
机器周期与共地:时钟基准和电压参考基准
stm32·单片机·嵌入式硬件
知识分享小能手13 小时前
C学习教程,从入门到精通,C语言学生信息管理系统 — 知识点详解(18)
c语言·学习·1024程序员节
爱读书的小胖13 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
pipixia2003314 小时前
C++ 面试高频:namespace 的 6 个知识点,从 using 到匿名命名空间
c语言·学习·算法·嵌入式·命名空间·c++面试·匿名命名空间
我叫洋洋14 小时前
用 Qoder(AI 编程助手)把 Cadence 16.6 从零配到能画板
人工智能·单片机·嵌入式硬件·电路·1024程序员节
2401_8858850415 小时前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
Navigator_Z15 小时前
LeetCode //C - 1300. Sum of Mutated Array Closest to Target
c语言·算法·leetcode
程序猿乐锅15 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
Wang's Blog15 小时前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友
凯瑟琳.奥古斯特15 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展