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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:35:41