You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:05:44