À̵¿: Home à mips0201

 

ÁÖ¼Ò: http://www.kernel.bz/mips/02/mips0201.htm

ÀÌÆäÀÌÁöÀÇ ÀúÀÛ±ÇÀº

Á¦¸ñ: C¾ð¾î¿¡¼­ ÀζóÀÎ ¾î¼Àºí¸® »ç¿ë¹ý

ÀúÀÚ¿¡°Ô ÀÖ½À´Ï´Ù

ÀúÀÚ: Á¤ÀçÁØ(rgbi3307@nate.com)

ÃÖ±Ù¼öÁ¤ÀÏ:2009-01-18

 

 

 

 

 

C¾ð¾î¿¡¼­ inline assembly »ç¿ëÇϱâ

 

inlineÀº ÇÔ¼ö È£ÃâÀ» ÅëÇÏ¿© ÄÚµå È帧À» Á¦¾îÇÏÁö ¾Ê°í, ÇÔ¼ö ³»ºÎ¿¡ ÄÚµåÀ» »ðÀÔÇϹǷÎ

ÇÔ¼ö È£Ãâ·Î ÀÎÇÑ ºÎÇϸ¦ ÁÙÀÏ ¼ö ÀÖÀ¸¸ç, "inline function"À̶ó°íµµ ÇÑ´Ù.

 

inline assembly¶ó ÇÔÀº ¾î¼Àºí¸® ¸í·ÉµéÀ» inline ÇÔ¼ö·Î ÀÛ¼ºÇÏ´Â °ÍÀÌ´Ù.

ÀζóÀÎ ¾î¼Àºí¸®´Â ½ÇÇà¼Óµµ Çâ»óÀ» À§Çؼ­ »ç¿ëÇϸç, ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö¿¡¼­ ÀÚÁÖ »ç¿ëµÈ´Ù.

 

C¾ð¾î¿¡¼­ asm Ű¿öµå¸¦ »ç¿ëÇÏ¿© ¾î¼Àºí¸® ¸í·É¾î¸¦ ÄÚµùÇÑ´Ù.  C¾ð¾î¿Í ¾î¼Àºí¸® ¸í·É¾î¸¦

È¥ÇÕÇÒ ¼ö ÀÖÀ¸¹Ç·Î, ºü¸¥ ½ÇÇà󸮴 ¾î¼Àºí¸®·Î ¼öÇàÇϰí, °á°ú µ¥ÀÌÅÍ´Â C¾ð¾îÀÇ º¯¼öµé·Î

È®ÀÎ °¡´ÉÇÑ ÀåÁ¡ÀÌ ÀÖ´Ù.

 

 

GCC ÀζóÀÎ ¾î¼Àºí¸® ¹®¹ý

 

¾î¼Àºí¸® ¾ð¾î´Â 2°¡Áö À¯ÇüÀÌ Àִµ¥, ÀÎÅÚ Çü½Ä°ú AT&T Çü½ÄÀÌ´Ù.

GNU C ÄÄÆÄÀÏ·¯ Áï, GCC´Â AT&T ¹®¹ýÀÌ¸ç ¿ì¸®´Â À̰ÍÀ» »ç¿ëÇϱâ·Î ÇÑ´Ù.

 

 

ÀζóÀÎ ¾î¼Àºí¸® ÄÚµå´Â ¾Æ·¡¿Í °°ÀÌ 2°¡Áö Çü½ÄÀÌ´Ù.

 

asm ("assembly code");

 

__asm__ ("assembly code");

 

 

ÀζóÀÎ ¾î¼Àºí¸® ¸Å°³º¯¼ö

 

asm ( "assembly code"

           : output operands                  /* Ãâ·Âº¯¼ö */

           : input operands                   /* ÀԷº¯¼ö */

           : list of clobbered registers      /* º¯°æµÇ´Â ·¹Áö½ºÅÍ */

);

 

·¹Áö½ºÅÍ Á¦¾àÁ¶°Ç

+---+--------------------+

