|
|
||
|
ÀÌÆäÀÌÁöÀÇ ÀúÀÛ±ÇÀº |
||
|
Á¦¸ñ: 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 | | 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 ; |
|
|
|
|
|
|
||
|
ÀÌÆäÀÌÁöÀÇ ÀúÀÛ±ÇÀº |
||
|
Á¦¸ñ: C¾ð¾î¿¡¼ ÀζóÀÎ ¾î¼Àºí¸® »ç¿ë¹ý |
ÀúÀÚ¿¡°Ô ÀÖ½À´Ï´Ù |
|
|
ÀúÀÚ: Á¤ÀçÁØ(rgbi3307@nate.com) |
ÃÖ±Ù¼öÁ¤ÀÏ:2009-01-18 |