C 배열은 단지 포인터 일 뿐이므로 C 배열을 assemply 함수의 인수로 전달하면 배열의 내용 인 메모리 영역에 대한 포인터가 생깁니다.
인수를 검색하는 경우 사용하는 호출 규칙에 따라 다릅니다.
제 4 개 개의 레지스터 R0-R3 (A1 ~ A4)이 서브 루틴으로 인수 값을 전달하고, 함수로부터 결과 값을 리턴하는 데 사용된다 아암 EABI 그 규정하고있다. 루틴 내에서 중간 값을 유지하는데도 사용할 수 있습니다 (일반적으로 서브 루틴 호출간에 만).
간단한 함수의 경우 함수 서명에 따라 r0에서 r4까지 배열에 대한 포인터를 찾아야합니다. 그렇지 않으면 스택에서 찾을 수 있습니다. ABI가 무엇인지 정확히 알아내는 좋은 방법은 어셈블리 함수를 호출하는 C 코드의 오브젝트 파일을 디스 어셈블하고 어셈블리 함수를 호출하기 전에 수행 할 작업을 확인하는 것입니다. 그런 다음
extern int myasmfunc(int *);
static int array[] = { 0, 1, 2 };
int mycfunc()
{
return myasmfunc(array);
}
로 컴파일 :
예를 들어, 리눅스에, 당신은라는 파일에 다음 C 코드 testasm.c
을 컴파일 할 수
arm-linux-gnueabi-gcc -c testasm.c
그리고 마지막으로 해체를 얻을 :
를
arm-linux-gnueabi-objdump -S testasm.o
결과 :
testasm.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <mycfunc>:
0: e92d4800 push {fp, lr}
4: e28db004 add fp, sp, #4
8: e59f000c ldr r0, [pc, #12] ; 1c <mycfunc+0x1c>
c: ebfffffe bl 0 <myasmfunc>
10: e1a03000 mov r3, r0
14: e1a00003 mov r0, r3
18: e8bd8800 pop {fp, pc}
1c: 00000000 andeq r0, r0, r0
매개 변수를 r0
에 넣으면 단일 매개 변수화 된 함수 myasmfunc
이 호출됨을 알 수 있습니다. ldr r0, [pc, #12]
의 의미는 "pc+12
에있는 메모리 주소의 내용으로 r0
에로드"입니다. 여기서 배열에 대한 포인터가 저장됩니다.
http://www.arm.com/products/processors/technologies/neon.php –