x64 NASM整数转字符串负号位置错误问题求助
解决NASM x64整数转字符串负数输出颠倒问题
核心问题分析
你当前的实现逻辑是先将负数的绝对值转换为数字字符串,再把负号追加到字符串末尾,这直接导致符号与数字顺序颠倒。正确逻辑应该是先在字符串起始位置写入负号,再将转换后的数字字符串放在负号之后。
具体修正步骤
假设你当前的_int_to_string流程是新手常见的实现方式,调整方向如下:
- 初始化字符串缓冲区,标记起始写入位置
- 判断输入是否为负数:
- 若是负数:在缓冲区当前起始位置写入负号
'-',将写入指针后移1位,再把输入值取绝对值 - 若是正数,直接处理原数
- 若是负数:在缓冲区当前起始位置写入负号
- 将绝对值转换为数字字符串(反转逻辑可保留),写入到调整后的缓冲区起始位置之后
- 添加字符串结束符
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
相关产品推荐
相关产品推荐

