전체 글

전체 글

    [ASM] 64bit 환경에서의 레지스터와 리눅스 함수 호출 규약

    libasm은 맥 OS 64bit 환경에서 인텔 어셈블리를 이용하여 진행되기 때문에, 이를 기준으로 정리하였습니다. 범용 레지스터 우선, 16bit의 레지스터는 각 레지스터 이름의 약자로 이루어져 있습니다(ex. AX = accumulator register). 여기서 32bit 레지스터들은 앞에 E(extended) 문자가 추가되고, 64bit는 R문자가 추가됩니다. 64bit 환경에서는 아래의 레지스터들 외에, r8~r15의 레지스터 8개를 추가로 가집니다 레지스터 accumulator base counter data stack pointer stack base pointer src dest 16bit AX BX CX DX SP BP SI DI 32bit EAX EBX ECX EDX ESP EBP E..

    C언어 - 완전 탐색(Brute-force) 알고리즘으로 map에 있는 구멍 찾기

    완전 탐색(Brute-force)이란? 가능한 모든 케이스를 다 검사하는 알고리즘입니다. 모든 케이스를 검사하기 때문에 가장 단순하면서 확실하지만, 시간이 오래 걸릴 수도 있다는 단점이 있습니다. 예전에 랜덤한 모양의 2차원 맵을 입력받아, 게임 플레이를 위한 3d맵을 구현하는 프로그램을 작성한 적이 있습니다. 이때, 주어진 맵에 오류가 없는지 검사하는 과정이 필요했는데, 그때 작성했던 알고리즘을 문제로 재구성하여 정리해보았습니다. 문제 : 맵에 있는 구멍 찾기 랜덤한 모양의 맵이 주어진다고 가정합니다. 이때, 맵이 구멍 없이 벽으로 완전히 둘러싸여 있는지 검사하는 알고리즘을 작성해 봅시다. (맵의 사이즈는 가로 100, 세로 100 이하로만 주어진다고 가정) 맵은 0과 1로 이루어져 있으며, 외부는 '..

    [ASM] Intel 어셈블리 명령어 정리 + hello world 분석

    이전 글에서 어셈블리어로 "hello world"를 출력하는 예제를 작성하였습니다. 이번에는 기초적인 명령어들을 학습하고, 코드를 분석해보겠습니다. 어셈블리어의 명령어 구조 Intel문법에서의 어셈블리 명령어는 다음과 같은 구조를 하고 있습니다. 라벨 : ;주석 여기서 라벨(label)은 기계어로 직접 번역되지는 않으며, 점프(jmp) 명령어를 사용하는 등, 메모리 주소의 참조가 필요할 때 사용됩니다. 라벨 명령어의 집합. 명령어 또는 데이터의 주소를 나타냄. 명령어 mov, jmp 등의 동작을 지시. 피연산자 명령어의 피연산자(operand). 레지스터, 숫자, 문자, 메모리 주소 등. 주석 앞에 ;문자를 붙여 주석처리 어셈블리 명령어 libasm을 구현하며 학습한 명령어들을 위주로 추가 중입니다. 조..

    [ASM] 어셈블리어란? 맥OS에서 Intel문법 + NASM으로 "hello world" 출력하기

    어셈블리어(Assembly language)란? "기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어" - 위키백과 프로그래밍 언어에는 C/C++과 같은 고급 언어(High-Level language) 외에도 어셈블리어와 기계어가 존재합니다. 먼저, 실제 컴퓨터 프로그램은 0과 1로만 이루어져 있는데, 이를 기계어라고 부릅니다. 그리고 어셈블리어는, 이런 기계어에 MOV, ADD와 같은 명령어를 각각 대응시킨, 프로그래밍의 저급 언어입니다. 컴퓨터 구조(CPU)마다 기계어가 다르기 때문에, 이에 대응하는 어셈블리어도 각각 달라지게 됩니다. 이러한 단점을 개선하기 위해 만들어진 것이 C언어와 같은 고급 언어로, CPU에 종속적이지 않으면서도, 저급 언어처럼 메모리에 직접 접근할 수 있다는 장점이 있..

    c언어 - printf()의 서식지정자(format specifier)와 플래그

    서식지정자란? 먼저, printf()는 다음과 같은 형태로 정의되어있습니다. int printf(const char *format, ...) printf()가 가변 인수 '...'으로부터 넘겨받은 변수들을 출력하기 위해서는, 각 변수의 자료형에 대한 정보가 필요합니다. 이러한 정보를 안내하는 것이 '%'기호로 시작하는 서식지정자이며, 다양한 플래그를 활용하면 넓이, 좌우 정렬 등의 출력 형태도 설정할 수 있습니다. %[플래그][넓이][.(정밀도)][길이]서식지정자 여기서 '%서식지정자'는 서식지정자를 사용할 때 필수 요소이지만, 그 밖의 플래그나 넓이 등의 옵션은 선택사항입니다. 서식지정자 실제 printf()에는 더 많은 서식지정자들이 있지만, 우선은 ft_printf에서 요구하는 서식지정자들 위주로 ..

    c언어 - 가변인자란? 가변인자로 간단한 printf() 구현하기

    가변 인자란? 함수의 매개변수 개수가 고정적이지 않고, 변할 수 있다는 의미입니다. printf와 같이 매개변수의 개수가 정해지지 않은 함수를 구현하기 위해 가변 인자를 사용합니다. 반환형 함수명(고정 매개변수, ...) { } 여기서 두 번째 매개변수인 '...'가 가변 인자이며, 가변 인자를 사용하기 위해서는 고정 매개변수가 1개 이상 필요합니다. 가변 인자 사용하기 '...'으로 받아온 가변 인자를 사용하기 위해서는 stdarg.h 헤더를 포함해야 합니다. #include 이 헤더에는 가변 인자를 처리하기 위한 매크로가 포함되어있습니다. va_list 가변인자 포인터. 각 가변인자의 메모리 주소를 가짐 va_list 변수명 va_arg 가변인자 포인터로부터 값을 받아오고, 다음 가변인자 주소로 이동..

    도커에서 nginx + php-fpm 설치하기

    nginx란? nginx는 아파치와 같은 웹서버로, 아파치에 비해서 동시접속 처리에 유리합니다. 그러나 아파치의 경우 다양한 모듈을 활용할 수 있어, php 모듈도 직접 적재할 수 있는데, 이에 비해 nginx는 모듈이 많지 않다고 합니다. nginx와 php-fpm을 함께 사용하는 이유 php-fpm은 FastCGI의 하나로, 웹서버와 외부 프로그램의 상호작용을 도와주는 프로토콜입니다. php-fpm을 이용하면 동적인 웹 페이지를 구현할 수 있습니다. nginx의 경우, 아파치와는 다르게 따로 php-fpm을 설치하고 연동시키는 과정이 필요합니다. 도커에서 nginx와 php-fpm 연동하기 debian:buster를 기반으로 진행합니다. docker run -it -p 80:80 debian:bust..

    Dockerfile을 작성하고 Docker 실행하기

    Dockerfile이란? 이미지를 생성하기 위한 스크립트. docker build 명령어를 통해 이미지를 생성할 수 있습니다. Dockerfile 명령어 FROM 기반이 될 이미지(ex. OS)를 지정 FROM MAINTAINER 작성자의 정보를 기록 MAINTAINER RUN FROM의 기반 이미지 위에서 실행될 명령어 RUN COPY 도커 컨테이너의 경로로 파일을 복사합니다 COPY CMD 컨테이너 시작 이후, 컨테이너에서 실행될 파일 CMD ... ENV 도커의 환경변수를 설정 ENV EXPOSE 연결할 포트 번호를 명시 EXPOSE ... Dockerfile 작성 예시 debian:buster를 기반 이미지로 하고 nginx를 설치하는 도커파일의 예시입니다. 여기서 apt-get 명령어에 -y 옵..