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

x86‌汇编 REPE CMPSB‌ 指令学习

REPE CMPSB‌ 是 x86 汇编语言中用于‌逐字节比较两个字符串‌的组合指令;

‌CMPSB‌:比较两个内存区域中的字节,分别由 DS:SI 和 ES:DI 指向。
比较后会设置标志寄存器中的 ‌ZF(零标志位)‌:
若两字节相等,ZF = 1
若不相等,ZF = 0

‌REPE(或 REPZ)‌:重复前缀,含义为 “‌当相等时重复‌”,即只要 ZF = 1 且计数器 CX ≠ 0,就继续执行 CMPSB。

当 REPE CMPSB 停止时,可能有两种情况 ‌
‌CX = 0‌:所有字节均已比较完毕且完全相等。
‌ ZF = 0‌:首次发现不相等的字节,比较终止。

该指令常用于‌判断两个字符串是否相等‌,或‌查找第一个不匹配位置‌;

cmpsb执行字节的比较,repe是重复前缀;

下面看一个基本程序;比较2个字符串;

DATAS SEGMENT STR1 DB 'I am abcdef' STR2 DB 'I am abcdef' MATCH DB 'equal',0DH,0AH,'$' NOTMA DB 'not equal',0DH,0AH,'$' DATAS ENDS STACKS SEGMENT DW 100H DUP(?) TOP LABEL WORD STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV ES,AX ;数据段和附加段指向同一段 MOV AX,STACKS MOV SS,AX LEA SP,TOP ;初始化 LEA SI,STR1 ;数据段的指针 LEA DI,STR2 ;附加段的指针 CLD ;执行方向 MOV CX,STR2-STR1;比较的次数,用STR2的地址减去STR1地址,也就是CX等于STR1的长度 REPE CMPSB ;逐个字节比较 JNE MOVNO ;一旦不相等就跳去设定not match的 LEA DX,MATCH ;全部比较完没问题就设定MATCH JMP DISP ;跳去输出 MOVNO: LEA DX,NOTMA ;设定not match DISP: MOV AH,9 ;输出结果信息 INT 21H MOV AH,4CH INT 21H CODES ENDS END START

在emu8086中运行;字符串不等或相等的输出结果如下;

代码是别的地方看的,下面学习和解释一下;

首先是定义了str1、str2,和要输出的结果标志;
top label word,这句是不是定义了top,label不太有映像;

要比较的2个内存区域分别由 DS:SI 和 ES:DI 指向;
所以要设置ds和es寄存器,这里是指向同一个段;
然后把偏移地址赋给si和di寄存器;

然后使用CLD指令清除方向标志DF,这样,SI/DI 自增(从低地址向高地址比较);

MOV CX,STR2-STR1,定义的2个地址相减,结果赋给cx,这是比较的次数;

然后执行repe cmpsb;

如果发现有不等,跳转到MOVNO;
全部比较完没发现有不等,把MATCH的地址放入DX;

MOVNO处,是把NOTMA的地址放入DX;

LEA 指令(Load Effective Address)用于加载一个有效的地址到一个寄存器中,但不从该地址读取数据;

MOV AH,9
INT 21H
调用DOS功能,显示DS:DX地址处的字符;

http://www.jsqmd.com/news/669627/

相关文章:

  • 【代码开源】基于STM32的智能路灯控制系统设计
  • 2026年比较好的机场防护栅栏/金属网片防护栅栏/刺网防护栅栏厂家选择指南 - 品牌宣传支持者
  • 【Linux】进程(1)基础
  • Pixel Aurora Engine 算法原理浅析:从扩散模型到惊艳生成
  • 2026年知名的SJA丝杆升降机/非标丝杆升降机/伞齿轮丝杆升降机/SWL丝杆升降机生产厂家推荐 - 行业平台推荐
  • FlowState Lab 赋能智能运维:服务器异常波动检测与根因分析
  • 2026年口碑好的锥齿轮螺旋升降机/滚珠螺旋升降机/螺旋升降机/多台同步螺旋升降机品牌厂家推荐 - 品牌宣传支持者
  • Wan2.2-I2V-A14B一文详解:Diffusers pipeline定制与自定义scheduler实践
  • 一招解决 H5 远程收款:动态支付链接优势
  • FireRedASR-AED-L效果展示:同一人不同语速(慢速/常速/快速)识别对比
  • Kotaemon效果展示:实测文档问答,回答精准度惊艳
  • 项目做了一半想重写?这套前端架构让你少走3年弯路
  • Linux 的 runcon 命令
  • 别再只用RMSE了!用evo的绘图功能给你的SLAM论文加个“颜值Buff”
  • 2026年比较好的哈尔滨水泥制品/哈尔滨水泥制品彩砖/哈尔滨水泥制品流水槽实力工厂推荐 - 行业平台推荐
  • 云计算Linux——基础操作命令(一)
  • 事务四大特性(ACID)、四大隔离级别、Spring 七大事务传播行为
  • 一文讲清,排班管理系统是什么意思?排班管理系统如何优化企业用工?
  • 忍者像素绘卷参数详解:Steps=20/30/50对16-Bit像素块清晰度影响可视化分析
  • STM32F407驱动无刷电机:用CubeMX和HAL库快速实现SimpleFOC开环调速
  • 对于所有翻译从业者而言,唯有认清自身定位,敬畏信息、坚守操守、精进专业,才能在翻译之路上行稳致远。
  • 告别枯燥协议文档:用Wireshark抓包和Python脚本‘看见’JESD204B的链路建立过程
  • 2026年靠谱的哈尔滨步道板流水槽/哈尔滨步道板水泥盖板/黑龙江步道板水泥砖销售厂家推荐 - 品牌宣传支持者
  • Phi-3-vision多模态模型体验:用Chainlit前端轻松实现图片问答
  • AI开发-python-langchain框架(--提取pdf中的图片 )
  • Pi0机器人模型亲测体验:Web界面操作简单,动作生成快速
  • 别再手动算相位增量了!Vivado 2023.2里用Xilinx DDS IP核生成1MHz正弦波的保姆级教程
  • 前端手记(二):Axios 封装与 FastAPI 联调
  • 2026年靠谱的低噪音电机/电机定制/螺杆真空泵配套电机/定制化电机公司口碑推荐 - 行业平台推荐
  • AGI自主编写0day Exploit仅需23秒?实测GPT-5、Claude-4、Qwen-AGI在CVE-2024-XXXX系列漏洞上的武器化效率对比