Linux Assembly Code


�۾��� : ��ȣ (i@flyduck.com)
�ֽ� ���� �ִ� �� : http://linux.flyduck.com/

v0.1.0 2000�� 3�� 28��


����


0. ����

�� ������ ���������� ����ϴ� ������� ������ ���ؼ� (Ư�� x86����) ������ ����� ���Դϴ�. GAS�� AT&T ���������� ������� �ڵ��� ���İ� �̰��� ���ڿ��� ����ϴ� ������ � ���̰� �ִ����� ��Ÿ���ϴ�. �� �κ��� ���ڿ��� ����ϴ� �������(Macro Assembler�� Turbo Assembler)�� �˰� �ִٸ� ���� ������ �� ���Դϴ�. Inline Assembly�� C �ڵ峻���� ������� �ڵ带 ����ϴ� ����� ���� ���Դϴ�. Ŀ�� �ڵ忡�� CPU�� �������� �κе��� ������ inline ������� �ڵ�� �ۼ��Ǿ� �ִµ�, �� ���Ŀ� ���� ������� �̸� �����ϴµ� ������ �Ǹ��� �����մϴ�. �� ���� x86 ������� �ڵ忡 ���� �⺻���� ������ �ִٰ� �����ϰ� �ֽ��ϴ�.

�� ������ 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� �ٶ��ϴ�.


1. GAS�� AT&T ����

GAS�� GNU Assembler�μ� GCC�� �Բ� ������ ���Ǵ� Assembler�̴�. �̴� 32-bit UNIX Compiler�� ���� ����������Ƿ�, UNIX���� �Ϲ������� ���Ǵ� AT&T ������ ������. �� ������ Intel���� ����ϴ� �������� ���� �ٸ���. �̸� ���غ��� :


2. Inline Assembly

inline assembly�� high-level ���� �� �ڵ� �߰��� �־ ����ϴ� ������� �ڵ��, �װ��� �׸����� �����Ǹ�, ������ ���� �������� ����Ѵ�.

__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 �������Ͱ� ����ǰ� �ǹǷ�, �������� ����� �������� ��Ͽ� �� ������ �������־���.


3. Reference