section .text
global _main
_main :
mov rax, 0x2000004
mov rdi, 1
mov rsi, msg
mov rdx, 12
syscall
mov rax, 0x2000001
mov rdi, 0
syscall
section .data
msg db "Hello World"
nasm -f macho64 hello.s
ld -lSystem hello.o -o hello
./hello
nasm : intel 어셈블리어 컴파일은 컴퓨터 아키텍쳐에 따라 나뉘는데, intel 어셈블러 문법 컴파일러중 하나가 nasm이다.
우선 hello.s파일을 컴파일 하고, 컴파일 된 파일을 실행 파일로 바꾼다.
여기서 0x2000004은 write함수인데, lsystem 라이브러리 헤더에 해당 함수 번호가 저장되어 있다.
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/syscall.h
만약 mac os를 big sur이상 최신버전으로 업데이트 했다면?..
: 맥에서 최근 big sur로 업그레이드 되면서 라이브러리 연동이, 자동으로 이루어지지 않는다.
이를 해결하기 위해, 컴파이릉 할 떄 라이브러리 경로를 지정해주어 컴파일이 되도록 연동시켜주었다.
nasm -f macho64 hello.s
ld -lSystem hello.o -o hello -macosx_version_min 11.0 -L ~/../../Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk/usr/lib -lsystem
./hello
커맨드라인툴에 있는 system 라이브러리 경로를 설정한건데, 폴더가 없다면, Xcode 커맨드라인툴을 설치하면 생긴다.
커맨드라인툴 경로는, 기본적으로 사용자 컴퓨터 cd ~ 인 루트 폴더 library/Developer폴더에 생성이 되는데, 나는 찾아 보니 없어서, 루트 폴더의 상위 폴더로 이동하여, library에 접근하여, system library에 접근 하였다.
c언어 코드
size_t ft_strlen(const char *s)
{
int a;
a = 0;
while (s[a])
a++;
return (a);
}
어셈블리어 코드
section .text
global _ft_strlen
_ft_strlen :
mov rcx, 0
jmp count
count :
cmp BYTE [rdi + rcx], 0
je end
inc rcx
jmp count
end :
mov rax, rcx
ret
아래부터는 42서울 과제 정답이 있습니다. 보시기 전에, 직접 풀어보시고, 막혔을 때 참고하시길 권장합니다. 바로 보면, 남는게 없어요 :)
char *
stpcpy(char * dst, const char * src);
The stpcpy() and strcpy() functions copy the string src to dst (including
the terminating `\0' character.)
어셈블리 코드
section .text
global _ft_strcpy
_ft_strcpy :
mov rcx, 0
jmp copy
copy :
cmp BYTE [rsi + rcx], 0
je end
mov al, BYTE [rsi + rcx]
mov BYTE [rdi + rcx], al
inc rcx
jmp copy
end :
mov rax, rdi
ret
int
strcmp(const char *s1, const char *s2);
section .text
global _ft_strcmp
_ft_strcmp :
mov rcx, 0
jmp compare
compare :
cmp BYTE [rdi + rcx], 0
je length_check
cmp BYTE [rsi + rcx], 0
je end2
mov al, BYTE [rsi + rcx]
cmp BYTE [rdi + rcx], al
ja end2
jb end3
inc rcx
jmp compare
length_check :
cmp BYTE [rsi + rcx], 0
je end
mov rax, -1
ret
end :
mov rax, 0
ret
end2 :
mov rax, 1
ret
end3 :
mov rax, -1
ret
ssize_t
write(int fildes, const void *buf,
size_t nbyte);
section .text
global _ft_write
extern ___error
_ft_write :
mov rax, 0x2000004
syscall
jc end
ret
end :
push rax
call ___error
pop qword [rax]
mov rax, -1
ret
section .text
global _ft_read
extern ___error
_ft_read :
mov rax, 0x2000003
syscall
jc end
ret
end :
mov rcx, rax
call ___error
mov [rax], rcx
mov rax, -1
ret
char *
strdup(const char *s1);
extern _malloc
extern _ft_strlen
extern _ft_strcpy
extern ___error
section .text
global _ft_strdup
_ft_strdup :
call _ft_strlen
jmp call_malloc
call_malloc :
inc rax
push rdi
mov rdi, rax
call _malloc
cmp rax, 0
je error_malloc
pop rsi
mov rdi, rax
call _ft_strcpy
ret
error_malloc :
mov rax, 12
push rax
call ___error
pop qword [rax]
mov rax, 0
ret
#define EPERM 1
#define ENOENT 2
#define ESRCH 3
#define EINTR 4
#define EIO 5
#define ENXIO 6
#define E2BIG 7
#define ENOEXEC 8
#define EBADF 9
#define ECHILD 10
#define EAGAIN 11
#define ENOMEM 12
#define EACCES 13
#define EFAULT 14
#define EBUSY 16
#define EEXIST 17
#define EXDEV 18
#define ENODEV 19
#define ENOTDIR 20
#define EISDIR 21
#define EINVAL 22
#define ENFILE 23
#define EMFILE 24
#define ENOTTY 25
#define EFBIG 27
#define ENOSPC 28
#define ESPIPE 29
#define EROFS 30
#define EMLINK 31
#define EPIPE 32
#define EDOM 33
#define ERANGE 34
#define EDEADLK 36
#define ENAMETOOLONG 38
#define ENOLCK 39
#define ENOSYS 40
#define ENOTEMPTY 41
#define EILSEQ 42
#define STRUNCATE 80
#define EADDRINUSE 100
#define EADDRNOTAVAIL 101
#define EAFNOSUPPORT 102
#define EALREADY 103
#define EBADMSG 104
#define ECANCELED 105
#define ECONNABORTED 106
#define ECONNREFUSED 107
#define ECONNRESET 108
#define EDESTADDRREQ 109
#define EHOSTUNREACH 110
#define EIDRM 111
#define EINPROGRESS 112
#define EISCONN 113
#define ELOOP 114
#define EMSGSIZE 115
#define ENETDOWN 116
#define ENETRESET 117
#define ENETUNREACH 118
#define ENOBUFS 119
#define ENODATA 120
#define ENOLINK 121
#define ENOMSG 122
#define ENOPROTOOPT 123
#define ENOSR 124
#define ENOSTR 125
#define ENOTCONN 126
#define ENOTRECOVERABLE 127
#define ENOTSOCK 128
#define ENOTSUP 129
#define EOPNOTSUPP 130
#define EOTHER 131
#define EOVERFLOW 132
#define EOWNERDEAD 133
#define EPROTO 134
#define EPROTONOSUPPORT 135
#define EPROTOTYPE 136
#define ETIME 137
#define ETIMEDOUT 138
#define ETXTBSY 139
#define EWOULDBLOCK 140