2013-05-19 2 views
1

C와 어셈블리 코드를 연결하는 데 문제가 있습니다. 일부 솔루션을 검색하려고했지만 아무 것도 발견하지 못했습니다.어셈블리와 C를 연결할 수 없습니다

C 파일 는 "l3.c는"은 다음과 같습니다

#include <stdio.h> 
#include <stdlib.h> 

const int INP_SIZE = 100; 

extern int mult(int c1, int c2); 

int main() 
{ 
    char number[INP_SIZE]; 

    scanf("%s",number); 
    printf("You typed: %s \n",number); 

    int j=2; 
    int k=5; 
    j = mult(j,k); #here is the problem 
    printf("%d",j); 

    scanf("%s",number); 
    return 0; 
} 

이 같은 asembly "mult.s"

내 메이크에서
.type mult, @function 
mult: 
push %rbp 
mov %rsp, %rbp 
mov 8(%rbp), %rbx 
mov 12(%rbp), %rcx 

mov $0, %rax 
add %rbx, %rax; 
add %rcx, %rax; 

mov %rbp, %rsp 
pop %rbp 
ret 

난 다음있어 라인 (대부분의 최근 솔루션 내가 봤 거든) :

l3: 
    as -g -o mult.o mult.s 
    gcc -o l3.o -c l3.c 
    gcc l3.o mult.o 

콘솔에 입력하면 그것은 던지고있다 : undefined reference to 'mult' 내가 //j = mult(j,k); 프로그램에 문제가 있다고 대답 할 때. 어떻게 연결해야합니까?

답변

3

심볼로 mult을 내보내려고하지 않아서 링커에서 나중에 찾을 수없는 것 같습니다. 올바르게 수행하는 방법은 사용중인 어셈블러에 따라 다릅니다. AT & T 문법을 사용하고 있으므로 GNU를 추측 할 것입니다.이 경우 어셈블리 파일의 맨 위에 .global mult을 추가하면됩니다.

+0

근무했습니다. 감사합니다. 그리고 네, GNU를 사용하여 – Kmaczek

+0

으로 도움이되어 주셔서 감사합니다. 함수가 "mult"라고 불리는 것은 좀 이상하지만 스택에서 두 개의 값을 더하는 것처럼 보입니다. 그들은 어떻게 거기에 도착합니까? –

+0

예, sth와 같이 추가해야합니다. 이 배후에 길고 흥미로운 이야기가 있습니다.이 가치가 어떻게 존재 하는지를 의미합니까? Heh, 나는 단지 어셈블리에 들어가는 방법을 알아 내려고하고있다. – Kmaczek