본문 바로가기

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

(14)
arm instruction(명령어) - ldr 그럼 ldr 명령어의 정의에 대해서 같이 배워볼까요? LDR 명령어는 메모리에서 워드를 레지스터로 읽어 드리는 동작입니다. 자 그럼 아래 명령어를 예를 들어 같이 볼까요? 참고로 R1은 0xD2FB0000라고 하겠습니다. ldr r0, [r1] 그런데 0xD2FB0000메모리 주소에는 00000001란 값이 있다고 가정할께요. 메모리주소 값 NSD:D2FB0000|>00000001 C50F6000 00000004 40400040 “ldr r0, [r1]” 명령어가 수행되면 r0은 0000000으로 업데이트 됩니다. r1(0xD2FB0000)이 갖고 있는 메모리 값을 r0에 로딩하는 동작이죠. 그럼 아래와 같은 명령어가 실행되면 어떻게 업데이트 될까요? ldr r0, [r1,#0x4] r1에서 0x4만큼 ..
arm instruction(명령어) - push & 스택 푸쉬 push & 스택 푸쉬 리눅스 커널 함수를 어셈블리 코드로 열어보면 바로 push란 명령어가 눈에 보입니다. 그럼 정말 맞는지 샘플 코드를 볼까요? 아래 코드는 리눅스 커널 핵심 함수입니다. 각 함수에서 가장 먼저 실행되는 명령어가 push죠. NSR:C0FF413C|__schedule: push {r4-r11,r14} NSR:C0FF4140| add r11,r13,#0x20 ; r11,r13,#32 NSR:C0FF4144| ldr r3,0xC0FF4948 NSR:C017B0C4|handle_irq_event_percpu: push {r0-r2,r4-r11,r14} NSR:C017B0C8| cpy r3,r13 ; r3,sp NSR:C017B0CC| ldr r6,[r0,#0x4] 그럼 이 push란 명령어..
arm instruction(명령어) - cmn 가끔 아래와 같은 cmn ARM 어셈블리어를 볼 수가 있는데 좀 더 깊히 살펴보도록 하겠습니다. cmn r4,#0x1 평소에는 잘 알고 있는 것 같은데 실제 이슈를 볼 때 ARM Instruction을 만나면 머리가 흐릿해지면서 가물가물 해지는 경우가 많아서요. ARM 공식 사이트에 가면 cmn을 음수 비교 구문이라고 소개해 놓았습니다. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/Cihiddid.html 구문 CMN{cond} Rn, Operand2 CMN 명령어는 Rn의 값에 Operand2의 값을 더합니다. 이 명령어는 결과가 버려진다는 점을 제외하고 ADDS 명령어와 동일합니다. 그럼 아래 명령어를 실제 Trace32..
arm instruction(명령어) - strleb strleb란 명령어를 본 적이 있나요? 전 잘 몰라서요, 이 명령어가 어떻게 동작하는지 테스트를 해봤거든요. 그 내용을 정리해서 업데이트할께요. 제가 만난 명령어는 아래와 같거든요. cmp r3, #2 @ 1 //FFFFFFCC 00000000 00000000 00000000 NSD:C000A010| 00000000 00000000 00000000 00000000 ARM사에 계신 ARM개발자님께서 왜 이런 명령어를 개발하셨을까요? 아마 명령어당 ARM core의 실행 횟수를 줄이려고 이런 명령어를 만드신게 아닌 가 생각되네요. 참, 대단하신 것 같네요.
arm instruction(명령어) - ldm "ldm r6,{r2-r3}" 명령어를 Trace32로 실행한 과정을 업데이트할께요. R6 레지스터가 C011AACC 주소를 가르키고 있고, C011AACC 주소에는 10001000 값이 담겨져 있어요. [Before] N _ R0 0 R8 0 ^S+ ^Stack_+ Z _ R1 0 R9 0 C _ R2 0 R10 0 V _ R3 0 R11 0 Q _ R4 0 R12 0 R5 0 R13 D000D000 0 _ R6 C011AACC R14 0 1 _ R7 0 PC C01A7310 2 _ SPSR 10 CPSR 01D3 (where) _____address|________0________4________8________C NSD:C011AAC0| E59F2198 E59F3198 E88B000C>1000100..
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:D000D..