Hi yoahn 개발블로그

[42Seoul/libasm] libasm 시작하기 본문

42 SEOUL

[42Seoul/libasm] libasm 시작하기

hi._.0seon 2021. 4. 30. 23:09
반응형

hi0seon.tistory.com/entry/42Seoullibasm-libasm-서브젝트-번역

 

[42Seoul/libasm] libasm 서브젝트 번역

먼저 서브젝트 번역! Chapter 1 Introduction 어셈블리(또는 어셈블리어)는 컴퓨터 또는 기타 프로그래밍 가능한 장치를 위한 낮은 수준의 프로그래밍 언어이며, 언어와 아키텍처의 기계 코드 명령 사

hi0seon.tistory.com

1. 64비트 asm 사용해야 하고, 호출 규약을 따라야 한다.

kkamagui.tistory.com/811

 

64비트 리눅스 vs 64비트 윈도우 호출 규약 비교(Calling Convention)

근 한달동안 모든 코딩을 어셈블리어로만 하고 있다보니 호출 규약(Calling Convention)을 다시 살펴보고 있습니다. C로 프로그래밍하던 시절에는 호출 규약은 별로 신경쓰지 않았는데, 어셈블리어로

kkamagui.tistory.com

정수 타입의 파라미터를 전달할 때

- 순서대로 RDI, RSI, RDX, RCX, R8, R9 까지 6개의 레지스터를 사용하고, 7개 이상이면 스택을 통해 전달

- 실수 타입의 경우는 XMM0 ~ XMM7까지 8개를 순서대로 사용

- 반환값은 정수일 때 RAX (하위 64비트), RDX(상위 64비트) 를 사용하고, 실수일때는 XMM0(하위 128비트), XMM1(상위 128비트)를 사용한다.

 

호출 규약

  • 함수 호출 시 매개변수는 rdi, rsi, rdx, rcx, r8, r9를 통해 넘어오거나 넘겨진다.
  • 매개변수의 갯수와 상관없이 이 레지스터들에 값이 들어가 있다면 오류가 날 수 있다.
  • 반환값은 항상 rax에 저장된다.

2. syscall

read -> 3

write -> 4

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"

syscall 번호는 한자리 수인데, 호출할 때 앞에 200000x가 붙는 이유는 ??

>> Mac에선 syscall 번호를 여러 클래스로 나누어두었다. write, read 는 unix 클래스에 속해서 최상단 비트를 2로 설정해두었다.

-> write: 0x2000004

-> read: 0x2000003

 

syscall 함수는 에러가 발생하면 rax에 에러 정보를 나타내는 음수를 반환한다.

___error 함수를 호출 한 뒤 반환된 포인터가 가리키는 값[rax] 에 넣고,

rax에는 -1을 넣어 처리한다.

section .text

읽기 전용 부분

코드를 포함하고 있는 영역을 나타낸다.

global _main;

링커에게 _main 을 전역에서 접근할 수 있도록 선언

 

_main:

linker에게 엔트리 포인트 알려줌

 

section .text
	global _ft_read
    extern ___error

_ft_read:
    {code}

외부에서 호출할 함수 앞에 _ 를 붙여야 외부에서 호출할 수 있다. (호출 규약)

외부에 정의된 함수를 사용하기 위해 extern 으로 가져와서 호출해야 함

외부에서 호출하려면 global 로 알려줘야 한다.

 

 

명령어 구성

label : <명령어> <피연산자1> <피연산자2>; 주석

  • label: 명령어들의 묶음을 나타내는 이름
  • 명령어: mov, add, sub, inc, dec, call, ret, cmp, jmp, push, pop, jc

 

jc: carry flag가 1일 때 점프 (최상위 비트 - carry flag)

    carry flag가 1이면 에러이므로 에러 처리를 위한 함수 호출

(최상단 비트에서 캐리가 발생했을 때 carry flag 가 1로 설정됨)

velog.io/@sohi_5/캐리와-오버플로우-확실하게-구분하기

 

[컴퓨터 구조] 캐리와 오버플로우 확실하게 구분하기

컴퓨터 구조에 대해 조금이라도 배운 사람이라면 캐리와 오버플로우에 대해 떠오르는 것이 있을 것이다. 캐리는 아마 가산기가 떠오르지 않을까 생각된다. 이진수 1과 1을 더하면 출력(S)은 0, 자

velog.io

je: cmp(비교) 결과가 같을 때 점프

jne: cmp(비교) 결과가 다를 때 점프

 

Register Counter
64-bit RCX
32-bit   ECX
16-bit   CX
8-bit     CH CL

CH, CL 레지스터는 8bit 짜리 레지스터이다.

 

ko.wikibooks.org/wiki/X86_%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC/x86_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98

 

x86 어셈블리/x86 아키텍처 - 위키책

x86 아키텍쳐[+/-] x86 아키텍쳐는 8개의 범용 레지스터(GPR; General-Purpose Register), 6개의 세그먼트 레지스터, 1개의 플래그 레지스터, 마지막으로 명령어 포인터를 갖는다. 64비트 x86에는 더 많은 레지

ko.wikibooks.org

call ___error 했을 때 return 되는 값은 errno의 주소값이다.

 

 

github.com/gurugio/book_assembly_8086_ko/blob/master/README.md

 

gurugio/book_assembly_8086_ko

Contribute to gurugio/book_assembly_8086_ko development by creating an account on GitHub.

github.com

aistories.tistory.com/12

 

어셈블리어(Assembly) 기초

어셈블리어(Assembly) 입문자를 위한 어셈블리어 기초 ## 목차 ## 0x01. 어셈블리 언어란? & 배우는 목적 0x02. 어셈블리 언어를 위한 기본 지식 0x03. 어셈블리 명령어의 구성 0x04. 주소지정방식의 이해

aistories.tistory.com

www.notion.so/Libasm-f4869fe5de17402b9054a7ca06bfc79c

 

Libasm

어셈블리어로 libc 일부 함수 재구현

www.notion.so

www.notion.so/Libasm-3c94bbc7df234499b012f6ae82b84dc2

 

Libasm

이 문서는 42cursus의 Libasm을 학습하기 위한 핵심정보만을 전달합니다. 어셈블리어에 대한 더 많은 지식이 필요하신 분은 Google 또는 저의 문서 속 링크들을 참고해주세요 :)

www.notion.so

 

반응형

'42 SEOUL' 카테고리의 다른 글

CI/CD 파이프라인  (0) 2021.08.06
[42Seoul / Philosophers(OS)] Mutex 와 Semaphore 차이  (0) 2021.06.28
[42Seoul / subject] Philosophers 해석  (0) 2021.06.16
[42Seoul/libasm] libasm 서브젝트 번역  (0) 2021.04.30
[42Seoul] Cub3D 번역  (0) 2021.03.31
Comments