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

HLA汇编寄存器保存问题求助:如何保证函数仅修改DX寄存器?

HLA汇编函数寄存器保存问题解决方案

核心问题分析

你的教授指出的问题准确无误:函数执行时修改了AX、BX、CX寄存器,但未保存和恢复它们的原始值,违反了“返回后除DX外其他寄存器保持不变”的要求。必须通过push和pop指令,在函数入口保存会被修改的寄存器,在返回前恢复这些寄存器的值。

此外你的代码还有两处逻辑问题:

  • 函数参数声明为var(传引用),但实际调用时是传递数值(push AX/BX/CX的内容),参数类型不匹配
  • 函数内部直接输出结果,不符合“仅返回最小值到DX”的单一职责原则,输出逻辑应放在主程序中

修改后的完整代码

program Smallest_Number;
#include( "stdlib.hhf" );

static
    value1 : int16;
    value2 : int16;
    value3 : int16;

// 修改为传值参数,匹配调用时传递的整数数值
procedure smallest( val v1 : int16; val v2 : int16; val v3 : int16 ); 
    @nodisplay; @noframe; 

static
    dReturnAddress : dword;

begin smallest;
    // 第一步:保存会被修改的寄存器到栈中
    push(AX);
    push(BX);
    push(CX);

    // 取出栈上的返回地址和参数
    pop( dReturnAddress ); 
    pop( CX );  // 取出第三个参数v3
    pop( BX );  // 取出第二个参数v2
    pop( AX );  // 取出第一个参数v1
    push( dReturnAddress );

    // 最小值计算逻辑
    mov(AX, DX);  // 先假设v1为最小值,存入DX
    cmp(DX, BX);    
    jl check_v3;        
    mov(BX, DX);   // 若v2更小,更新DX为v2

check_v3:
    cmp(DX, CX);   
    jl end_smallest;   
    mov(CX, DX);   // 若v3更小,更新DX为v3

end_smallest:
    // 第二步:按与push相反的顺序恢复寄存器
    pop(CX);
    pop(BX);
    pop(AX);

    ret();
end smallest;

begin Smallest_Number;
    stdout.put( "Provide value1:" );
    stdin.get(value1);
    stdout.put( "Provide value2:" );
    stdin.get(value2);
    stdout.put( "Provide value3:" );
    stdin.get(value3);

    // 按从右到左的顺序入栈参数(符合HLA调用约定)
    push(value3);
    push(value2);
    push(value1);

    call smallest;

    // 主程序中输出结果,分离函数职责
    stdout.put( nl, "The smallest value is " );
    stdout.puti16( DX );
    stdout.put( nl );

end Smallest_Number;

关键修改说明

  1. 寄存器保护机制

    • 函数入口用push指令将AX、BX、CX的原始值压入栈中保存
    • 返回前用pop指令按逆序恢复寄存器,确保调用后除DX外,其他寄存器状态与调用前完全一致
  2. 参数逻辑修正

    • 将函数参数类型从var改为val,匹配调用时传递的数值类型
    • 按从右到左的顺序入栈参数,遵循HLA默认的调用约定
  3. 职责分离优化

    • 移除函数内部的输出代码,将输出逻辑移至主程序,让函数仅负责计算并返回最小值,符合模块化设计原则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:44:58