The greatest common divisor GCD of two integers is the large

The greatest common divisor (GCD) of two integers is the largest integer that will evenly divide
both integers. The GCD algorithm involves integer division in a loop, described by the following
pseudocode:
int GCD(int x, int y)
{
     x = abs(x)   // absolute value
     y = abs(y)
     do {
               int n = x % y
               x = y
               y = n
               } while (y > 0)
     return x
}
Implement this function in assembly language and write a test program that calls the function
several times, passing it different values. Display all results on the screen.

I have this codes but it doesn\'t work.

INCLUDE Irvine32.inc

.data
array SDWORD -5,-20,18,24,11,7,438,226,13,-26
str1 BYTE \"Greatest common divisor is: \",0

.code
main PROC

   mov ecx,LENGTHOF array / 2
   mov esi,OFFSET array

L1:   mov eax,[esi]
   mov ebx,[esi+4]
   call CalcGcd
   mov edx,OFFSET str1
   call WriteString
   call WriteDec
   call Crlf
   add esi,TYPE array * 2
   loop L1

   exit
main ENDP

CalcGcd PROC

   push ebx
   push edx

   .IF SDWORD PTR eax < 0
   neg eax
   .ENDIF

   .IF SDWORD PTR ebx < 0
   neg ebx
   .ENDIF

L1:   mov edx,0
   div ebx
   cmp edx,0
   je L2   ; yes: quit
   mov eax,ebx
   mov ebx,edx
   jmp L1

L2:   mov eax,ebx

   pop edx
   pop ebx
   ret
CalcGcd ENDP

END main

Solution

hope this is usefull


INCLUDE Irvine32.inc
.data
array SDWORD -5,-20,18,24,11,7,438,226,13,-26
str1 BYTE \"Greatest common divisor is: \",0
.code
main PROC
mov ecx,LENGTHOF array / 2
mov esi,OFFSET array
L1: mov eax,[esi]
mov ebx,[esi+4]
call CalcGcd
mov edx,OFFSET str1
call WriteString
call WriteDec
call Crlf
add esi,TYPE array * 2
loop L1
exit
main ENDP

push ebx
push edx
.IF SDWORD PTR eax < 0 ; force a signed comparison
neg eax ; EAX = abs(EAX)
.ENDIF
.IF SDWORD PTR ebx < 0
neg ebx ; EBX = abs(EBX)
.ENDIF
L1: mov edx,0
div ebx ; divide int1 by int2
cmp edx,0 ; remainder = 0?
je L2 ; yes: quit
mov eax,ebx ; no: prepare for
mov ebx,edx ; next iteration
jmp L1
L2: mov eax,ebx ; EAX = GCD
pop edx
pop ebx
ret
CalcGcd ENDP
END main

The greatest common divisor (GCD) of two integers is the largest integer that will evenly divide both integers. The GCD algorithm involves integer division in a
The greatest common divisor (GCD) of two integers is the largest integer that will evenly divide both integers. The GCD algorithm involves integer division in a

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site