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

x86汇编实现摄氏转华氏程序输入后触发段错误问题排查

段错误触发原因及修复方案

核心错误点

  • 非法内存访问(段错误直接诱因)
    你在读取用户输入后执行了mov eax, [celsius],此处中括号表示取值操作,是将用户输入的摄氏温度整数值存入了eax寄存器。后续c2f函数中fld dword [eax]、fstp dword [eax],以及main函数里的fld dword [eax],都是试图访问以这个温度值为起始地址的内存空间,这类地址基本都属于进程无访问权限的非法地址,直接触发段错误。
    正确写法应该是把celsius变量的内存地址传给eax:mov eax, celsius。
  • 多余的栈操作破坏参数结构
    调用c2f之后的push eax是完全无意义的操作,没有对应出栈逻辑,会导致后续传给printf的参数位置全部偏移,即便解决了非法访问问题也会输出异常甚至崩溃,这行代码需要直接删除。
  • 数值类型加载错误
    celsius中存储的是32位有符号整数,你直接用fld指令加载会被误识别为32位单精度浮点数,转换结果完全错误。需要改用整数加载浮点指令fild处理摄氏温度值。

修复后的核心代码片段

; 读取用户输入后修正地址传递
mov eax, celsius
call c2f

; 删除多余的push eax,直接加载结果
fld   dword [eax]                    
fstp  qword [temp] 
c2f:
  fld   dword [x]                 
  fild   dword [eax]  ; 改用fild加载整型值
  fmul
  fstp   dword [z]
  
  fld   dword [z]
  fld   dword [y]
  fadd
  fstp  dword [eax]         
  ret

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 12:06:02