개요
이 프로젝트는 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: 0s1 > 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: 시스템 콜 번호0x2000004read: 시스템 콜 번호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 라이브러리의 동일한 함수들과 동일한 동작을 한다