x86_64 NASM汇编中多字符字符串遍历失败问题咨询
多字符八进制字符串转换代码失效的原因分析
你需要遍历用户输入的数字字符串(八进制)并检查每个字符,但当前代码仅能处理单字符输入,多字符场景完全失效,核心问题有两个:
1. 缺少循环遍历逻辑
当前代码仅处理了rbx=0对应的第一个字符,无论处理结果是进入imprimir还是直接跳转到fin_conversion,最终都会执行ret返回,根本没有对后续字符进行遍历处理。你手动把rbx设为2能处理第三个字符,只是因为单次处理了索引2的位置,本质还是没有循环遍历整个字符串的逻辑。
2. 内存访问宽度错误
代码中使用dword[numero_a_convertir + rbx]读取数据,也就是每次读取4字节的双字,但ASCII字符串的每个字符仅占1字节。比如输入"12345"时,dword[numero_a_convertir + 0]会一次性读取"1""2""3""4"四个字符拼接成的双字值,和单个字符的ASCII码(如"0"的0x30)比较必然不匹配,只有当rbx偏移到字符串末尾的终止符区域时才可能出现巧合匹配,这完全不符合单字符检查的需求。
修正方向
- 把所有内存访问的宽度从
dword改为byte,确保每次只读取一个ASCII字符:比如cmp byte[numero_a_convertir + rbx], "0" - 添加循环逻辑:在
imprimir执行完后,将rbx自增1,然后检查当前位置是否为字符串终止符(通常是0),如果不是则跳回开头继续处理下一个字符 - 修正
printf的参数传递:因为读取的是单字节字符,需要用movzx rdx, byte[numero_a_convertir + rbx]将单字节零扩展为64位寄存器值,避免高字节的垃圾数据干扰输出
示例修正后的核心逻辑片段:
;* BASE 8 A BINARIO convertir_octal_a_base2: mov rbx, 0 loop_inicio: cmp byte[numero_a_convertir + rbx], 0 ; 检查是否到字符串结束 je fin_conversion cmp byte[numero_a_convertir + rbx], "0" je imprimir ; 其余字符判断逻辑... jmp siguiente_char ; 不是合法八进制字符,直接跳到下一个 imprimir: mov rcx, MENSAJE_A_IMPRIMIR_CHAR movzx rdx, byte[numero_a_convertir + rbx] ; 零扩展单字节到64位 sub rsp, 32 call printf add rsp, 32 siguiente_char: inc rbx ; 移动到下一个字符 jmp loop_inicio fin_conversion: ret
内容的提问来源于stack exchange,提问作者Guido
相关产品推荐
相关产品推荐

