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

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;

代码说明

  1. 位域提取:用0x1F掩码配合右移操作,准确提取每个套餐的5位数量值
  2. 循环加法替代乘法:对每个套餐的数量,通过循环累加对应单价计算该套餐总价,完全符合题目要求
  3. 变量管理:用静态变量存储各套餐数量和总成本,避免寄存器被覆盖导致的输出错误
  4. 兼容性优化:使用HLA内置的exit(0)替代直接调用int 0x80,适配不同运行环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:14:54