본문 바로가기

전체 글

(484)
[Arm] ASR(Arithmetic Shift Right) 명령어 16진수인 0x7fffffff는 이진수로는 아래와 같다. 0111 1111 1111 1111 1111 1111 1111 1111 (2진수) 2147483647 (10진수) (static int) __boot_cpu_mode = 2147483647 = 0x7FFFFFFF 0x7fffffff를 'LSR 4'로 수행하면; 0111 1111 1111 1111 1111 1111 1111 1111(0x7FFF FFFF, 2,147,483,647) ( >> 4) 0000 0111 1111 1111 1111 1111 1111 1111(0x07FF FFFF, 134,217,727) 결과는 0x07FF_FFFF, 10진수로는 134,217,727이다. 이제 음수 값을 확인하자. 16진수인 0x80000001는 이진수로는 ..
[ARM프로세서] 'csel' 명령어 이번에는 ARMv8 아키텍처에서 제공하는 명령어 중에 C 언어의 3항 연산자가 연상되는 csel를 알아봅시다. 다음은 분석하려는 코드입니다. 115| printk(!error ? "okay\n" : "failed\n"); MX:FFFFFF8009BB2404|F0FFE748 adrp x8,0xFFFFFF800989D000 MX:FFFFFF8009BB2408|F0FFE289 adrp x9,0xFFFFFF8009805000 MX:FFFFFF8009BB240C|91026108 add x8,x8,#0x98 ; x8,x8,#152 MX:FFFFFF8009BB2410|91192529 add x9,x9,#0x649 ; x9,x9,#1609 MX:FFFFFF8009BB2414|7100027F cmp w19,#0x0 ; ..
[ARM] 'yield' 명령어 * yield는 nop와 같은 명령어로써, SMP 시스템의 ARM 버스가 yield이 실행된 CPU 코어에 낮은 우선 순위를 부여하도록 한다. * yield는 프로세스가 특별히 할 일이 없을 때 실행된다. ARM 문서 내용 A similar use might be in modifying the arbitration priority of the snoop bus in a multiprocessor (MP) system. Defining such an instruction permits binary compatibility between SMT and SMP systems. 출처: DDI0406C_arm_architecture_reference_manual.pdf YIELD YIELD is a hint in..
[ARMv8] cbnz 명령어 cbnz 명령어는 Compare Branch None-zero의 약자입니다. 명령어의 이름 그대로 레지스터의 값이 0이 아닌 경우, 지정된 주소로 브랜치하는 명령어입니다. 아래 코드를 봅시다. 01 and x2,x1,#0x3F ; x2,x1,#63 02 cbnz x2,0xFFFFFF8008083728 ; x2,work_pending 01번째 줄 코드를 봅시다. x1이 0x1이면 x2는 0x1, x1이 0x3f이면 x2는 0x3f가 됩니다. 이 경우 x2는 0x1 혹은 0x3f이므로 0이 아니니, non-zero가 됩니다. 그 다음 02번째 줄을 실행하면 work_pending 레이블의 시작 주소인 0xFFFFFF8008083728로 브랜치합니다. 01~02 번째 줄은 C 코드로 다음고 같이 표현할 수 있..
[ARM] 어셈블리 명령어란 우리가 외국인이 어떤 사람인지 잘 알려면 외국어를 배워야 합니다. 외국어를 직접 말하면서 외국인과 대화를 해야 그 사람의 성격을 제대로 알 수 있습니다. 그렇다면 프로그래머 입장에서 ARM 프로세서가 어떤 동작을 하는 지 파악하려면 무엇을 배워야 할 까요? 바로 ARM 어셈블리 명령어입니다. 미국인과 대화를 하려면 영어를 말하듯 ARM 프로세서와 대화를 하려면 ARM 어셈블리 명령어를 사용해야 합니다. 즉, ARM 어셈블리 명령어는 ARM 프로세서와 소통하는 대화하는 언어라고 말할 수 있습니다. ARM 어셈블리 명령어를 사용하면 ARM 프로세서와 어떻게 대화를 할 수 있을까요? 이번에는 프로그래머 입장에서 조금 더 구체적으로 ARM 프로세서와 대화하는 패턴을 예로 들겠습니다. 쉽게 설명을 하면 ARM 프..
[ARM] ARM 아키텍처의 주요 개념: 어셈블리 명령어 이번 포스트에서는 ARM 아키텍처를 이루는 주요 개념에 대해서 설명하겠습니다. ARM 아키텍처를 배우려면 수 많은 세부 기능을 배워야 하는데 그 중 핵심을 요약하면 다음과 같습니다. ○ ARM 어셈블리 명령어 ○ 레지스터 세트 ○ 익셉션 ○ 함수 호출 규약 이 중에서 먼저 ARM 어셈블리 명령어에 대해서 살펴보겠습니다. ARM 프로세서에게 어셈블리 명령어란 우리가 외국인이 어떤 사람인지 잘 알려면 외국어를 배워야 합니다. 외국어를 직접 말하면서 외국인와 대화를 해야 그 사람의 성격을 제대로 알 수 있습니다. 그렇다면 프로그래머 입장에서 ARM 프로세서가 어떤 동작을 하는 지 파악하려면 무엇을 배워야 할 까요? 바로 ARM 어셈블리 명령어입니다. 미국인과 대화를 하려면 영어를 말하듯 ARM 프로세서와 대화..
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란 명령어..