HLA订单成本计算器代码错误求助:AND指令报错排查
HLA汇编订单计算程序问题排查与修正
第17行报错原因
你写反了HLA指令的操作数顺序——HLA的指令格式是instruction(源操作数, 目的操作数);,所以and(ax, 15);是错误语法,正确写法应为and(15, ax);。
其他核心问题修正
你的代码还存在多处不符合题目要求的问题:
- 位域提取错误:题目明确三种套餐数量各占5位,你当前用4位掩码(15/0xF)和右移4位的逻辑完全错误,正确掩码应为
0x1F(二进制11111),对应右移5/10位提取中间、高位的5位数据 - 违反乘法禁用要求:代码中使用了
mul指令,需要替换为循环累加逻辑 - 寄存器覆盖导致输出错误:后续操作覆盖了存储套餐数量的寄存器,导致最终输出的数量值混乱
修正后的完整代码
program InNOut; #include("stdlib.hhf"); static OrderValue: uns16 := 0; Combo1Price: int16 := 10; Combo2Price: int16 := 8; Combo3Price: int16 := 6; Combo1Count: int16 := 0; Combo2Count: int16 := 0; Combo3Count: int16 := 0; TotalCost: int32 := 0; begin InNOut; stdout.put("Feed me your order as 4 hex digits: "); stdin.get(OrderValue); // 提取各套餐5位数量值 mov(ax, OrderValue); and(0x1F, ax); // 低5位:Combo3数量 mov(Combo3Count, ax); mov(ax, OrderValue); shr(ax, 5); // 右移5位提取Combo2位域 and(0x1F, ax); mov(Combo2Count, ax); mov(ax, OrderValue); shr(ax, 10); // 右移10位提取Combo1位域 and(0x1F, ax); mov(Combo1Count, ax); // 循环累加计算Combo1总价 mov(ecx, Combo1Count); mov(ebx, 0); cmp(ecx, 0); je CalcCombo2; Combo1Loop: add(ebx, Combo1Price); dec(ecx); jne Combo1Loop; add(TotalCost, ebx); CalcCombo2: // 循环累加计算Combo2总价 mov(ecx, Combo2Count); mov(ebx, 0); cmp(ecx, 0); je CalcCombo3; Combo2Loop: add(ebx, Combo2Price); dec(ecx); jne Combo2Loop; add(TotalCost, ebx); CalcCombo3: // 循环累加计算Combo3总价 mov(ecx, Combo3Count); mov(ebx, 0); cmp(ecx, 0); je PrintResults; Combo3Loop: add(ebx, Combo3Price); dec(ecx); jne Combo3Loop; add(TotalCost, ebx); PrintResults: stdout.put(Combo1Count, " Combo 1s", nl); stdout.put(Combo2Count, " Combo 2s", nl); stdout.put(Combo3Count, " Combo 3s", nl); stdout.put("Total Order Costs: $", TotalCost, nl); // HLA标准退出方式 stdout.flush(); exit(0); end InNOut;
代码说明
- 位域提取:用
0x1F掩码配合右移操作,准确提取每个套餐的5位数量值 - 循环加法替代乘法:对每个套餐的数量,通过循环累加对应单价计算该套餐总价,完全符合题目要求
- 变量管理:用静态变量存储各套餐数量和总成本,避免寄存器被覆盖导致的输出错误
- 兼容性优化:使用HLA内置的
exit(0)替代直接调用int 0x80,适配不同运行环境
内容的提问来源于stack exchange,提问作者coolcoolcool
相关产品推荐
相关产品推荐

