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

Qword转字符串汇编程序触发SIGFPE错误排查求助

Qword转十进制字符串时SIGFPE错误的排查与解决
  • 错误根源:x86的div指令触发SIGFPE(除法错误)的核心原因不是除数为0,而是被除数的高64位(rdx)大于等于除数(r8),导致商无法存入rax(64位无符号寄存器),触发商溢出。

  • 你的场景分析:
    第二次循环执行div时,rax=4、r8=10,但rdx的值大概率已被修改为ASCII码(48-57)——你可能直接对dl(rdx的低8位)执行了add dl, '0'来转换余数,这会把rdx从原来的0-9(余数)改成48-57,远大于除数10。此时rdx:rax作为128位被除数除以10,商必然超过64位范围,触发溢出错误。
    另外,若循环中未在每次div前清零rdx,即使没修改rdx,第二次循环时rdx保留的余数(0-9)虽小于10,但如果第一次循环前未清零rdx,初始的垃圾值也可能导致后续循环出问题。

  • 修复方案:

    1. 每次执行div前必须清零rdx,确保被除数仅为rax中的值:
      .divide:
          xor rdx, rdx    ; 清零rdx,保证被除数是rax
          div r8          ; rax=商,rdx=余数(0-9)
          ; 后续处理余数
      
    2. 不要直接修改rdx中的余数,将余数复制到临时寄存器后再转换为ASCII:
      mov cl, dl        ; 把余数从dl复制到cl
      add cl, '0'       ; 转换为ASCII字符
      push rcx          ; 存入栈中(或写入内存缓冲区)
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:15:30