[Delphi] Delphi 에서 assembly 사용하기.

Delphi 에서는 assembly 어를 사용할 수 있다. 다음과 같이 사용하면 된다.

function Add_asm(A, B: Integer): Integer;
asm  
  add eax, edx
end;



왼쪽에서 첫번째 인자인 A 는 eax 를 통해 넘어오고, 두번째 인자인 B 는 edx 를 통해 넘어온다. 세번째 인자가 있다면 ecx 로 넘어올 것이다. Delphi 는 기본적으로 fastcall 방식으로 함수를 호출하므로 오른쪽에서부터 2개의 인자를 각각 ecx, edx 로 넘겨준다고 알려져 있다. 그런데 실제로 해보면 왼쪽을 기준으로 eax, edx, ecx 순으로 인자를 넘겨준다. Delphi 에서의 assembly 사용에 대해서는 자료가 별로 없어서 이런것을 구체적으로 알아내기가 어렵다. 사실, 위와 같은 내용도 Graphics32 소스를 분석해 보면서 알게 된 것이다. function 이므로 Result 가 있어야 한다. Result 값은 eax 를 통해서 반환한다. 그러므로 위의 소스를 분석해 보면

(1) A 값은 eax 를 통해서 넘어온다.
(2) B 값은 edx 를 통해서 넘어온다.
(3) 결과값(Result)은 eax 를 통해서 반환한다. 함수 호출시 넘겨받은 A 와 B를 더해서 (A+B), eax 에 저장한다.

한편, assembly 명령어를 사용하지 않고 직접 기계어를 넣어주는 방법도 사용할 수 있다.

function Add_asm(A, B: Integer): Integer;
asm  
  db $01, $D0  //add eax, edx
end;



add eax, edx 는 기계어로는 01 D0 이다. 따라서 1 byte 를 정의 (define byte) 하는 명령어인 db 를 이용하여 기계어를 직접 입력해 주어도 같은 효과가 있다. 이렇게 까지 해야 할 필요가 있나 생각할 수 있지만, Delphi 버전에 따라서 지원해주지 못하는 명령어가 있다. MMX 명령어의 경우는 Delphi 6 부터 지원하기 때문에 Delphi 5 에서는 사용할 수 없다. 따라서 Delphi 5 에서도 MMX 명령어를 사용할 수 있으려면 db 명령어를 사용하여 기계어를 직접 입력해야 한다.