어셈블리어를 통해 이전에 만들었던 함수들을 다시 만들어본다.

💡 목표 : strlen, write 등의 함수를 어셈블리어를 사용해서 만들자!!!

🚫 조건 : write 64 bits ASM, '.s' files, with 'nasm', use Intel syntax

❓ why : 왜 왜 왜 저급언어를 배울까?? 굳이 고급언어로 만들었던 함수들을 다시 만들어 보는 이유는? (뻘짓) 뭘까 궁금하네요.

HELLO WORLD

저는 새로운 언어를 배울 때마다, 언어에 맞는 테스트 환경을 구축하는 것을 가장 무섭고 어려워 합니다.🥶 뭔가 실제로 공부하기전에 준비만 하다가 기력을 다 빨려 버리는 느낌?

먼저 이번 어셈블리 학습의 환경 구성은 위에 써있는 조건을 우선하여 구축했습니다. 아래의 링크를 참고하면서 구축해봅시다. (저는 우분투 환경에서 진행했습니다.)

어셈블리 프로그래밍

먼저 nasm을 설치하고 .asm 파일을 따라 쳐봅니다.

우리가 공부하기전에 집고 넘어가야할 부분은 어셈블리어는 한줄에 하나씩의 명령 밖에 진행을 못하는 점입니다.

64bit 문법(?)에서는 rax, rbx, rcx, rdx, rdi, rsi 등을 무언가로 사용중이네요.

;nasm64_helloworld.asm 어셈블리에서 한줄 주석은 ';'를 사용

section .data

msg db "hello_world", 0x0A ;0x0A는 개행

section .text

global _start  ;main문 같은 친구

_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, 12
syscall

mov rax, 60
mov rdi, 0
syscall

오 구문을 보니까 섹션은 메모리 공부할 때 보았던 데이터 영역, 코드 영역의 느낌인 거 같아요. _start: 는 함수? 느낌도 조금 나고, 어셈블리에서는 변수명-자료형-데이터순으로 변수를 만들어 사용할수 있다고 하네요. msg db "hello..." 부분이 문자열 변수를 만든 부분같네요. 일단 컴파일(어셈블?)을 해봅시다.

nasm -f elf64 nasm64_helloworld.asm

nasm64_helloworld.o 오브젝트 파일이 만들어졌다!!!😊

자 그럼 실행파일을 만들고 실행해 봅시다.