1

我正在尝试使用递归过程来计算高级汇编中的 AB。计算出差异后,将其存储在 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;
4

1 回答 1

0

环境

  • HLA (High Level Assembler - HLABE back end, POLINK linker) 版本 2.16 build 4413 (prototype)
  • 视窗 10

笔记

  • 此问题中的递归算法适用于以下情况:positive - positivepositive - negativenegative - positive但不适用于 情况negative - negative

解决方案

  • 问题是从递归调用返回后,recursiveSubtraction代码总是会按顺序继续到AEqualsZero标签。
NeitherEqualZero:
    sub(1, EAX);
    sub(1, EBX);
    push(EAX);
    push(EBX);
    call recursiveSubtraction;
AEqualsZero:
    neg(EBX);
    mov(EBX, EAX);
    jmp ExitSequence;
  • jmp ExitSequence为了解决这个问题,在调用之后添加一个额外的recursiveSubtraction.
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;
于 2020-06-15T21:37:12.013 回答