본문 바로가기

시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리/4장: 어셈블리 명령어

arm - ldrd 명령어

ldrd 명령어에 대해서 소개하고자 해요.
아래와 같은 ldr 명령어는 많이 봤는데, 갑자기 이런 명령어가 보이니 당황스럽기도 하네요.
ldr  r2, [r4,#0x8]
 
자 이제, 구체적으로 아래 Instruction이 실행된 후 레지스터가 어떻게 업데이트 되는지 살펴볼께요.
ldrd    r2,r3,[r4,#0x8]
 
참고로 R4는 0xD000D000 인데요. 0xD000D000+0x8 에 위치한 공간에 아래 값을 갖고 있네요.
_____address|________0________4________8________C
NSD:D000D000| 00000000 11111111 >22222222 33333333
NSD:D000D010| 00000000 00000000 00000000 00000000
NSD:D000D020| 00000000 00000000 00000000 00000000
NSD:D000D030| 00000000 00000000 00000000 00000000
NSD:D000D040| 00000000 00000000 00000000 00000000
 
"ldrd    r2,r3,[r4,#0x8]" 명령어가 실행되기 전 레지스터 상태는 아래와 같은데요, R2/R3가 0x0이네요.
N _  R0          0  R8          0
Z _  R1          0  R9          0
C _  R2          0  R10         0
V _  R3          0  R11         0
Q _  R4   D000D000  R12         0
     R5          0  R13  EEEECCC0
0 _  R6          0  R14         0
1 _  R7          0  PC   C0174658
2 _  SPSR       10  CPSR     01D3
 
실행 후에는 (0xD000D000+0x8)에 위치한 메모리 덤프를 R2/R3에 로드하네요.
N _  R0          0  R8          0
Z _  R1          0  R9          0
C _  R2   22222222  R10         0
V _  R3   33333333  R11         0
Q _  R4   D000D000  R12         0
     R5          0  R13  EEEECCC0
0 _  R6          0  R14         0
1 _  R7          0  PC   C017465C
2 _  SPSR       10  CPSR     01D3
 
정리하면 아래 명령어는 r4에서 0x8만큼 떨어진 메모리 공간에 있는 값을 8 바이트 만큼 읽어서
R2/R3에 로딩하는 군요.
ldrd    r2,r3,[r4,#0x8]