Stored procedures HLA:为什么EAX寄存器在退出递归过程时保持零值?

Stored procedures HLA:为什么EAX寄存器在退出递归过程时保持零值?,stored-procedures,recursion,hla,Stored Procedures,Recursion,Hla,我尝试使用递归过程来计算高级汇编中的a-B。计算完差值后,将其存储在EAX寄存器中,以便在程序结束时显示 我的问题:退出过程之前,寄存器EAX和EBX中的值是正确的,但我不明白为什么当A大于B时EAX总是为零 ret()命令是否导致了这种情况?我的代码有什么问题?有人请帮帮我 以下是示例代码: program MainSubtractionFunction; #include( "stdlib.hhf" ); static iDataValue1 : int32 := 0; iD

我尝试使用递归过程来计算高级汇编中的a-B。计算完差值后,将其存储在EAX寄存器中,以便在程序结束时显示

我的问题:退出过程之前,寄存器EAX和EBX中的值是正确的,但我不明白为什么当A大于B时EAX总是为零

ret()命令是否导致了这种情况?我的代码有什么问题?有人请帮帮我

以下是示例代码:

program MainSubtractionFunction;
#include( "stdlib.hhf" );
static
    iDataValue1 : int32 := 0;
    iDataValue2 : int32 := 0;
    DifferenceInt : int32 :=69;
procedure recursiveSubtraction( a: int32; b : int32 ); @nodisplay; @noframe;
static
    returnAddress : dword;
    value: int32;
begin recursiveSubtraction;
    pop( returnAddress );
    pop( b );           
    pop( a );
    push( returnAddress );
    mov (a, EAX);
    mov (b, EBX);
    CompareB:
    cmp (EBX, 0);
    je ExitSequence;
    CompareA:
    cmp (EAX, 0);
    je AEqualsZero;
    NeitherEqualZero:
    sub (1, EAX);
    sub (1, EBX);
    push(EAX);
    push(EBX);
    call recursiveSubtraction;
    AEqualsZero:
        neg (EBX);
        mov (EBX, EAX);
        jmp ExitSequence;
    BEqualsZero:
        jmp ExitSequence;
    ExitSequence:
        ret();
    end recursiveSubtraction;
begin MainSubtractionFunction;
    stdout.put( "Feed Me A: " );
    stdin.get( iDataValue1 );
    stdout.put( "Feed Me B: " );
    stdin.get( iDataValue2 );  
    push( iDataValue1 );
    push( iDataValue2 );
    call recursiveSubtraction;
    mov(EAX, DifferenceInt);
    stdout.put("RecursiveSubtraction of A-B = ",DifferenceInt, nl);
    stdout.put("EAX = ",EAX, nl);
    stdout.put("EBX = ",EBX, nl);
    stdout.put("ECX = ",ECX, nl);   
end MainSubtractionFunction;
环境

  • HLA(高级汇编程序-HLABE后端,POLINK链接器) 版本2.16构建4413(原型)
  • 视窗10
注意

  • 此问题中的递归算法适用于以下情况:
    正-正
    正-负
    负-正
    ,但不适用于
    负-负
    的情况
解决方案

  • 问题是,从递归调用返回到
    recursivedetraction
    后,代码将始终按顺序继续到
    AEqualsZero
    标签
  • 要解决此问题,请在调用
    递归减法
    后再添加一个
    jmp ExitSequence
示例

NeitherEqualZero:
    sub(1, EAX);
    sub(1, EBX);
    push(EAX);
    push(EBX);
    call recursiveSubtraction;
AEqualsZero:
    neg(EBX);
    mov(EBX, EAX);
    jmp ExitSequence;
NeitherEqualZero:
    sub(1, EAX);
    sub(1, EBX);
    push(EAX);
    push(EBX);
    call recursiveSubtraction;
    jmp ExitSequence;
AEqualsZero:
    neg(EBX);
    mov(EBX, EAX);
    jmp ExitSequence;
program MainSubtractionFunction;
#include("stdlib.hhf");

procedure recursiveSubtraction(A: int32; B: int32); @nodisplay; @noframe;
begin recursiveSubtraction;
    pop(EDX); // Return Address
    pop(EBX);           
    pop(EAX);
    push(EDX); // Return Address
    CompareB:
        cmp(EBX, 0);
        je ExitSequence;
    CompareA:
        cmp(EAX, 0);
        je AEqualsZero;
    NeitherEqualZero:
        dec(EAX);
        dec(EBX);
        push(EAX);
        push(EBX);
        call recursiveSubtraction;
        jmp ExitSequence;
    AEqualsZero:
        neg(EBX);
        mov(EBX, EAX);
        jmp ExitSequence;
    BEqualsZero:
        jmp ExitSequence;
    ExitSequence:
        ret();
end recursiveSubtraction;

begin MainSubtractionFunction;
    stdout.put("Feed Me A: ");
    stdin.geti32();
    push(EAX);
    stdout.put("Feed Me B: ");
    stdin.geti32();
    push(EAX);
    call recursiveSubtraction;
    stdout.put("RecursiveSubtraction of A-B = ", (type int32 EAX), nl);  
end MainSubtractionFunction;