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
相关产品推荐
相关产品推荐

