ARM

arm - 기본 개념

K0n9 2025. 6. 13. 14:35

아키텍처 중 하나로 4byte 주소체계를 가진 RISC 기반 명령어이다.

RISC 계열 프로세서는 고성능.저전력 특성을 살려 주로 임베디드 시스템, 모바일,휴대용 디바이스, IoT 기기 등에 쓰인다.

 

컴파일

mips에서 mips를 arm으로만 바꿔주면 된다.

mips꺼를 참고하자

https://k0n9.tistory.com/entry/mips-%EC%8A%A4%ED%83%9D%ED%94%84%EB%A0%88%EC%9E%84-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4

 

mips - 기본 개념, 스택프레임, 레지스터, 어셈블리어

mips 란?Microprocessor without Interlocked Pipelined Stages 아키텍처 중 하나로 4byte 주소체계를 가진 RISC 기반 명령어이다.RISC 계열 프로세서는 고성능.저전력 특성을 살려 주로 임베디드 시스템, 모바일,휴

k0n9.tistory.com

 

arm 스택프레임

#include <stdio.h>

void a(){
        char buf[0x30];
        printf("this is a\n");
        read(0, buf, 0x30);
        b();
}

void b(){
        printf("this is b\n");
}


int main(){
        printf("this is main\n");
        a();
}

위 함수를 예제로 하여 설명해겠다

 

함수 a

 

프롤로그

push {r7, lr}
sub  sp, #56
add  r7, sp, #0

우선 복귀할 스택 프레임 주소값과 명령 주소값을 push 한다. 그리고 sub sp, #56 을 통해 스택프레임의 공간을 확보해준다. 이후 r7레지스터를 현재 스택 프레임으로 올려준다.

 

body

이것저것 코드가 실행된다.

 

에필로그

adds r7, #56
mov  sp, r7
pop  {r7, pc}

이전에 확보했던 공간을 다시 제거하기 위해 r7에 56 을 더해서 r7을 내린다. 그리고 mov sp, r7 을 통해 sp도 내린다. 이후 pop 을 통해 r7을 이전 스택프레임으로 복원하고 pc 도 복원함으로서 이전 a함수 호출 이후의 명령이 실행된다.

 

arm 레지스터

레지스터는 R0 ~ 15 등이 있고 추가적으로 모드마다 다르다.

 

General purpose register

R0 : 주로 리턴값을 보관
R0~R3 : 인자 1 ~ 4 까지 담당 (이후 스택에 보관)
R7 : EBP, thumb mode 에서는 system call number
R11 : EBP (defend on version)
(R13) SP :  stack pointer
(R14) LR : linked register
(R15) PC : program counter

r9  = sb
r10 = sl
r11 = fp

 

Status Register (PSR)

CPSR : 현재 상태 레지스터
SPSR : 상태레지스터를 저장하는 레지스터
FLAG BIT와 CONTROL BIT로 나뉨
    - Flag bit = N(negative) Z(Zero) C(carry) O(overflow)
    - Control bit = cpu mode change
        - IRQ, FFIQ, disable bit
        - MODE bit ( user mode, interrupt mode etc... )

 

arm 어셈블리어

자주 쓰이는 어셈블리어를 정리해보았다.

 

ADD,SUB,MUL,MOV,CMP,JMP

LS(L, R)
TST : and
TSQ : xor
B (BX, BLX, BL)
SWI : interrupt
SVC : syscall

LDR
- LDR r0, [r1, #132]
- r1 + 132 위치의 값을 r0에 로드

STR
- STR r0, [r1, r2]
- r1 + r2 위치에 r0의 값을 적재

LDM, STM 도 같은 형식


 

 

 

 

<틀린 부분이 있다면 비난과 욕설을 해주세요>