본문 바로가기

한국으로74

Tail Call Tail Call func0 --> func1 --> func2 --> func3 순서로 함수가 호출되는 경우, func0에서 분기할 때만 'BL' 명령어를 쓰고,그 뒤에 호출되는 함수 셋에서 'B' 명령어를 쓰면,LR(Link Register)은 func0 의 분기 지점을 여전히 가리키고 있게된다. 이 때, func2에서 func3 호출 뒤 'BX LR' 명령으로 바로 func0로 리턴할 수 있다. 매번 새로 호출된 함수에서 'BL' 명령으로 LR을 갱신시키지 않으면 Tail Call의 효과를 누릴 수 있다.LR가 가리키는 복귀 주소인 func0로 즉시 리턴되기 때문에 효율적이다. 2018. 7. 24.
정수 승격과 형변환 문제 정수 승격과 형변환 문제정수 승격연산: A + B작은 타입이 큰 타입으로 변환된다. 대입: A = B우변이 좌변 타입에 맞게 변환된다. 호출: f(int x) 함수에 f(3.14) 호출argument가 parameter에 맞게 변환된다. LDR, STR 명령 데이터 타입 지정하기LDR --> int 로드 LDRB --> unsigned byte 로드 LDRSB --> signed byte 로드 LDRH --> unsigned short 로드 LDRSH --> signed short 로드 STR--> int 로드 STRB--> unsigned byte 저장 STRH--> unsigned short 저장 LDRD, STRD 명령double load, store 주의사항:1. 연속한 레지스터 Rn, Rn+1에.. 2018. 7. 22.
다중 메모리 이동: LDM, STM Multiple Load 및 Store LDM, STM다중 메모리 이동을 위해 LDM 및 STM 사용. STMIA R0, {R1-R3, R5} STMIA 는 Store, Increment After 라는 뜻이다.값을 읽고난 후에 주소가 증가된다. 이 명령 수행 후에도 R0 레지스터 값은 0x1000번지이다.R0 레지스터 값을 업데이트시키기 위해선, '!' suffix를 사용하자. STMIA R0!, {R1-R3, R5} --> R0 레지스터 값이 0x1010으로 auto-update된다. 참고로 레지스터는, 안의 순서와 관계없이 낮은 주소에 낮은 레지스터 번호가 저장된다! LDMDB R0, {R1-R3, R5} FD Stack PUSH, POPFD 스택에 PUSHSTMDB sp!, {regs} or ST.. 2018. 7. 22.
AAPCS와 레지스터 테이블 AAPCS에 의한 각 Register의 사용법 테이블 출처: http://recipes.egloos.com/4988629 AAPCS (Procedure Call Standard for ARM Architecture)argument 전달int function(int a, int b, int c, int d) 의 경우, R0 := a, R1 := b, R2: = c, R3 := d 이런 순서대로 레지스터에 전달된다. 함수의 return 값은 R0에 들어가게된다. 따라서 R0 레지스터에 들어온 인자 a가 계속 필요하다면 스택에 대피시키는 작업도 필요하다!인자는 4B align을 준수해야하기 때문에 잘 고려해서 함수를 설계해야 한다. 가급적 인자는 4개 이하로 만들자. 8B 데이터 (long long int, .. 2018. 7. 21.