Linux 64位NASM汇编中浮点异常(core dumped)问题排查
汇编除法转字符串代码的浮点异常修复
这段x86-64汇编代码用于将整数转换为ASCII字符串,但执行时触发浮点异常(core dumped),问题出在div指令的使用逻辑和寄存器操作顺序上,具体错误和修复方案如下:
核心错误点
div指令的被除数非法:div rcx执行64位无符号除法时,要求被除数存储在rdx:rax寄存器对中。第一次循环前虽清零了rdx,但后续循环未重新清零,还错误地将rdx的值赋值给rax,导致下一次除法时rdx:rax的组合不是合法被除数,直接触发除法错误。- 操作顺序完全颠倒:先把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
相关产品推荐
相关产品推荐

