안드로이드 스튜디오에서 처음 프로젝트를 만들면 여러 파일이 생성됩니다. 1. AndroidManifest.xml : 앱 구성을 기술한 파일입니다. Activity가 몇 개인지, 어느 Activity가 시작 부분인지와 같은 정보가 들어있습니다. 자동으로 작성되어있으나, 앱에 권한을 추가할 때 직접 편집합니다. "매니페스트"라고도 말합니다. 2. MainActivity.kt, activity_main.xml : MainActivity.kt 파일에 코드를 작성하고, activity_main_xml 파일에는 화면에 보여지는 레이아웃을 작성합니다. 이 둘은 한 세트로 상호작용합니다. 3. build.gradle : 프로젝트 수준과 모듈 수준의 빌드 구성 파일입니다. 빌드란 프로그램을 실행 가능한 상태로 만드는 과..
분류 전체보기
* 해당 내용은 Kotlin 공식 레퍼런스에 있는 "Basic Syntax" 내용을 번역하고 제 방식으로 이해해서 작성하였습니다. 1. Package 정의와 import 방법 package com.example.suhwanc import kotlin.text.* 소스 파일의 맨 윗부분에 이런 식으로 선언하면 된다. import 맨 뒤 '*' 표시는 kotlin.text 안에 있는 모든 라이브러리를 가져온다는 의미로 자주 쓰이니 꼭 알아두자. 2. 프로그램 시작 지점 fun main(){ println("Hello World!") } 코틀린 프로그램은 main 함수가 시작이다. 함수 선언은 앞에 fun을 붙이면 되고, 반환형과 파라미터는 따로 선언을 해주어야 한다. 여기서는 println("Hello Wo..
블로그를 개설하고 처음으로 내 이야기를 해보려 한다. 원래는 100번째 글로 쓰려고 했으나.. 끝도 없이 미루다 보니 여기까지 오게 되었다. 처음에 블로그를 시작하게 된 이유는 오로지 취업에 도움이 된다해서, 포트폴리오가 될 수 있다고 해서 시작하게 되었다. 뭐 지금은 그렇지 않느냐하면 안 그렇다고 말할 수는 없겠지만, 그런 부분뿐만 아니라 다른 측면에서도 지금까지 여러모로 도움이 많이 되었다고 생각한다. 나는 재수를 해서 2017년에 대학에 왔고, 대학에 왔으니 당연히 놀아야지! 라고 생각하며 정말 놀았다. 수업 시간에 대놓고 자는건 기본이고, 넓은 강의실에서 하는 수업 시간에는 노트북으로 게임도 했다. 그때는 그게 당연한 줄 알았고, 주변 동기들도 다들 나랑 비슷한 줄 알았다. 그렇게 5월 중간고사를..
이번엔 좀 더 어려운 arm 명령어 ldr/str 그리고 stack에 대해 알아보자. 1. LDR / STR with offsets 기본적으로 arm에서 메모리를 참조하는 연산은 LDR/STR이 전부이다. 이 명령어들에는 offset이 포함되는데, offset의 위치에 따라 기능이 다르다.(바로 뒤에 설명) 1) pre-indexed format pre-indexed format은 offset의 위치가 base register(rn) 과 같은 괄호 안에 포함되어있을 경우이다. 예를 들어 ldr r0, [r1, #12] , str r5, [r6, r7, lsl #2] 와 같은 경우 pre-indexed 라고 할 수 있겠다. pre-indexed는 rn의 값을 offset으로 이동한 위치에 있는 값을 연산한..
이번 챕터는 실생활에 아주 필요한 방법이다. 이걸 가지고 어셈블리어 실습 때 몰래 쓰윽 바꿔서 제출할 수도 있고, 틀린 부분을 보거나, 기계는 이 코드를 어떻게 처리할 지 알아볼 수 있어서 좋다. 이번에 알아볼 코드는 단 두가지 밖에 안된다. 첫 번째, 작성한 C 코드를 어셈블리어로 바꾸는 방법은 다음과 같다. "gcc -marm -O1 -c -o code.o code.c" 이 형식만 기억하면 된다. 두 번째, 바꾼 오브젝트 파일의 내용을 확인하는 방법은 다음과 같다. "objdump -d code.o" 바로 실습으로 넘어가보자. 1. sum 함수 c언어 코드 변환 과정 vi로 코드를 작성 후 다음과 같이 명령어를 입력한다. 어셈블러 코드 그다음 objdump 명령어를 치면 다음과 같은 화면이 나타난다...
이번 장에서는 Arm 프로세서에서 함수를 호출하거나, 인자를 전달하고 리턴되는 Register 들의 역할을 살펴보고 프로시저가 무엇인지 알아보자. 1. Procedure Call 형식 : BL 리턴 주소는 lr 레지스터에 저장된다. (리턴 주소란? 해당 명령어를 마치고 다음으로 갈 주소) "Label"로 jump 하는 의미를 갖는다. 예시 838c의 명령어가 실행될 때, 리턴 주소는 8390이며, lr에 들어가게 된다. 이후 프로시저가 끝나면 8390 줄이 실행되게 된다. 2. Procedure Return 프로시저 콜이 있다면, 당연히 리턴도 있어야 할 것이다. 여기서는 자연스러운 리턴 대신 직접 할 수 있는 방법을 설명한다. 1) bx 명령어 bx lr은 레지스터 lr에 담긴 주소 (가리키는 주소)로..
이번에 배울 Linking은 시스템 프로그래밍에서 대단히 중요한 역할을 수행하는 Linker(링커)가 하는 일이다. 이 단원에서 가장 중요한 것은 "다른 파일에 있는 함수를 어떻게 가져올 것인가?"가 문제가 되는데 천천히 살펴보자. 1. C 프로그래밍에서의 Linking C언어에서의 Linking 코드이다. extern 키워드를 이용해 main.c 파일에 있는 buf 배열을 가져와 사용하는 것을 볼 수 있다. 우리는 이 코드를 직전 단원에서 배운 C 코드를 어셈블러로 변환하는 방법을 이용해 변환해 볼 것이다. 그럼 한 번 불러 볼까요? 짜잔! 어셈블러로 바뀌었다! 왼쪽 코드를 실행하면 오른쪽 데이터가 저장되는데, 이전에 보지 못했던 명령어가 보인다. movw, movt 란? 기존 32비트를 움직일 수 없..
이 글은 “Computer Systems: A Programmer’s Perspective, Third Edition” 교재를 바탕으로 정리한 내용입니다. 이번에 배울 시스템 수준의 I/O (input-output) 장치는 Unix I/O 를 중심으로 알아갈 것이고 추가로 교재에서 나오는 RIO(robust), standard I/O 와 비교해 설명합니다. 1. Unix File Unix file은 바이트의 연속으로 구성되어 있다. ex. (B0 , B1 , · · · , Bk , · · · , Bm−1) 이 "파일"이라는 단어에는 우리가 사용하는 많은 I/O 디바이스가 포함되어 있는데, 대표적으로 디스크, 터미널, 커널 등이 있다. Unix File Types 유닉스 파일의 타입은 여러개로 나뉜다. R..
본 내용은 컴퓨터 아키텍처 - 컴퓨터 구조 및 동작 원리 책(한빛아카데미)을 바탕으로 정리하였습니다. Index 1. 디지털 논리회로 2. 연산장치의 개요 3. 정수의 덧셈, 곱셈 4. 정수의 나눗셈 1. 디지털 논리회로 컴퓨터는 전기적 신호를 사용하여 모든 데이터를 0과 1의 조합으로 표현하고 처리한다. 이때 0과 1로 표현되는 2진 데이터는 논리 게이트(logic gate)라는 디지털 논리회로로 처리된다. 이번에는 컴퓨터 설계 과정에서 많이 사용되는 디지털 논리회로를 맛만 보겠다. 1.1 논리 게이트 첫 번째로 논리 게이트는 논리회로의 기본 하드웨어 소자이다. 기본 연산으로 AND, OR, NOT, XOR 등이 있으며 이들은 0 또는 1의 값을 리턴한다. 위 연산에 대한 설명은 기본적인 내용이므로 생..
이번 Two-pass Assembler는 시스템 프로그래밍 과목에서 항상 텀 프로젝트로 나왔던 부분이다. 다른 학교도 그래서인지.. 구글에 "two-pass assembler in github"라고 치면, 아주 글로벌하게 프로젝트 코드가 나오는 것을 볼 수 있다 😀 어셈블러란? 말 그대로, 조각 난 것을 모아준다는 의미 어셈블리 언어로 작성된 코드를 기계어로 번역해줌 1대 1 대응이 일어난다. 기계어를 저장하는 방법 위로 올라갈수록 높은 주소 → 위로 올라가면서 저장이 된다. (little-endian 방식) ARM은 little, big 둘 다 지원하지만, 기본이 little으로 되어 있다. 예시) ARM Instruction Set Format 위 두 그림은 arm에서 어셈블리 코드를 기계어로 변환하..
이번에 배울 예외적인 흐름 제어는 일반적인 애플리케이션에서 처리하지 못하는 예외들을 OS로 넘겨 처리하는 기법을 말한다. 우선 이전에 배운 것들을 다시 상기해보자. 우리가 지금까지 배운 컴퓨터 시스템 안에서의 상호작용 Assembly language : 명령어 사이의 상호작용 Procedure calls : 함수 사이의 상호작용 Linking : 오브젝트 파일 사이의 상호작용 Control Flow(흐름 제어)란? 일반적인 컴퓨터는 프로그램이 시작하면 명령어들이 순차적으로 진행이 되고 끝나게 된다. 이러한 과정 속에서 CPU는 명령어를 한 번에 한 개씩 수행할 수 있게 되는데, 이 순서를 CPU의 Control Flow라고 한다. 만약 Control Flow가 제대로 동작하지 않는다면, 명령어들이 비순차..
이번엔 저번 시간에 배운 시그널을 c언어를 이용해 호출해보는 실습을 진행해보자. Signal 알아보기 : suhwanc.tistory.com/127 Signal Handler c언어에서는 함수 signal을 이용해 시그널을 핸들링하는 기능을 제공한다. signal 함수는 다음과 같이 생겼다. -> signal(int signum, sighandler_t *handler) 첫 번째 인자는 시그널의 고유 ID이고, 두 번째 인자는 앞의 시그널에 대한 처리 루틴이다. 헷갈려서 위에 쓰지 않았지만, 이 함수는 이전 핸들러의 주소 포인터가 리턴된다.(반환값 : sighandler_t*) 두 번째 인자로는 그냥 handler 자체가 올 수도 있고, 특별하게 2가지가 더 올 수 있는데 SIG_IGN 이 오면, 앞의 ..