[42seoul]libasm

ijuhae·2021년 1월 12일
0

42seoul

목록 보기
1/1

Common Instructions

  • Makefile
    • $(NAME)
    • all
    • clean
    • fclean
    • re
  • 64 bits ASM을 작성해라. "calling convention"에 주의하자.
  • inline ASM을 사용하면 안된다. '.s' 파일을 사용하자.
  • nasm을 이용하여 어셈블리 코드를 컴파일 하자.
  • AT&T가 아닌 Intel 문법을 사용하자.

Mandatory part

  • 라이브러리 이름은 libasm.a
  • 함수를 테스트할 main()을 제출해야한다.
  • ft_strlen, ft_strcpy, ft_strcmp, ft_write, ft_read, ft_strdup을 작성하자.
  • 시스템콜(syscall) 중 오류를 확인하고 필요할 때 적절하게 설정하자.
  • 코드에서 errno 변수를 올바르게 설정하자.
  • 이를 위해 extern ___error를 호출을 허가한다.

Start!!🚀

  1. brew 설치 https://github.com/kube/42homebrew

  2. 터미널 종료 후 재시작

  3. nasm 설치

    brew install nasm

    nasm -ver // nasm 설치 확인

⌿ test tool

  1. git clone https://github.com/cacharle/libasm_test
  2. brew install python3

Intel / AT&T 문법 차이

https://hardner.tistory.com/22

Intel : instruction dest, src

AT&T : instruction src, dest

nasm : the netwide assembler

​ 윈도우와 리눅스 등 다양한 플랫폼을 지원하며 무료로 사용 가능한 어셈블러

register

https://harin-luna.tistory.com/entry/64bit-%EC%B2%B4%EC%A0%9C%EC%97%90%EC%84%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9D%B8%EC%9E%90%EC%A0%84%EB%8B%AC%EC%9D%84-%ED%95%A0%EA%B9%8C

  • RDI : 첫번째 인자
  • RSI : 두번째 인자
  • RDX : 세번째 인자
  • RCX : 네번째 인자
  • R8 : 다섯번째 인자 -> 추가된 범용 레지스터
  • R9 : 여섯번째 인자 -> 추가된 범용 레지스터

에러 처리

https://yechoi.tistory.com/17

/* 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

syscall 번호는 rax에 들어 있어야 하며 리턴 값 역시 rax에 저장된다.

syscall 에러 발생하면 carry flag = 1이 된다.

___error

errno를 가리키는 주소를 리턴한다.

ft_strdup(char *s)

  1. ft_strlen(char *s)으로 문자열 s의 길이 측정.

    => rdi : s의 주소 값, rax(리턴 값) : s의 길이

  2. s의 길이만큼 malloc(size)으로 메모리 동적 할당.

    => rdi : 메모리 할당 크기, rax(리턴 값) : 할당한 메모리 주소 값

  3. malloc으로 할당한 메모리에 ft_strcpy()로 문자열 s 복사.

    => rdi : 할당한 메모리 주소 값, rsi : s의 주소 값, rax(리턴 값) : 할당한 메모리 주소 값

[instruction] jc

Jump if carry flag set (CF=1) https://8jz5.tistory.com/50

ref.)

0개의 댓글