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

如何在MASM汇编语言年龄计算程序中正确使用条件语句

MASM年龄计算程序错误修正说明

超大数字输出根因

你输出的4294965279是负数被当作无符号整数输出的结果,本质是计算逻辑、寄存器使用、常量书写三类错误,具体问题如下:


具体错误点

  • 年龄计算的减数与被减数写反
    你计算年龄的代码为:
mov     year, EAX               ;    age = curYear - year
sub     EAX, curYear
mov     age, DWORD

此时EAX里存储的是输入的出生年份(比如示例中的2002),用出生年份减当前年份(2021)得到的是负数,转无符号数输出就会变成超大值。正确写法应该是用当前年份减去出生年份:

mov  eax, curYear
sub  eax, year
mov  age, eax
  • 减1岁时误用ASCII字符代替数字
    你在需要减1岁的场景写的是sub EAX, '1','1'是ASCII编码的字符,对应数值是49,相当于多减了48,完全不符合逻辑。正确写法是sub eax, 1。

  • 存在大量无效错误指令
    代码中多次出现mov year, DWORD、mov month, DWORD这类指令,DWORD是数据类型关键字,不能作为值赋值给变量,这类指令完全无效,建议直接删除。

  • 寄存器值被意外覆盖
    输入完月份之后,EAX寄存器里已经更新为输入的月份值,你没有重新取出之前存储的出生年份计算年龄,直接用EAX里的月份值参与年份减法,导致计算出来的年龄完全错误。比如你输入2002年、4月,此时算年龄用的是4减2021,结果自然是负数对应的超大值。

  • 输出年龄时取错寄存器值
    多个输出场景你直接用mov age, EAX然后输出EAX,但此时EAX里存的是月份或者日期,不是之前计算的年龄值,应该直接从age变量里取值输出:

mov  eax, age
call WriteDec
  • 生日快乐场景用错输出字符串
    你生日快乐的分支里还是输出了普通的yearsOldMsg,应该改成你预定义的yearsOldHBMsg。

调整建议

你可以按照如下顺序优化代码流程:

  1. 输入出生年份后先判断是否大于当前年,大于直接输出未出生,等于直接输出不满1岁
  2. 小于当前年的情况,先计算初始年龄=当前年-出生年,存到age变量里
  3. 再输入出生月份,月份大于当前月直接年龄减1后输出
  4. 月份等于当前月再输入出生日期,日期大于当前日年龄减1输出,日期相等输出加生日快乐后缀
  5. 月份小于当前月直接输出年龄即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:27:00