ecole42

libasm

libasm은 ecole42의 프로젝트로, NASM 어셈블러를 사용하여 macOS 환경에서 동작하는 기본적인 문자열 및 파일 I/O 함수들을 어셈블리 언어로 구현한 라이브러리. x86-64 어셈블리 언어를 직접 작성하여 저수준 프로그래밍을 이해하고, 시스템 콜, 레지스터 관리, 메모리 조작 등 컴퓨터 아키텍처의 핵심 개념을 학습한다

Assembly

개요

이 프로젝트는 NASM 어셈블러를 사용하여 macOS 환경에서 동작하는 기본적인 문자열 및 파일 I/O 함수들을 어셈블리 언어로 구현한 라이브러리다.

구현된 함수들

1. ft_strlen

문자열의 길이를 계산하는 함수다.

  • 인자: const char *s - 길이를 계산할 문자열
  • 반환값: 문자열의 길이 (size_t)

2. ft_strcpy

문자열을 복사하는 함수다.

  • 인자:
    • char *dest - 복사될 목적지 버퍼
    • const char *src - 복사할 소스 문자열
  • 반환값: dest 포인터

3. ft_strcmp

두 문자열을 비교하는 함수다.

  • 인자:
    • const char *s1 - 첫 번째 문자열
    • const char *s2 - 두 번째 문자열
  • 반환값:
    • s1 < s2: 음수
    • s1 == s2: 0
    • s1 > s2: 양수

4. ft_write

파일 디스크립터에 데이터를 쓰는 함수다.

  • 인자:
    • int fd - 파일 디스크립터
    • const void *buf - 쓸 데이터 버퍼
    • size_t nbyte - 쓸 바이트 수
  • 반환값: 실제로 쓴 바이트 수, 오류 시 -1

5. ft_read

파일 디스크립터에서 데이터를 읽는 함수다.

  • 인자:
    • int fd - 파일 디스크립터
    • void *buf - 읽은 데이터를 저장할 버퍼
    • size_t nbyte - 읽을 바이트 수
  • 반환값: 실제로 읽은 바이트 수, 오류 시 -1

6. ft_strdup

문자열을 복제하여 새로운 메모리에 저장하는 함수다.

  • 인자: const char *s - 복제할 문자열
  • 반환값: 새로 할당된 메모리에 복제된 문자열의 포인터, 실패 시 NULL

빌드 방법

make

이 명령어는 모든 어셈블리 소스 파일을 컴파일하고 libasm.a 정적 라이브러리를 생성한다.

사용 가능한 Makefile 타겟

  • make 또는 make all: 라이브러리 빌드
  • make clean: 오브젝트 파일 삭제
  • make fclean: 오브젝트 파일과 라이브러리 파일 삭제
  • make re: 완전히 정리 후 다시 빌드

테스트

프로젝트에는 main.c 파일이 포함되어 있어 각 함수의 동작을 테스트할 수 있다.

gcc main.c -L. -lasm -o test
./test

x86-64 레지스터

범용 레지스터 (General Purpose Registers)

  • RAX: 주 누산기 (primary accumulator)
  • RBX: 베이스 레지스터 (base register)
  • RCX: 카운트 레지스터 (count register)
  • RDX: 데이터 레지스터 (data register)
  • RSI: 소스 인덱스 (source index)
  • RDI: 목적지 인덱스 (destination index)
  • RSP: 스택 포인터 (stack pointer)
  • RBP: 베이스 포인터 (base pointer)
  • R8 ~ R15: 추가 범용 레지스터

세그먼트 레지스터 (Segment Registers)

  • CS: 코드 세그먼트 (code segment)
  • SS: 스택 세그먼트 (stack segment)
  • DS: 데이터 세그먼트 (data segment)
  • ES: 확장 세그먼트 (extra segment)
  • FS: 추가 세그먼트
  • GS: 추가 세그먼트

시스템 콜

이 프로젝트는 macOS의 시스템 콜을 사용한다:

  • write: 시스템 콜 번호 0x2000004
  • read: 시스템 콜 번호 0x2000003

참고 자료

파일 구조

libasm/
├── ft_strlen.s    # 문자열 길이 계산 함수
├── ft_strcpy.s    # 문자열 복사 함수
├── ft_strcmp.s    # 문자열 비교 함수
├── ft_write.s     # 파일 쓰기 함수
├── ft_read.s      # 파일 읽기 함수
├── ft_strdup.s    # 문자열 복제 함수
├── main.c         # 테스트 프로그램
├── Makefile       # 빌드 설정
└── README.md      # 프로젝트 문서

주의사항

  • 이 프로젝트는 macOS 환경을 대상으로 작성되었다
  • Linux 환경에서는 시스템 콜 번호가 다르므로 수정이 필요하다
  • 함수들은 표준 C 라이브러리의 동일한 함수들과 동일한 동작을 한다