0

这是我错误的 hla 程序:它总是不打印任何内容...它应该提示用户输入两个 int8 整数并在调用 divideRec 后打印整数商,通过正确推送和弹出堆栈对齐来增加结果...无法弄清楚应该在哪里我修。。

program prog1;

#include( "stdlib.hhf" );

static

n : int8 := 0;

d : int8 := 0;

procedure divideRec( numerator: int8; denominator : int8 ); @nodisplay; @noframe;
static

iReturnAddress : dword;

iResult : int8;

temp : int16;

iRegisterValue : dword;



begin divideRec;


mov( EBX, iRegisterValue );


pop( iReturnAddress );

pop( temp);

//junk 

//this is denominator
pop( temp); 
mov(temp,BX); 
mov(BL, denominator); 

//this is numerator

pop(temp); 
mov(temp,BX); 
mov(BL, numerator); 

push(iReturnAddress); 
push(iRegisterValue); 



//subtask 


mov(0,DH); 

mov(numerator,AL); 
cmp(AL,denominator); 
jge recursiveCall; 

recursiveCall: 
mov(numerator,BL); 
sub(denominator,BL); 
mov(BL, numerator);
push(BX); 
push(temp); 
call divideRec; 
inc(DH); 



jmp ExitSequence; 

ExitSequence:
pop(EBX); 
ret(); 
end divideRec; 



begin prog1; 

stdout.put("Provide a numerator: "); 
stdin.get(n); 
stdout.put("Provide a denominator: "); 
stdin.get(d); 


//16-bits
//n
mov(0,BX); 
mov(n,BL);
push(BX); 
//d
mov(0,BX); 
mov(d,BL); 
push(BX); 


mov(0,BX); 
push(BX); 
call divideRec; 
stdout.put("divide( ",n,", ",d, ") = ");
stdout.puti8(DH); 


end prog1;

这是相应的c代码:



int main(){

int n, d;
printf("gimme a numerator:"); 
scanf("%d",&n); 
 printf("gimme a denominator:"); 
scanf("%d",&d); 
int result = divideRec(n,d); 
printf("the quotient is %d", result); 
return(0); 
}

int divideRec(int numerator, int denominator){

int result = 0; 
if(numerator>=denominator){
result = 1+(divideRec(numerator-denominator, denominator)); 

}
return(result); 

}




这个程序总是以零输出或什么也不输出。我相信堆栈对齐、推送和弹出有问题,我无法弄清楚。请提供一些帮助。

4

1 回答 1

0

环境

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

笔记

  • 有几种方法可以解决这个问题,这些例子可以改进。
  • 在学习和实践之外,递归过程可能不是这个问题的最佳解决方案。我推荐使用 idiv 的更简单的解决方案。

例子

  • 最小
program minimal;
#include("stdlib.hhf");

static
numerator : int8 := 0;
denominator : int8 := 0;

begin minimal; 
    stdout.put("Provide a numerator: "); 
    stdin.get(numerator); 
    stdout.put("Provide a denominator: "); 
    stdin.get(denominator); 

    mov(0, EAX);        // Clear numerator
    mov(numerator, AL); // Set numerator
    idiv(denominator);  // Divide AX by denominator
    stdout.put("divide(", numerator, ", ", denominator, ") = ");
    stdout.puti8(AL);   // Quotient is in AL
end minimal;
  • 程序
program function;
#include("stdlib.hhf");

static
numerator : int8 := 0;
denominator : int8 := 0;

procedure divide(numerator: int8; denominator: int8);
begin divide;
    mov(0, EAX);        // Clear numerator
    mov(numerator, AL); // Set numerator
    idiv(denominator);  // Divide AX by denominator
end divide; 

begin function; 
    stdout.put("Provide a numerator: "); 
    stdin.get(numerator); 
    stdout.put("Provide a denominator: "); 
    stdin.get(denominator); 

    mov(0, EBX); 
    mov(numerator, BL);
    push(EBX); 

    mov(0, EBX); 
    mov(denominator, BL); 
    push(EBX); 

    call divide; 
    stdout.put("divide(", numerator, ", ", denominator, ") = ");
    stdout.puti8(AL); // Quotient is in AL
end function;
  • 递归的
program recursive;
#include("stdlib.hhf");

static
numerator : int8 := 0;
denominator : int8 := 0;
value : int8 := 0;

procedure divideRec(numerator: int8; denominator : int8; value : int8);
begin divideRec;
    mov(0, EAX);
    mov(numerator, AL);
    cmp(AL, denominator);
    je ret_val_plus_1;
    jl ret_val;
    mov(0, EDX);
    sub(denominator, AL);
    cmp(AL, DL);
    jg recurse;
    jmp done;

    ret_val_plus_1:
        inc(value);
        jmp done;

    ret_val:
        jmp done;

    recurse:
        inc(value);

        mov(0, EBX); 
        mov(AL, BL);
        push(EBX); 

        mov(0, EBX); 
        mov(denominator, BL); 
        push(EBX); 

        mov(0, EBX); 
        mov(value, BL);
        push(EBX);

        call divideRec;
        mov(AL, value);
        jmp done;

    done:
        mov(0, EAX);
        mov(value, AL);
end divideRec; 

begin recursive; 
    stdout.put("Provide a numerator: "); 
    stdin.get(numerator); 
    stdout.put("Provide a denominator: "); 
    stdin.get(denominator); 

    mov(0, EBX); 
    mov(numerator,BL);
    push(EBX); 

    mov(0, EBX); 
    mov(denominator,BL); 
    push(EBX); 

    mov(0, EBX); 
    push(EBX);

    call divideRec;

    stdout.put("divide(", numerator, ", ", denominator, ") = ");
    stdout.puti8(AL); 
end recursive;
  • 错误处理
program error_handling;
#include("stdlib.hhf");

static
    numerator : int8 := 0;
    denominator : int8 := 0;

begin error_handling; 
    forever
        try
            stdout.put("Provide a numerator: "); 
            stdin.get(numerator);             
            stdout.put("Provide a denominator: "); 
            stdin.get(denominator); 

            xor(EAX, EAX);        // Clear numerator
            mov(numerator, AL);       // Set numerator
            idiv(denominator);  // Divide AX by denominator            
            stdout.put("divide(", numerator, ", ", denominator, ") = ");
            stdout.puti8(AL);

        unprotected
            break;

        exception(ex.ValueOutOfRange)
            stdout.put("Number entered is out of range: -128 to 127", nl);

        exception(ex.ConversionError)
            stdout.put("Input contained illegal characters.", nl);

        exception(ex.DivideError)
            stdout.put("Attempted illegal division: e.g. Divide by Zero", nl);

        anyexception
            stdout.put("An unknown error occurred with code: ", EAX, nl);

        endtry;
    endfor;
end error_handling;
于 2020-06-02T19:57:06.123 回答