iOS에서 어셈블리 언어 사용 방법

4666 단어 어셈블리 언어
본고는 XCode를 이용하여 iOS 장치에서 어셈블리 언어를 사용하는 방법을 체계적으로 소개할 것이다.
1. 어셈블리 원본 파일을 만들려면 다음과 같이 하십시오.
XCode 항목에서 원본 파일을 저장할 디렉토리를 마우스 오른쪽 버튼으로 클릭하고 New File을 선택합니다.그리고 왼쪽에 있는 iOS 표시줄에서 Other를 선택하십시오. 오른쪽에 있는 Assembly File를 볼 수 있습니다. 이 표시줄을 선택한 다음 이름을 지정하십시오.접미사
2. 어셈블리 코드를 작성한다.
그런 다음 다음 다음 코드를 시도할 수 있습니다.
/*
* arm7.asm
* Test
*
* Created by Zenny Chen on 4/24/10.
* Copyright 2010 GreenGames Studio. All rights reserved.
*/

.text
.align 4
.globl _my_arm_test
.globl _my_thumb_test


.arm

_my_arm_test:

vdup.32 q0, r0
qadd8 r0, r1, r2
add r0, r0, LSL #2
bx lr


.thumb
.thumb_func _my_thumb_test

_my_thumb_test:

movw r1, #1001
rev16 r0, r1
bx lr

여기서 주의해야 할 것은 애플이 사용하는 ARM 어셈블러가 GNU Assembler 규범을 따르는 것이다.그 중에서 어셈블리 파일의 주석은 C 언어 표준의 주석 방식을 사용할 수도 있고 C++ 표준의//주석 방식을 사용할 수도 있음을 알 수 있다.
.text는 코드의 본문 부분을 나타냅니다.
.align은 서로 다른 어셈블러에 따라 다른 행동을 할 수 있다. 여기와 같다.align4는 4바이트 정렬을 나타낼 수도 있고 16바이트 정렬을 나타낼 수도 있다.
GAS 규범에 의하면 사용할 수 있다.글로벌 또는.globl에서 전역 함수를 표시합니다.Apple의 Assembler에서만 지원됩니다.globl.함수 이름 앞에 밑줄을 그어야 한다.
.arm은 뒤에 있는 함수의 지령이 모두arm 지령이라는 것을 나타낸다.그러나thumb는 다음 함수의 지령이 모두thumb 또는thumb-2 지령이라는 것을 나타낸다.그 중에서 만약 함수가thumb로 썼다면 반드시 사용해야 한다.thumb_func 수식, 그렇지 않으면 연결기가 연결 기호에 문제가 있을 수 있습니다.
위 코드에서my_arm_테스트는 각각 NEON 명령 하나, ARMv6 명령 하나, ARMv5TE 명령 두 개를 사용했다.그리고my_thumb_테스트에서는 각각 ARMv7 Thumb-2 지령, ARMv6 지령과 ARMv5TE 지령을 사용했다.
또한 Apple LLVM 어셈블러의 조건 사전 처리는 C 언어와 거의 동일합니다.#if, #else, #endif, #ifdef, #ifndef, #elif 등을 사용할 수 있습니다.또한 구조 표지에도 표준적인 구조 표지를 통일적으로 사용했다. 예를 들어i386__x86 프로세서 아키텍처를 나타냅니다.x86_64__64비트를 나타내는 x86 프로세서;arm__ARM 아키텍처를 나타내는 프로세서;arm64__64비트 ARM 아키텍처 프로세서를 나타냅니다.다음은 샘플 코드입니다.
.text
.align 2

.globl _MyASMTest


#if  defined(__i386__) || defined(__x86_64__)

_MyASMTest:
    xor    %eax, %eax
    ret

#elif defined(__arm__)

_MyASMTest:
    eor     r1, r0, r0
    bx      lr

#elif defined(__arm64__)

_MyASMTest:
    eor    x1, x0, x0
    ret

#endif

 
 
3. C/C++ 또는 Objective C/C++에서 어셈블리 함수 호출
어떻게 당신의 C/C++ 원본 파일에서 어셈블리 함수를 호출합니까?사실 이것은 일반적인 C 함수를 호출하는 것과 같다.
extern int my_arm_test(int a, int b, int c);
extern int my_thumb_test(int a, int b);


void my_test(void)
{
    printf("ARM value: %d
", my_arm_test(10, 20, 30)); printf("Thumb value: %d
", my_thumb_test(10, 20)); }

우리는 여기 함수 이름 앞의 밑줄이 없는 것을 볼 수 있다.여기에는 필요도 없고 밑줄도 칠 수 없다.  
현재 ARM 어셈블러가 Thumb-2 명령 집합을 완전히 지원하지 않기 때문입니다.w 접미사는 모두 지원되지 않습니다.그러나 Apple LLVM3.0 및 LLVM-GCC 지원따라서 우리는 C/C++에서 내연 어셈블리 방식으로 쓸 수 있다.상세히 참고하세요--LLVM의 C 언어 컴파일러에 순수 어셈블리 함수 내장 고려 사항.Xcode 4.5 이후 Thumb-2는 이미 매우 잘 지지되었다.현재 Xcode가 자체로 가지고 있는 어셈블러는Thumb-EE를 지원하지 않지만, 이것은 이미 유행이 지난 지령집이 되었으니, 우리도 깊이 연구할 필요가 없다. 허허.
Apple LLVM 5.1에서 시작하여 ARMv7, VFPv4 및 ARM64를 모두 지원합니다.iOS의 ARMv7과 ARM64의 ABI에 대해 자세히 살펴보겠습니다.
ARMv7에서 유니버설 레지스터에 대해 자신이 쓰는 과정에서 R4, R5, R6, R7, R8, R9, R10, R11과 R14 레지스터를 보호해야 한다.NEON 레지스터는 Q4, Q5, Q6, Q7 레지스터를 저장해야 한다.
ARM64 모드에서는 범용 레지스터 X18, X30을 사용할 수 없습니다.자기가 쓴 과정에 의해 보호되어야 하는 것은 X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29 레지스터이다.SIMD 레지스터는 V8, V9, V10, V11, V12, V13, V14, V15를 보호해야 한다.

좋은 웹페이지 즐겨찾기