2012-01-14 3 views
1

내 asm 프로젝트에서 C 함수를 호출하는 중입니다.nasm x86-64에서 c 함수 호출

정수 값을 c 함수로 푸시하려고합니다.

내 코드

mov rdi, [input] 
push rdi     ;push rdi into stack for c function to work with 
call dtoch 
pop rdi     ;to keep stack balanced 

은 ' 나는 잘못된 레지스터에 입력을 이동 무엇입니까?

리눅스 우분투 OS에서 실행 중이며 오류가 발생하지 않고 올바른 값을 출력하지 않습니다.

C environement에서이 기능을 실행하면 제대로 작동하지만 내 nasm 프로젝트에서 잘못된 번호가 인쇄됩니다 ....?

C 기능 :

void dtoch(int d) 
{ 
int n , r[10], i = 0, number, j = 0; 
while (number > 0) 
{ 
r[i] = number%16; 
number = number/16; 
i++; 
j++; 
} 
printf ("It's hexadecimal equivalent is: "); 
for (i = j -1; i > = 0; i--) 
{ 
if (r[i] == 10) 
printf("A"); 
else if (r[i] == 11) 
printf("B"); 
else if (r[i] == 12) 
printf("C"); 
else if (r[i] == 13) 
printf("D"); 
else if (r[i] == 14) 
printf("E"); 
else if (r[i] == 15) 
printf("F"); 
else 
printf("%d", r[i]); 
} 

} 
+0

호출 된 함수는 인수를 스택으로 푸시하기 위해 사용하는 레지스터를 신경 쓰지 않습니다. C func의 호출 규칙은 무엇입니까? 오류가 있습니까? 더 많은 정보를 제공해야합니다. –

+0

어떤 운영 체제입니까? – zvrba

+0

C 함수 원형을 보여줍니다. –

답변

1

64 리눅스를 들어, AMD64 ABI는 (this를 참조 Agner 안개의 optimization manuals의 차이 또는이 좋은 여름 테이블 on wikipedia에 대한 (창에 참조, 사용, __fastcall를 사용 Microsoft ABI)). 리눅스에서 실행 예를 들어

, 당신은 PUSH의 (그리고 쌍 POP 년대가)을 필요하지 않습니다, RDI에서 그것을 원한다. 전체 AMD64 ABI here을 검토 할 수 있습니다. 단 하나의 arg가 RCX에 들어가기를 원하는 Windows의 경우 약간의 코딩이 필요합니다 (다시 말하면 PUSH이 필요합니다).

간단한 팁 : 어셈블리 출력으로 c 호출을 컴파일하고 컴파일러에서 생성 된 코드를 볼 수 있습니다. GCC의 -Wa,-adhln -g 옵션을 사용해야합니다.

+0

푸시와 팝을 제거하려고했는데 숫자도 함수를 "숫자"변수로 바꾸지 만, 매 실행 시마다 2라는 일반적인 수를 제공합니다. – user1050632