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]
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 > 4장: 어셈블리 명령어' 카테고리의 다른 글
arm instruction(명령어) - ldr (0) | 2023.06.10 |
---|---|
arm instruction(명령어) - push & 스택 푸쉬 (0) | 2023.06.10 |
arm instruction(명령어) - cmn (0) | 2023.06.10 |
arm instruction(명령어) - strleb (0) | 2023.06.10 |
arm instruction(명령어) - ldm (0) | 2023.06.10 |