�� ������ Linux Assembly HOWTO ������ Brennen's Guide to Inline Assembly, DJGPP QuickASM Programming Guide, GCC Manual, GAS Manual�� �ִ� ������ ��� ������ ���Դϴ�. �״�� ����� �ڵ�鵵 ���Ƽ� � �鿡���� �����ߴٱ� ���ٴ� �׳� �Ű�ٰ� �ص� ������ �� �մϴ� (^^;). ���⼭ �ٷ�� ����ܿ� �� �ڼ��� ���� �ٶ��ٸ� ������ �� Reference�� ������ �������� ���ñ� �ٶ��ϴ�. Ư�� x86 Assembly Language FAQ ������ ��������� ���ؼ� ���� �п��Ե� ū ������ �� ���Դϴ�. ���� CPU ���ɾ ���ؼ��� �� CPU ����ȸ�翡�� �����ϴ� �Ŵ����� �����Ͻñ� �ٶ��ϴ�. �� �������� �����Ͻô� �в� ������ �DZ� �ٶ��ϴ�.
AT&T : %eax
Intel : eax
������ Intel 80386���� ������ ���� �������Ͱ� �ִ� :
AT&T : movl %eax, %ebx
Intel : mov ebx, eax
AT&T : movw foo, %ax
Intel : mov ax, word ptr foo
AT&T�� Intel���� ����ϴ� ���ɾ���� ��κ� ��������� ��� �ٸ��� �ִ�. sign extend ���ɾ�� zero extend ���ɾ�� �ణ�� ���̸� ���̴µ�, AT&T ���������� �̷��� extend ���ɾ ������ ũ��� Ȯ���� ũ�⸦ �����ϰ� �Ѵ� :
movsSD (sign extend, Intel������ movsx)
movzSD (zero extend, Intel������ movzx)
���⼭ S�� ������ ũ�� D�� �����ϴ� ũ���̴�. ���� ��� ax�� ecx�� sign extend�� �Ѵٸ� :
AT&T : movswl %ax, %ecx
Intel : movsx ecx, ax
���� ��� ��ȯ�Լ����� ���̰� �ִ� :
cbtw (sign extend byte (%al) to word (%ax), Intel������ cbw)
cwtl (sign extend word (%ax) to long (%eax), Intel������ cwde)
cwtd (sign extend word (%ax) to long (%dx:%ax), Intel������ cwd)
cltd (sign extend dword (%eax) to quad (%edx:%eax), Intel������ cdq)
AT&T : movl $foo, %eax
Intel : mov eax, foo
foo�� ���� eax �������ͷ� �����ϴ� ���� :
AT&T : movl foo, %eax
Intel : mov eax, [foo]
���� 0xd00d�� eax �������ͷ� �����ϴ� ���� :
AT&T : movl $0xd00d, %eax
Intel : mov eax, 0d000h
AT&T : section:immed32(base, index, scale)
Intel : sectioin:[base + index * scale + immed32]
�̴� base + index * scale + immed32 �ּҸ� ��Ÿ���� �ȴ�. �̵� ��θ� �ݵ�� �����ؾ� �ϴ� ���� �ƴ����� immed32�� base ���� �ϳ��� �ݵ�� �����ؾ� �Ѵ�. �ּ� ������ ���� ����. eax �������Ͱ� ����Ű�� �ּ��� ���� �����ϴ� ��� :
AT&T : (%eax)
Intel : [eax]
�������Ϳ� ����(var)�� �ɼ��� ���� �ּҸ� �����ϴ� ��� :
AT&T : var(%eax)
Intel : [eax + var]
4����Ʈ ������ �� ���� �迭(int array[])�� eax��° ���� �����ϴ� ��� (int array[eax]) :
AT&T : array(, %eax, 4)
Intel : [eax * 4 + array]
�� �迭���� ebx �ε������� �����Ͽ� eax��° ���� �����ϴ� ��� (int array[ebx + eax]) :
AT&T : array(%ebx, %eax, 4)
Intel : [ebx + eax * 4 + array]
AT&T : ljmp/lcall $section, $offset
Intel : jmp/call far section:offset
far retrun�� ��� :
AT&T : lret $stack-adjust
Intel : ret far stack-adjust
__asm__(������� ���� : ��� : �Է� : ����� ��������);
�� ���� �ݷ�(':')���� ���еǸ�, ������� ������ �ݵ�� ���� ������, ���� �� ���� �ʿ信 ���� �ְų� ������ �� �ִ�. �� ���� ������ ���� �ǹ̸� ������.
__asm__ ("pushl %eax\n" "movl $1, %eax\n " "popl %eax" );
�� �ڵ�� eax �������� �����ϰ� ��� 1�� �Է��ߴٰ� eax �������� ������ ������ �����ϴ� �ڵ��̴�. ���⼭�� �ƹ��� �Է��̳� ����� ������, ����Ǵ� �������͵� �����Ƿ� ������� �ڵ常 �����Ѵ�. ���� i��� ������ �ϳ� ������Ű�� �ڵ带 ������.
int i = 0; __asm__ ("pushl %%eax\n" "movl %0, %%eax\n" "addl $1, %%eax\n" "movl %%eax, %0\n" "popl %%eax" : /* no output variable */ : "g" (i) );
�켱 �� �ڵ忡�� ��� �������� �տ� %�� �ΰ��� �پ��ִµ�, �Է��̳� ���, ����� �������� ���� �ϳ��� ����� �ϴ� ���, �������� �̸����� %�� �ϳ��� �ƴ϶� �ΰ��� �ٿ��� �Ѵ�. �̴� ���ο��� %0, %1 �ϴ� ���� ��ȣ�� ���Ǵµ� �̰Ͱ� ȥ���Ǵ� ���� ���� ���ؼ��̴�. �� �ڵ忡���� ����� �����Ƿ� ����� ��� �ξ���. �Է¿��� "g"(i)��� ���� �ִµ�, �̴� i��� ������ %0�� ��������ִ� ������ �Ѵ�. �� �ڵ峻���� %0�� ���� i�� ���� �ǹ̷� ���ȴ�. ����ǥ �ȿ� �ִ� ���� ������ ����� ����Ǵ����� ���ϴµ� g�� �̰�� �����Ϸ��� �˾Ƽ� �������Ϳ� �ִ��� �� �δ��� �϶�� �����ϴ� ���̴�. ����ǥ �ȿ��� ������ ���� ���� ������ �� �ִ�.
a eax b ebx c ecx d edx S esi D edi I ��� (0���� 31) ("I"��� ����ϴ°� �ƴ϶� "0" ó�� ���ڸ� �־ ���) q eax, ebx, ecx, edx �� �������� �Ҵ�� �������� r eax, ebx, ecx, edx, esi, edi �� �������� �Ҵ�� �������� g eax, ebx, ecx, edx �Ǵ� �� �ִ� ����. �����Ϸ��� ���� A eax �� edx�� ������ 64-bit ����
%0�� �Է¿��� ������ ������ ����Ų��. �� ���⼭�� i��� ������ ����Ű�� �ȴ�. �Է¿��� �������� ����ϸ�, ����� ������� ���ʷ� %0, %1, ... �� �̸��� ���� �ȴ�.
int x = 1, x_times_5; __asm__ ("leal (%1, %1, 4), %0" : "=r" (x_times_5) : "r" (x) );
�� �ڵ�� x��� ������ �ټ��� ���Ͽ� x_times_5�� �����Ѵ�. ((%1, %1, 4) = %1 + %1 * 4 = %1 * 5, lea�� �ּҸ� �����϶�� �����̹Ƿ� %0�� %1�� �ټ����� ���� ���� �ȴ�). ���⼭�� ����� �����ؾ� �ϹǷ� ��¿� "=r"(x_times_5)��� ��µǴ� ������ �����Ͽ���. ����ǥ�ȿ� =�� ���� ���� ������� ��Ÿ���� ���ؼ��̴�. �� �ڵ带 ���� �����Ͽ� x�� �ټ��� ���Ͽ� x�� �� ���� �ִ´ٸ� :
__asm__ ("leal (%1,%1,4), %0" : "=r" (x) : "0" (x) );
���⼭ �Է¿� "0"�̶�� ���ڷ� ��µ�, �̴� �տ��� ������ ���� �ٽ� ����Ű�� ����̴�. ������ ���� ��� "=r"�� %0, �Է� "0"�� %1�� �Ǵµ�, �� ���� ���� ���� ����Ű�� �ϰ� ���� ��� "0"�̶�� �Ͽ� %0�� ���� ���̶�� �������ִ� ���̴�. �� ���⼭ %1�� %0�� ���� ���� �ȴ�. �� ���� �� �ڵ�� x�� �ټ��踦 ���Ͽ� ����� �ڱ� �ڽſ��� �����ְ� �ȴ�. ������� ���� �ϴ� ���� k = i + j�� ���� ��� :
int i = 1, j = 2, k; __asm__ __volatile__ ("pushl %%eax\n" "movl %1, %%eax\n" "addl %2, %%eax\n" "movl %%eax, %0\n" "popl %%eax" : "=g" (k) : "g" (i), "g" (j) );
������ ���� k = %0, i = %1, j = %2�� �ǰ�, %1 + %2�� %0�� �����Ͽ� k = i + j ���� ���� �ȴ�. ���⼭ __asm__ ������ __volatile__�� �ִµ�, �̴� �� �ڵ带 ������ ��ġ�� �״�� �ζ�� ���̴�. �����Ϸ��� ����ȭ(optimization)�� �ϴ� �������� �ڵ��� ��ġ�� �ű� �� �ִµ� �̸� ���� ���̴�.
#define rep_movsl(src, dest, numwords) \ __asm__ __volatile__ ( \ "cld\n" \ "rep\n" \ "movsl" \ : \ : "S" (src), "D" (dest), "c" (numwords) \ : "%ecx", "%esi", "%edi" \ );
�� �ڵ�� src���� dest�� ������ ���̸�ŭ �����ϴ� ���̴�. �� �ڵ带 �����ϸ� edx, esi, edi �������Ͱ� ����ǰ� �ǹǷ�, �������� ����� �������� ��Ͽ� �� ������ �������־���.