汇编语言5字节字符串比较问题:指针未正确移动的排查
问题分析与解决方案
你的程序存在几个关键问题导致无法正确遍历字符串进行比较:
1. 使用了保留指令名作为标签
loop 是x86汇编中的保留指令(用于基于ECX计数器的循环),将它用作自定义标签会导致汇编器混淆,使得跳转逻辑出错,循环无法正确迭代多次。
2. 计数器使用ASCII字符而非数值
你将计数器初始化为ASCII字符 '5'(十进制值53),虽然通过递减可以最终得到 '0',但这种方式容易出错,且不符合常规的数值循环逻辑。
3. 输入处理冗余导致的潜在问题
读取第一个输入后的填充读取请求了2字节,但实际上只需要读取1字节来消耗换行符,这会导致程序等待额外的输入,可能干扰第二个字符串的读取。
修正后的代码
section .data output1: db 'IDENTICAL',10 outputLen1: equ $-output1 output2: db 'NOT IDENTICAL',10 ; 修正拼写错误 outputLen2: equ $-output2 newline: db 10 section .bss string1 resb 5 ; 存储第一个字符串 string2 resb 5 ; 存储第二个字符串 filler resb 1 ; 仅需1字节存储换行符 counter resb 1 ; 循环计数器(数值类型) section .text global _start _start: ; 读取第一个输入 mov eax,3 mov ebx,0 mov ecx,string1 mov edx,5 int 80h ; 读取第一个输入后的换行符 mov eax,3 mov ebx,0 mov ecx,filler mov edx,1 ; 改为读取1字节 int 80h ; 读取第二个输入 mov eax,3 mov ebx,0 mov ecx,string2 mov edx,5 int 80h ; 加载字符串地址到寄存器 mov eax, string1 mov ebx, string2 ; 初始化计数器为数值5(而非ASCII字符) mov [counter], byte 5 ; 循环比较5次,直到发现不同字符 compare_loop: ; 重命名标签避免与保留指令冲突 mov al, [eax] ; 加载string1的当前字符 mov bl, [ebx] ; 加载string2的当前字符 cmp al, bl jne false ; 字符不同则跳转到非相同分支 inc eax ; 移动到string1的下一个字符 inc ebx ; 移动到string2的下一个字符 ; 计数器递减并检查是否完成所有比较 DEC byte [counter] cmp [counter], byte 0 ; 比较数值0 jz true ; 计数器为0说明所有字符都相同 jmp compare_loop ; 跳转到循环开头 false: ; 输出"NOT IDENTICAL" mov eax,4 mov ebx,1 mov ecx,output2 mov edx,outputLen2 int 80h jmp end true: ; 输出"IDENTICAL" mov eax,4 mov ebx,1 mov ecx,output1 mov edx,outputLen1 int 80h jmp end end: ; 退出程序 mov eax,1 mov ebx,0 int 80h
关键修正点说明
- 标签重命名:将
loop改为compare_loop,避免与x86的loop指令冲突,确保跳转逻辑正确。 - 计数器数值化:使用数值5初始化计数器,递减后与数值0比较,逻辑更直观且不易出错。
- 输入处理优化:将填充读取的字节数改为1,仅消耗第一个输入后的换行符,避免程序等待额外输入。
- 拼写修正:将
NOT INDENTICAL改为NOT IDENTICAL,修正输出文本的拼写错误。
内容的提问来源于stack exchange,提问作者Noelle472
相关产品推荐
相关产品推荐

