0

Here is my errored hla program: it always print nothing... it should prompt user for two int8 integers and print the integer quotient after calling divideRec, increment the result with properly pushing and popping in stack aligns...cannot figure out where should I fix..

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;

here is the corresponding c code:



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); 

}




This program always ends up outputting with zeros or nothing. I believe there are something wrong with the stack align, pushes and pops that I can't figure out. please kindly offer some helps.

1 Answers1

0

ENVIRONMENT

  • HLA (High Level Assembler - HLABE back end, POLINK linker) Version 2.16 build 4413 (prototype)
  • Windows 10

NOTE

  • There are several ways to go about correcting this problem and these examples could be improved.
  • Outside of learning and practice a recursive procedure is probably not the optimal solution for this problem. I recommend a more minimal solution utilizing idiv.

EXAMPLES

  • Minimal
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;
  • Procedure
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;
  • Recursive
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;
  • Error Handling
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;
Kuma
  • 427
  • 5
  • 17