| r |    Register(s)     |

+---+--------------------+

| a |   %eax, %ax, %al   |

| b |   %ebx, %bx, %bl   |

| c |   %ecx, %cx, %cl   |

| d |   %edx, %dx, %dl   |

| S |   %esi, %si        |

| D |   %edi, %di        |

+---+--------------------+

 

 

asm ("movl %eax, %0;" : "=r" ( val ));

 

"=r"´Â valÀÌ Ãâ·Â º¯¼ö¶ó´Â ÀǹÌÀ̰í, eax ·¹Áö½ºÅÍÀÇ °ªÀÌ º¯¼ö val¿¡ ÇÒ´çµÈ´Ù.

 

 

    int no = 100, val ;

 

        asm ("movl %1, %%ebx;"

             "movl %%ebx, %0;"

             : "=r" ( val )        /* output */

             : "r" ( no )         /* input */

             : "%ebx"         /* clobbered register */

         );

 

(¿¹Á¦1)

 

#include <stdio.h>

 

int main() {

 

    int arg1, arg2, add, sub, mul, quo, rem ;

 

    printf( "Enter two integer numbers : " );

    scanf( "%d%d", &arg1, &arg2 );

 

    /* 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;" : "=a" (quo), "=d" (rem) : "g" (arg1), "g" (arg2) );

 

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

 

    return 0 ;

}

 

(¿¹Á¦2)

asm volatile () ¸ÞÀÎÇÔ¼ö°¡ ¾Æ´Ñ ¼­ºêÇÔ¼ö¿¡¼­ »ç¿ë

 

#include <stdio.h>

 

float sinx( float degree ) {

    float result, two_right_angles = 180.0f ;

    /* Convert angle from degrees to radians and then calculate sin value */

    __asm__ __volatile__ ( "fld %1;"

                            "fld %2;"

                            "fldpi;"

                            "fmul;"

                            "fdiv;"

                            "fsin;"

                            "fstp %0;" : "=g" (result) : "g"(two_right_angles), "g" (degree)

    ) ;

    return result ;

}

 

float cosx( float degree ) {

    float result, two_right_angles = 180.0f, radians ;

    /* Convert angle from degrees to radians and then calculate cos value */

    __asm__ __volatile__ ( "fld %1;"

                            "fld %2;"

                            "fldpi;"

                            "fmul;"

                            "fdiv;"

                            "fstp %0;" : "=g" (radians) : "g"(two_right_angles), "g" (degree)

    ) ;

    __asm__ __volatile__ ( "fld %1;"

                            "fcos;"

                            "fstp %0;" : "=g" (result) : "g" (radians)

    ) ;

    return result ;

}

 

float square_root( float val ) {

    float result ;

    __asm__ __volatile__ ( "fld %1;"

                            "fsqrt;"

                            "fstp %0;" : "=g" (result) : "g" (val)

    ) ;

    return result ;

}

 

int main() {

    float theta ;

    printf( "Enter theta in degrees : " ) ;

    scanf( "%f", &theta ) ;

 

    printf( "sinx(%f) = %f\n", theta, sinx( theta ) );

    printf( "cosx(%f) = %f\n", theta, cosx( theta ) );

    printf( "square_root(%f) = %f\n", theta, square_root( theta ) ) ;

 

    return 0 ;

}

 

 

 

 

 

 

 

À̵¿: Home à mips0201

 

ÁÖ¼Ò: http://www.kernel.bz/mips/02/mips0201.htm

ÀÌÆäÀÌÁöÀÇ ÀúÀÛ±ÇÀº

Á¦¸ñ: C¾ð¾î¿¡¼­ ÀζóÀÎ ¾î¼Àºí¸® »ç¿ë¹ý

ÀúÀÚ¿¡°Ô ÀÖ½À´Ï´Ù

ÀúÀÚ: Á¤ÀçÁØ(rgbi3307@nate.com)

ÃÖ±Ù¼öÁ¤ÀÏ:2009-01-18