1. 어셈블리어로 "Hello, World!" 출력하기
(1) hello.asm 소스코드 작성
global _start
section .text _start: mov rax, 1 mov rdi, 1 mov rsi, message mov rdx, 14 syscall mov rax, 60 xor rdi, rdi syscall
section .data message: db "Hello, World!", 10 |
(2) 어셈블러 nasm을 이용하여 목적파일을 만들고, ld 명령을 이용하여 실행파일을 만든다.
nasm -f lef64 hello.asm ld -o hello hello.o |
(3) hello 실행파일 실행
./hello |
(4) objdump 를 이용하여 파일의 실행영역을 디스어셈블
objdump -M intel -d hello |
2. 명령어
(1) MOV : 값 이동
ex) MOV EAX, 7
=> 7이라는 값을 EAX에 넣는다.
(2) LEA : 주소 이동
ex) LEA EAX, [rbp-16]
=> rbp-16 라는 주소를 EAX에 넣는다.
(3) JMP : JMP 다음의 주소로 이동
(4) CALL : CALL 다음에 있는 명령어 주소를 스택에 PUSH
(5) RET : 현재 RSP가 가리키고 있는 값으로 점프한다.
(6) RSP : 항상 스택 최상위를 가리킨다.
(8) PUSH : 스택 최상위에 값을 넣는다. RSP 증가
(9) POP : 스택 최상위에서 값을 빼온다. RSP 감소