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,初始的垃圾值也可能导致后续循环出问题。修复方案:
- 每次执行
div前必须清零rdx,确保被除数仅为rax中的值:.divide: xor rdx, rdx ; 清零rdx,保证被除数是rax div r8 ; rax=商,rdx=余数(0-9) ; 后续处理余数 - 不要直接修改rdx中的余数,将余数复制到临时寄存器后再转换为ASCII:
mov cl, dl ; 把余数从dl复制到cl add cl, '0' ; 转换为ASCII字符 push rcx ; 存入栈中(或写入内存缓冲区)
- 每次执行
内容的提问来源于stack exchange,提问作者avighnac
相关产品推荐
相关产品推荐

