ÀζóÀÎ ¾î¼Àºí¸® (inline assembly)
¾î¼Àºí¸®´Â ±â°è¾î¿¡ °¡Àå °¡±î¿î ÄÄÇ»ÅÍ ¾ð¾î¶ó°í ÇÕ´Ï´Ù. Visual C++ À̳ª µ¨ÆÄÀÌ, ºñÁÖ¾ó º£ÀÌÁ÷ °°Àº ¾ð¾î¿¡¼µµ ¾î¼Àºí¸® ¾ð¾î¸¦ °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. À̸¦ ÀζóÀÎ ¾î¼Àºí¸®¶ó°í ÇÏÁÒ.
ÄÄÇ»ÅÍ ³»ºÎ¿¡´Â º¯¼öó·³ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® °ø°£ÀÌ Àִµ¥, À̸¦ ·¹Áö½ºÅÍ(register) ¶ó°í ÇÕ´Ï´Ù. 16ºñÆ®ÀÇ ·¹Áö½ºÅÍ·Î AX, BX, CX, DX µîÀÇ ¹ü¿ë ·¹Áö½ºÅͰ¡ ÀÖ½À´Ï´Ù. À̸¦ È¿À²ÀûÀ¸·Î Ç¥½ÃÇϱâ À§ÇØ ÇÏÀ§ 8ºñÆ®¿Í »óÀ§ 8ºñÆ®·Î ³ª´©¾î »ç¿ëÇϱ⵵ ÇÕ´Ï´Ù.
AH, AL, BH, BLµîÀ¸·Î »óÀ§ 8ºñÆ®´Â H(High)·Î ÇÏÀ§ 8ºñÆ®´Â L(Low)·Î Ç¥½ÃÇϰí, 32ºñÆ®¿ëÀ¸·Î ¾Õ¿¡ E¸¦ ºÙ¿© EAX, EBX, ECX, EDX µîÀ¸·Î Ç¥½ÃÇϱ⵵ ÇÕ´Ï´Ù.
ÀζóÀÎ ¾î¼Àºí¸®¸¦ ÄÚµå¼Ó¿¡ Æ÷ÇÔ½Ã۱â À§Çؼ »ç¿ëÇÏ´Â ¿¹¾à¾î´Â °¢ ÄÄÆÄÀÏ·¯º°·Î Á¶±Ý¾¿ ´Ù¸£Áö¸¸, ºñÁÖ¾ó C++¿¡¼´Â "__asm"À̶ó´Â ¿¹¾à¾î¸¦ »ç¿ëÇÕ´Ï´Ù.
´ÙÀ½Àº ÀζóÀÎ ¾î¼Àºí¸®ÀÇ Á¶±×¸¸ ¿¹Á¦ÀÔ´Ï´Ù. C++¾ð¾î·Î Á¶±Ý¾¿ ÁÖ¼®À» ´Þ¾Æ³õ¾Ò½À´Ï´Ù. µû·Î ¼³¸íÀ» ÇØÁÙ ÇÊ¿ä´Â ¾ø°ÚÁÒ?
#include "stdio.h"
// EAX, EBX, ECX, EDX :
32 bit
// AX, BX, CX, DX :
16 bit
// AH, AL, BH, BL, CH, CL, DH, DL : 8 bit
void main()
{
int addvar, pointvar1=5, pointvar2;
int *p=&pointvar1;
int cur = 1;
int test1 = 1, test2 = 10;
printf("The Size of
(int)=%d Byte\n", sizeof(int));
printf("So, %d Bit\n\n",
sizeof(int)*8);
__asm // ´õÇϱ⠿¹Á¦
{
MOV
EAX, 10 //
EAX = 10
MOV
EBX, 20 //
EBX = 20
ADD
EAX, EBX // EAX
+= EBX
MOV
addvar, EAX // addvar = EAX
}
printf("ADD Test Result=%d\n",
addvar);
__asm // »©±â ¿¹Á¦
{
MOV
EAX, 10 // EAX =
10
MOV
EBX, 20 // EBX =
20
SUB
EAX, EBX // EAX += EBX
MOV
addvar, EAX // addvar = EAX
}
printf("SUB Test Result=%d\n",
addvar);
__asm // Æ÷ÀÎÅÍ »ç¿ë
¿¹Á¦
{
MOV
EAX, 10 // EAX =
10
MOV
EBX, p //
EBX = p
ADD
EAX, [EBX] // EAX += *EBX -> [EAX]´Â
EAXÀÇ ÁÖ¼Ò°¡ °¡¸£Å°´Â °ª
MOV
pointvar2, EAX // pointvar2 = EAX
}
printf("Pointer Test Result=%d\n",
pointvar2);
__asm // ºñ±³ºÐ±â ¿¹Á¦
{
CMP cur, 1 //
if(cur==1)
JE go1 //
goto go1
CMP cur, 2 //
if(cur==2)
JE go2 //
goto go2
go1:
MOV EAX, cur //
EAX = cur
ADD EAX, 100 //
EAX += 100
MOV cur, EAX //
cur = EAX
go2:
MOV EAX, cur //
EAX = cur
ADD EAX, 200 //
EAX += 200
MOV cur, EAX //
cur = EAX
}
printf("Compare Test Result=%d\n", cur);
__asm // Áõ°¡ ¿¹Á¦
{
MOV EAX, test1
// EAX = test1
INC EAX //
EAX++
MOV test2, EAX
// test2 = EAX
}
printf("test1=%d, Increased test1=%d\n", test1,
test2);
__asm // °¨¼Ò ¿¹Á¦
{
MOV EAX, test1
// EAX = test1
DEC EAX //
EAX--
MOV test2, EAX
// test2 = EAX
}
printf("test1=%d, decreased test1=%d\n", test1,
test2);
__asm // ġȯ ¿¹Á¦
{
MOV EAX, test1
// EAX = test1
MOV EBX, test2
// EBX = test2
XCHG EAX, EBX //
swap EAX, EBX
MOV test1, EAX
// test1 = EAX
MOV test2, EBX
// test2 = EBX
}
printf("After XCHG : test1=%d, test2=%d\n", test1,
test2);
}
- the end of this article -