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

x64 NASM整数转字符串负号位置错误问题求助

解决NASM x64整数转字符串负数输出颠倒问题

核心问题分析

你当前的实现逻辑是先将负数的绝对值转换为数字字符串,再把负号追加到字符串末尾,这直接导致符号与数字顺序颠倒。正确逻辑应该是先在字符串起始位置写入负号,再将转换后的数字字符串放在负号之后。

具体修正步骤

假设你当前的_int_to_string流程是新手常见的实现方式,调整方向如下:

  1. 初始化字符串缓冲区,标记起始写入位置
  2. 判断输入是否为负数:
    • 若是负数:在缓冲区当前起始位置写入负号'-',将写入指针后移1位,再把输入值取绝对值
    • 若是正数,直接处理原数
  3. 将绝对值转换为数字字符串(反转逻辑可保留),写入到调整后的缓冲区起始位置之后
  4. 添加字符串结束符0

关键代码示例(适配Windows x64调用约定)

以下是修正后的核心实现片段(RCX传递待转换整数,RDX传递输出缓冲区指针):

_int_to_string:
    ; RCX = 待转换整数,RDX = 输出缓冲区指针
    push rbx
    push rsi
    push rdi

    mov rsi, rdx       ; rsi指向缓冲区当前写入位置
    mov rbx, 10        ; 除数固定为10
    mov rax, rcx       ; rax暂存待转换数值

    ; 判断是否为负数
    test rax, rax
    jns .positive      ; 正数直接跳转处理
    ; 处理负数:先写入负号
    mov byte [rsi], '-'
    inc rsi
    neg rax            ; 取绝对值

.positive:
    ; 逐位拆解数字(低位到高位压栈)
    xor rdi, rdi       ; rdi记录数字位数
.push_digits:
    xor rdx, rdx
    div rbx
    add dl, '0'        ; 转换为ASCII字符
    push rdx
    inc rdi
    test rax, rax
    jnz .push_digits

    ; 弹出数字到缓冲区(高位到低位)
.pop_digits:
    pop rdx
    mov byte [rsi], dl
    inc rsi
    dec rdi
    jnz .pop_digits

    ; 添加字符串结束符
    mov byte [rsi], 0

    pop rdi
    pop rsi
    pop rbx
    ret

验证注意事项

  • 确认处理负数时先写入负号再处理数字,而非最后追加
  • 注意缓冲区指针的偏移,写入负号后必须后移指针,避免符号被覆盖
  • 测试边界值:比如-2147483648(32位INT_MIN),x64下使用64位寄存器处理可避免溢出问题

内容的提问来源于stack exchange,提问作者unerr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:49:56