Android 및 iOS에서 ARM64 코드를 작성하는 일반적인 지침으로 제 대답을 사용하겠습니다. (휘발성) 인수 및 반환 값
X8 = 간접적 인 결과 (구조체) 위치 (또는 임시 등록)
X9- -
X0-X7 : 우리는 휘발성 및 비 휘발성 레지스터를 시작하자, 시작합니다 X15 = 임시 (휘발성)
X16-X17 - 소개 - 전화 사용 레지스터 (PLT, 링커) 또는 임시
X18을 - 특정 플랫폼 사용 (TLS)
X19-X28이 - 수신자가 레지스터 (비 휘발성) 저장
X29 - 프레임 포인터
X30 - 링크 레지스터 (LR)
SP - stac K 포인터 제로 (XZR는)
는 V0-V7, V16-V31 - 수신자 (컴파일러에 의해 임시 바르에 사용되는 비 휘발성) 레지스터
다음은 저장된 - 휘발성 NEON 및 FP는 V8-V15는
등록 어셈블러 지시어가 제대로 코드의 "세그먼트"를 만드는 것입니다 :
안드로이드
.cpu 일반 +의 FP + SIMD
각 기능에 대한
는 .text,이 3 줄을 추가
.section .text.MyFunctionName, "도끼", %의 progbits
.align이라는 2
.type의 MyFunctionName % 기능
아이폰 OS (정말 ALIGN 지시문을 제외하고 필요한 경우 Nothing)
.정렬이
선언 대중 (글로벌)의
선도 밑줄 --notice 아이폰 OS
.globl _MyFunctionName <
.global MyFunctionName
안드로이드와 다른 철자를 레이블 글로벌 지시문
다음으로 차이점은 소스 코드에 정의 된 정적 데이터에 대한 포인터를 얻는 것입니다. 예를 들어 데이터 테이블이 있고 테이블에 대한 포인터로 X0 레지스터를로드하려고한다고 가정 해 봅시다.
안드로이드
adrp x0, MyDataTable
add x0, x0, #:lo12:MyDataTable
아이폰 OS
adrp x0,[email protected]
add x0,x0,[email protected]
다음, NEON 구문. 아이폰 OS는 # 크기 정보 안드로이드
안드로이드 크기 접미사
LD1 {v0.16b} [X0]와 레지스터를보고 싶어하면서 명령어 니모닉에 추가 될 수 있도록 16
아이폰 OS
ld1.16b V0} {[X0, # 16
중첩 루프 32 비트 ARM 코드 사전 스택 LR 밀어 전형적인이었다
함수 내에서 함수를 호출해야 할 때이를 제공하십시오. NEON 명령어는 더 이상 보조 프로세서가 아니며 Aarch64의 기본 명령어 세트에 병합되었으므로 데이터를 앞뒤로 이동하는 데 페널티가 없습니다. 사용되지 않는 NEON 레지스터에 X30 (LR)을 보존하는 것이 현실적입니다. 예 :
fmov d0,x30 // preserve LR
<some code which makes function calls>
fmov x30,d0 // restore LR
그게 전부입니다. 더 많은 차이점이있는 구체적인 사례를 발견하면 추가 할 것입니다.
함수를 인라인으로 배치해야합니까? 그렇지 않으면 C의 의미에서 문자 그대로 기능을 수행해야합니까? 어셈블리 함수가 별도의 컴파일 유닛으로 분할 될 수 있는지에 관해서는 GCC를 사용하여 어셈블리를 정적 라이브러리에 빌드 한 다음 링크 만하면됩니다. – Tommy
함수는 외부 소스 파일에 확장명이 .S –