如何在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岁
- 小于当前年的情况,先计算初始年龄=当前年-出生年,存到
age变量里 - 再输入出生月份,月份大于当前月直接年龄减1后输出
- 月份等于当前月再输入出生日期,日期大于当前日年龄减1输出,日期相等输出加生日快乐后缀
- 月份小于当前月直接输出年龄即可
内容的提问来源于stack exchange,提问作者CritAnnihilation
相关产品推荐
相关产品推荐

