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

Linux 64位NASM汇编中浮点异常(core dumped)问题排查

汇编除法转字符串代码的浮点异常修复

这段x86-64汇编代码用于将整数转换为ASCII字符串,但执行时触发浮点异常(core dumped),问题出在div指令的使用逻辑和寄存器操作顺序上,具体错误和修复方案如下:

核心错误点

  1. div指令的被除数非法:div rcx执行64位无符号除法时,要求被除数存储在rdx:rax寄存器对中。第一次循环前虽清零了rdx,但后续循环未重新清零,还错误地将rdx的值赋值给rax,导致下一次除法时rdx:rax的组合不是合法被除数,直接触发除法错误。
  2. 操作顺序完全颠倒:先把rdx的值覆盖rax,再处理余数转字符,还在修改rax之后判断循环条件,导致循环逻辑彻底混乱,不仅转换出的字符错误,还会触发异常。

修复后的代码

_getTempIntegerPortion:
        mov r8, temp
        mov rcx, 10
        xor rdx, rdx            ; 初始化rdx为0,准备第一次除法

_assignTempIntegerPortion:
        div rcx                 ; 执行除法:rdx:rax / 10 → rax存商,rdx存余数
        add rdx, 48             ; 余数转ASCII字符(0-9对应ASCII码48-57)
        mov [r8], dl            ; 把字符写入temp缓冲区
        inc r8                  ; 缓冲区指针后移
        xor rdx, rdx            ; 清零rdx,为下一次除法准备
        cmp rax, 0              ; 判断商是否为0,决定是否继续循环
        jne _assignTempIntegerPortion ; 商不为0就继续分解
        ret

修复说明

  • 调整操作流程:先做除法得到商和余数,再把余数转成字符存起来,符合“取余转字符→取商继续分解”的逻辑。
  • 每次循环前清零rdx:保证div指令的被除数是rdx:rax(此时rdx为0,被除数就是rax里的商),避免非法操作数导致的异常。
  • 修正循环判断时机:在修改rax之前判断商是否为0,确保循环条件的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:05:19