x86‌汇编 REPE CMPSB‌ 指令学习

张开发
2026/4/21 17:24:31 15 分钟阅读
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这句是不是定义了toplabel不太有映像要比较的2个内存区域分别由 DS:SI 和 ES:DI 指向所以要设置ds和es寄存器这里是指向同一个段然后把偏移地址赋给si和di寄存器然后使用CLD指令清除方向标志DF这样SI/DI 自增从低地址向高地址比较MOV CX,STR2-STR1定义的2个地址相减结果赋给cx这是比较的次数然后执行repe cmpsb如果发现有不等跳转到MOVNO全部比较完没发现有不等把MATCH的地址放入DXMOVNO处是把NOTMA的地址放入DXLEA 指令Load Effective Address用于加载一个有效的地址到一个寄存器中但不从该地址读取数据MOV AH,9INT 21H调用DOS功能显示DSDX地址处的字符

更多文章