-
[libasm] 어셈블리 (about 1 week)42seoul 2021. 3. 26. 21:55
어셈블리 (about 1 week)
어셈블리 1주일만에 끝내기
Subject 읽기
Common Instructions
- You must write 64 bits ASM. Beware of the "calling convention".
- You can’t do inline ASM, you must do ’.s’ files.
(inline asm: 고수준의 언어-c언어, ada- 상에서 저수준의 어셈블리 언어 쓸 수 있도록 하는 함수, 간단히 쓰면 c언어 코드에 어셈블리 언어를 삽입해서 쓰는 형태 ) - You must compile your assembly code with nasm.
(nasm-넷와이드 어셈블러-: 인텔 x86 아키텍처용, 가장 대중적인 리눅스용 어셈블러이자 역어셈블러임. 오픈소스 소프트웨어. ) - You must use the Intel syntax, not the AT&T.
(operands의 순서, 상수, perfix 등 표현 방식이 다름.[참고1] [참고2])
Mandatory part
- 라이브러리 이름은 libasm.a
- 라이브러리 작동을 테스트할 수 있는 main을 포함해서 제출해야함
- 만들어야 하는 함수: ft_strlen, ft_strcpy, ft_strcmp, ft_write, ft_read, ft_strdup
- 시스템콜 사용하는 동안 에러체크 잘하고 필요한 때에 적절하게 set해라
- errno 변수 역시 적절하게 set해야함
- 그러기 위해 extern __error를 call 하는 것이 허용됨
슬랙에서 정보 얻기
- header file 있으면 좋음
- norminette 안맞춰도 됨
- 리눅스환경과 맥환경 문법이 조금 다름(주의)
- hyulee 정리 자료 : 해당과제 설치단계부터 정리되어있음
- hyukim 정리 자료 : 영문으로 된 어셈블리 튜토리얼의 국문 번역자료
- ryukim : 과제에서 어려웠던 점, 꿀팁 위주 정리
- mov -> [메모리, 메모리 끼리 연산 안됨](arbitary effective address 라고 하는 주소 두 개를 피연산자로 사용할 경우 하드웨어적으로 구현이 어려움.
그래서 MOV 뿐만 아니라 모든 CPU 인스트럭션들이 arbitary effective address 두 개를 피연산자로 취하는 경우가 없음. Arbitary effective address 의 예: 주소연산)
공부 시작
.c file로 .s file 만들기
.c -> .i -> .s -> .o -> a.out(실행파일)
test.c를 test.s로 만들어서 열어보기
[test.c] int main() { int a; int b; int c; a = 1; b = 2; c = a + b; }
gcc -S test.c
그러면 test.s 파일이 만들어 진다. 열어보면 어셈블리어가 있는데, 튜토리얼에서 보던 commend들이랑 좀 다르다.
[test.s] .section __TEXT,__text,regular,pure_instructions .build_version macos, 10, 15 sdk_version 10, 15, 6 .globl _main ## -- Begin function main .p2align 4, 0x90 _main: ## @main .cfi_startproc ## %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp xorl %eax, %eax movl $1, -4(%rbp) movl $2, -8(%rbp) movl -4(%rbp), %ecx addl -8(%rbp), %ecx movl %ecx, -12(%rbp) popq %rbp retq .cfi_endproc ## -- End function .subsections_via_symbols
movl -> 이렇게 뒤에 mov 뒤에 알파벳이 하나 더 붙어있음. 이건 데이터의 크기를 의미함.
movq -> movq (assuming you're talking about x86) is a move of a quadword (64-bit value).
직접 .s file 만들기
아래 글을 보고 따라 했음.
[hello_world.s] buffers section .data msg db "hello world",0x0A ; msg = variable name | db = data type(byte) | 0x0A = new line character ; db = data byte(1 byte) | dw = data word(4 byte) | dd = date double(8 byte) section .text global _main ; globally accessible _main : mov rax, 0x2000004 ; 0x2000004 is MAC OS's syscall write() function num. mov rdi, 1 ; following lines are parameters. mov rsi, msg mov rdx, 12 syscall ; call mov rax, 0x2000001 ; 0x2000001 is MAC OS's syscall exit() function num. mov rdi, 0 ; following line is parameter. syscall ; call
'42seoul' 카테고리의 다른 글
[libasm] 어셈블리 (about 1 week) - 2일차(ft_strlen, ft_strcmp) (0) 2021.05.06 [libasm] 어셈블리 (about 1 week) - 2일차(ft_write, ft_read) (0) 2021.05.06 [cub3d] map parse 맵 파싱하기 (0) 2021.03.21 [minishell] Shell이란? 그리고 Shell이 하는 일 (0) 2021.03.01 [cub3d] 과제 시작하기 (0) 2021.02.19