본문 바로가기

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

(14)
[Arm64] good github to practice Arm assembly instruction good github to practice Arm assembly instruction https://github.com/Apress/programming-with-64-bit-ARM-assembly-language
[Armv8] 전체 어셈블리 명령어 타입 - Tech Tree 데이터 처리 명령어 - move - 산술 명령어 - 비트 shift - 논리 비트 shift 메모리 연산 - ldr - str 비교와 브랜치 - 플래그 설정 명령어 - 컨디션 코드 - 조건부 브랜치 - 브랜치 시스템 제어 명령어 - 트랩 관련 명령어 - 시스템 레지스터 설정 - PSTATE 각종 필드 설정 - 스택 동작 방식 설정 배리어 명령어 - DSB - DMB - ISB 캐시 설정 명령어 - DC {C,CI,I}SW, Xx - TLBI ALLE{1..3}{IS} * 유튜브 소개 영상
[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 프로세서와 대화..