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

汇编实现摄氏转华氏时遇A2022错误,求修复方案

修复汇编摄氏转华氏程序的A2022错误及逻辑问题

错误原因分析

  1. 操作数大小不匹配(报错根源)
    代码中mov prompt1, eax这一行,prompt1是BYTE类型(1字节),而eax是32位寄存器(4字节),两者操作数大小不一致,直接触发A2022错误。且prompt1是存储提示字符串的变量,不应用来保存输入的整数,需新增DWORD类型变量存储输入的摄氏温度。

  2. 温度转换公式完全错误
    摄氏转华氏的正确公式是:F = C × 9 ÷ 5 + 32,但代码中:

    • 错误地将输入值乘以5而非9
    • 最后执行sub eax, 32(减32),正确操作应为加32
  3. 输出参数类型错误
    output函数要求传入字符串参数,但代码直接传入number2(DWORD整数),需先用dtos指令将整数转换为字符串后再输出。

  4. 注释与代码逻辑不符
    imul eax, 5的注释写着“multiply f times 9”,与实际代码逻辑冲突,需修正注释。

修复后的完整代码

tempC       DWORD   ? ; 存储输入的摄氏温度
number2     DWORD   ? ; 存储转换后的华氏温度
prompt1     BYTE    "Enter the temp", 0
string      BYTE    40 DUP (?)
resultLbl   BYTE    "The Fahrenheit temp is: ", 0
result      BYTE    11 DUP (?), 0

.CODE
_MainProc PROC
        input prompt1, string, 40 ; 读取ASCII输入
        atod    string ; 转换为整数
        mov     tempC, eax ; 将输入的摄氏温度存入变量

        imul    eax, 9 ; 摄氏温度乘以9
        add     eax, 2 ; 四舍五入处理,避免整数除法精度丢失
        mov     ebx, 5 ; 设置除数为5
        cdq ; 将EAX扩展为EDX:EAX,准备整数除法
        idiv    ebx ; 计算 (C×9)/5
        add     eax, 32 ; 加上32得到华氏温度
        mov     number2, eax

        dtos    number2, result ; 将华氏温度整数转换为字符串
        output  resultLbl, result ; 输出结果
    
        mov     eax, 0
        ret

_MainProc ENDP
END ; end of source code

修复说明

  • 新增tempC变量存储输入的摄氏温度,解决操作数大小不匹配问题
  • 修正温度转换公式,按照正确逻辑实现摄氏转华氏计算
  • 使用dtos将整数结果转换为字符串,符合output函数的参数要求
  • 修正注释,使其与代码逻辑一致
  • 调整resultLbl提示文本,使其表述更准确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:15:35