예를 들어 gcc를 gcc로 가져 오면 언어 자체가 함수를 정적으로 선언하면 다른 .c 파일에서는 사용할 수 없음을 알 수 있습니다. gnu 어셈블러와 어셈블리 언어는 전역 언어로 선언되지 않은 한 어셈블러에서 정의한 언어 표준이 아니며 지역 레이블입니다.
hello:
.globl there
there:
우리는 hello에 연결할 수 없지만 거기에 연결할 수 있습니다.
그러면 호출 규칙을 알아야합니다. 호출 규칙을보고 읽거나 실험을 통해 파악할 수 있습니다. 비록 당신이 읽고있는 컴파일러가 여전히 읽고 있어야하는 컴파일러를 준수하는지 확인하기 위해 그것을 읽었을지라도, 사용하고있는 컴파일러는 사용하고 싶은 표준이 아닌 사용하고있는 표준을 따를 것입니다 그래서
unsigned int fun (unsigned int a, unsigned int b)
{
return((a<<2)+b);
}
이 팔입니다
00000000 <fun>:
0: e0810100 add r0, r1, r0, lsl #2
4: e12fff1e bx lr
제공하고, 그들이 맞게이 경우에 매개 변수가 R0, R1, R2, R3에 전달하고 ... 당신은 ASM 일치합니다 갖고 계신다면 스택으로 가십시오. 반환 값은 적합하다면 r0에 있고 많은 예외가 있습니다. 당신은 함수에서 r0-r3을 파괴 할 수 있지만 r4를 보존해야합니다 (단 하나의 예외가있을 수 있습니다). 따라서이 경우 r0은 왼쪽으로 2 시프트되고 r1에 추가되므로 r0은 a이고 r1은 b가되어야하며 반환 값은이 실험에서 r0입니다. 다른 명령어 세트 r15를 사용
는
00000000 <fun>:
0: 0f 5f rla r15
2: 0f 5f rla r15
4: 0f 5e add r14, r15
6: 30 41 ret
a와 R14의 B 것으로 보인다 대답은 R15
00000000 <_fun>:
0: 1166 mov r5, -(sp)
2: 1185 mov sp, r5
4: 1d40 0004 mov 4(r5), r0
8: 0cc0 asl r0
a: 0cc0 asl r0
c: 6d40 0006 add 6(r5), r0
10: 1585 mov (sp)+, r5
12: 0087 rts pc
에 반환하고 또 다른 명령어 세트는 스택
나는 당신이 당신의 ASM 프로토 타입을 추천에게 사용 함수를 호출하여 C에서 C로 호출 한 다음 컴파일하고 역 어셈블하고 asm을 빌드합니다.인라인 어셈블리를 사용하려고 시도하는 것보다 실제로 어셈블하는 것이 훨씬 쉽습니다. 이는 고급 주제이며 컴파일러에 크게 의존하기 때문에 인라인 어셈블리를 사용하지 않으면 작업 할 수있는 가능성이 더 큽니다.
그래서 지식을 배운 걸릴 만들 것입니다 예를 들어
.globl myfun
myfun:
add r0,r1,r0, lsl #2
bx lr
나는 그를 조립하고 두 개의 매개 변수와 함께 myfun 전화를 원하는 사람 누구에게나 그것을에 연결할 수 있습니다. 아니면 그 지식을 사용하여 리턴 값을 생성하기 위해이 두 매개 변수로 다른 일을 할 수 있습니다.
API는 어떻게 제공됩니까? 함수 원형이있는 헤더 파일이 있습니까? 그것을 포함 시켰습니까? asm 라이브러리가 프로젝트에 추가 되었기 때문에 링크가 연결됩니까? – Lundin
"API가 제공됩니까?" 헤더 파일을 가지고 있다면 .c 파일에 헤더 파일을 포함시키고 라이브러리가 프로젝트에 추가되고 프로젝트에 링크되어 있는지 확인하십시오. 어쩌면이 스레드가 도움이 될 것입니다 : http://stackoverflow.com/questions/24991944/linking-c-with-nasm – 23ars
어떤 운영 체제 및 아키텍처를 프로그래밍하고 있습니까? 관련 코드를 보여줄 수 있습니까? – fuz