extern ___error
를 호출을 허가한다.터미널 종료 후 재시작
nasm 설치
brew install nasm
nasm -ver // nasm 설치 확인
https://hardner.tistory.com/22
Intel : instruction dest, src
AT&T : instruction src, dest
윈도우와 리눅스 등 다양한 플랫폼을 지원하며 무료로 사용 가능한 어셈블러
/* read() */
section .text
global _ft_read
extern ___error
_ft_read:
mov rax, 0x2000003 ; 시스템콜(syscall)을 사용하기 위해 rax에 syscall번호를 넣어준다.
syscall ; read() => rax에 리턴 값 저장.
jc _err ; carry flag=1이면 _err label로 점프.
ret
_err:
push rax ; read() return값(errno) 스택에 push.
call ___error ; errno 담을 주소값을 리턴하여 rax에 저장.
pop rdx ; 스택에서 pop하여 rdx에 errno 저장.
mov QWORD [rax], rdx ; rdx에 있는 errno을 rax가 가리키는 곳에 저장함.
mov rax, -1 ; rax에 -1을 저장.
ret
syscall 번호는 rax에 들어 있어야 하며 리턴 값 역시 rax에 저장된다.
syscall 에러 발생하면 carry flag = 1이 된다.
errno를 가리키는 주소를 리턴한다.
ft_strlen(char *s)으로 문자열 s의 길이 측정.
=> rdi : s의 주소 값, rax(리턴 값) : s의 길이
s의 길이만큼 malloc(size)으로 메모리 동적 할당.
=> rdi : 메모리 할당 크기, rax(리턴 값) : 할당한 메모리 주소 값
malloc으로 할당한 메모리에 ft_strcpy()로 문자열 s 복사.
=> rdi : 할당한 메모리 주소 값, rsi : s의 주소 값, rax(리턴 값) : 할당한 메모리 주소 값
Jump if carry flag set (CF=1) https://8jz5.tistory.com/50