#include <stdio.h>

int float_stuff(void);

int gcd( int a, int b ) {
    int result ;
    /* Compute Greatest Common Divisor using Euclid's Algorithm */
    __asm__ __volatile__ ( "movl %1, %%eax;"
                          "movl %2, %%ebx;"
                          "CONTD: cmpl $0, %%ebx;"
                          "je DONE;"
                          "xorl %%edx, %%edx;"
                          "idivl %%ebx;"
                          "movl %%ebx, %%eax;"
                          "movl %%edx, %%ebx;"
                          "jmp CONTD;"
                          "DONE: movl %%eax, %0;" : "=g" (result) : "g" (a), "g" (b)
    );

    return result ;
}



int main() {

    int arg1, arg2, add, sub, mul, quo, rem, compare ;
	int first, second;

    //printf( "Enter two integer numbers : " );
    //scanf( "%d%d", &arg1, &arg2 );

	arg1 = 400;
	arg2 = 33;
        compare = 22;

    /* Perform Addition, Subtraction, Multiplication & Division */
    __asm__ ( "addl %%ebx, %%eax;" : "=a" (add) : "a" (arg1) , "b" (arg2) );
    __asm__ ( "subl %%ebx, %%eax;" : "=a" (sub) : "a" (arg1) , "b" (arg2) );
    __asm__ ( "imull %%ebx, %%eax;" : "=a" (mul) : "a" (arg1) , "b" (arg2) );


    __asm__ ( "movl $0x0, %%edx;"
              "movl %2, %%eax;"
              "movl %3, %%ebx;"
               "idivl %%ebx;" : "=r" (quo), "=r" (rem) : "g" (arg1), "g" (arg2) );

/*
    __asm__ ( "movl %%eax, %1;"
              "cmp %%eax, %2;"
              "jne EQUAL;"
               "EQUAL: movl %0, %%eax;" : "=a" (compare) : "a" (arg1) , "b" (arg2) );
*/


__asm__ ( "cmpl $0x0, %%eax;" : "=a" (compare) : "a" (arg2) );
printf("compare: %d\n", compare);

__asm__ ( "cmpl $0x0, %%eax;" : "=r" (compare) : "r" (arg2) );
printf("compare: %d\n", compare);

__asm__ ( "cmpl $0x0, %%eax;" : "=b" (compare) : "b" (arg2) );
printf("compare: %d\n", compare);

__asm__ ( "cmpl $0x0, %%eax;" : "=g" (compare) : "a" (arg2) );
printf("compare: %d\n", compare);

__asm__ ( "cmpl $0x0, %%eax;" : "=g" (compare) : "g" (arg2) );
printf("compare: %d\n", compare);

__asm__ ( "cmpl $0x0, %%eax;" : "=g" (compare) : "g" (arg2) );
printf("compare: %d\n", compare);

__asm__ ("movl %%eax, %1;" 
         "cmpl $0, %%eax;" : "=g" (compare) : "a" (arg1), "g" (arg2) );
printf("compare: %d\n", compare);






/*
"movl %%ebx, %%eax;"
               "mov %%ecx, $5;" : "=a" (compare) : "a" (arg1) , "b" (arg2) );


                mov     ax, a
                cmp     ax, b
                jne     ElseBlk
                mov     ax, d
                mov     c, ax
                jmp     EndOfIf
              
ElseBlk:
                inc     b
EndOfIf:

*/


    printf( "%d + %d = %d\n", arg1, arg2, add );
    printf( "%d - %d = %d\n", arg1, arg2, sub );
    printf( "%d * %d = %d\n", arg1, arg2, mul );
    printf( "%d / %d = %d\n", arg1, arg2, quo );
    printf( "%d %% %d = %d\n", arg1, arg2, rem );

//	printf("compare: %d\n", compare);

	first = 8482;
	second = 9124112;
	printf( "GCD of %d & %d is %d\n", first, second, gcd(first, second) ) ;
	//float_stuff();

    return 0 ;
}


int float_stuff(void){
    float arg1, arg2, add, sub, mul, div ;

    printf( "Enter two numbers : " );
    //scanf( "%f%f", &arg1, &arg2 );

	div = 4;
	arg1 = 55;
	arg2 = 55;

    /* Perform floating point Addition, Subtraction, Multiplication & Division */
    __asm__ ( "fld %1;"
              "fld %2;"
              "fadd;"
              "fstp %0;" : "=g" (add) : "g" (arg1), "g" (arg2) ) ;

    __asm__ ( "fld %2;"
              "fld %1;"
              "fsub;"
              "fstp %0;" : "=g" (sub) : "g" (arg1), "g" (arg2) ) ;

    __asm__ ( "fld %1;"
              "fld %2;"
              "fmul;"
              "fstp %0;" : "=g" (mul) : "g" (arg1), "g" (arg2) ) ;
/*
    __asm__ ( "fld %2;"
              "fld %1;"
              "fdiv;"
              "fstp %0;" : "=g" (div) : "g" (arg1), "g" (arg2) ) ;


	__asm__ ( "cmp %1, %2;"
                  "fstp %0, 5;" : "=g" (div) : "g" (arg1) , "g" (arg2)) ;




                mov     ax, a
                cmp     ax, b
                jne     ElseBlk
                mov     ax, d
                mov     c, ax
                jmp     EndOfIf 

ElseBlk:
                inc     b 
EndOfIf: 


                mov     ax, A 
                cmp     ax, B 
                jne     DoStmt 
                mov     ax, X 
                cmp     ax, Y 
                jnl     SkipStmt 
                mov     ax, Z 
                cmp     ax, T 
                jng     SkipStmt 
DoStmt: 
        <Place code for Stmt1 here>

SkipStmt:

*/

    printf( "%f + %f = %f\n", arg1, arg2, add );
    printf( "%f - %f = %f\n", arg1, arg2, sub );
    printf( "%f * %f = %f\n", arg1, arg2, mul );
    printf( "%f / %f = %f\n", arg1, arg2, div );

    return 0 ;
}
