当前位置: 首页 > backend >正文

汇编字符串比较函数

一个完整的字符串比较子函数,专为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, @DATAMOV DS, AXMOV ES, AX; 测试字符串1MOV SI, OFFSET STR1MOV DI, OFFSET STR2CALL STRING_COMPARE; 此时AX包含比较结果; 测试字符串2MOV SI, OFFSET STR3MOV DI, OFFSET STR4CALL STRING_COMPARE; 程序结束MOV AH, 4CHINT 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 NEARPUSH BX           ; 保存BX寄存器COMPARE_LOOP:; 从字符串1加载字符MOV AL, [SI]      ; AL = DS:[SI]; 从字符串2加载字符MOV BL, ES:[DI]   ; BL = ES:[DI]; 比较两个字符CMP AL, BLJNE CHAR_DIFFERENT ; 字符不同; 检查是否到达字符串结尾TEST AL, AL       ; AL == 0?JZ STRINGS_EQUAL  ; 是,字符串相等; 移动到下一个字符INC SIINC DIJMP COMPARE_LOOPCHAR_DIFFERENT:; 计算差值 (AL - BL)SUB AL, BL        ; AL = AL - BL; 符号扩展到AX;MOVSX AX, AL      ; 将8位有符号数扩展到16位JMP COMPARE_DONESTRINGS_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

http://www.xdnf.cn/news/13675.html

相关文章:

  • yapi服务端可视化安装
  • C++设计模式:八股文
  • (简单介绍)EleutherAI
  • MS8188是一款36V高精度低噪声的运算放大器,采用高压斩波技术来实现零温漂的特性,可替代LT1012/ADA4522/MAX44244/TPA1831
  • π0.5与π0区别
  • Mentalab Explore 开源 EEG 软件方案:构建开放兼容的脑电研究生态
  • 动态规划1——线性动态规划
  • 创客匠人助力家庭教育IP破局:从0到1打造创始人个人品牌全攻略
  • Android Compose 自定义滑动进度条
  • RAGFlow迁移到GPU服务器(Docker容器元数据修复)
  • Springboot3+的id字符串转化问题
  • LaTeX常用数学公式语法
  • 香橙派3B学习笔记10:snap打包C/C++程序与动态链接库(.so)
  • 数组方法_join()+_concat()+_reverse()+ _indexOf()
  • MS5110模数转换器可pin to pin兼容ADS1110
  • 「AI产业」| 《2025中国低空经济商业洞察报告(商业无人机应用篇)》
  • 【mysql】联合索引和单列索引的区别
  • Ceph分布式存储方案
  • 比亚迪座舱接入通义大模型,未来将联合打造更多AI智能座舱场景
  • 【JUC面试篇】Java并发编程高频八股——线程与多线程
  • 各项目变更频繁时,如何保持整体稳定
  • Linux 内核学习(10) --- Linux sysfs 节点创建
  • Testbed问题记录
  • 【每日likou】704. 二分查找 27. 移除元素 977.有序数组的平方
  • Pandas:你的数据分析瑞士军刀![特殊字符]✨
  • DeepCritic: SFT+RL两阶段训练突破LLM自我监督!显著提升大模型的自我批判能力!!
  • 构建康养人才职业成长加速器 —— 智慧康养实训室虚拟仿真建设方案
  • 【笔记】NVIDIA AI Workbench 中安装 CUDA 12.9
  • 其他UML图示例,用到再学习
  • 心理学行业IP变现新趋势:创客匠人赋能个人品牌崛起