[Linux] NASM 사용법
다른 운영체제에서 assembly code를 작성해서 수행하기 위한 assembler 중 하나인 NASM가 있다.
설치
$ apt-get install nasm
사용법
Skeleton
기본적으로 C drive code와 본문이 있다.
아래와 같이 asm_main function을 호출하는 구조를 C drive code라고 부르는데, 처음부터 모든 부분을 assembly로 작성하기는 쉽지 않다. Machine마다 초기 setup을 해주는 부분도 너무 다르기 때문에 아래와 같은 C drive code를 활용한다.
// main.c #include <stdio.h> extern int asm_main(); int main() { int ret; ret = asm_main(); printf("ret=%d\n", ret); return 0; }
Main
아래와 같이 assembly code 뼈대를 나타낼 수 있다.
- Include direction
- DX direction
- RESX direction
- Main code
; hello.asm ; include direction segment .data ; DX direction L1 dd 1 ; int L1 = 1; L2 dd 2 ; int L2 = 2; segment .bss ; RESX direction ret resd 1 ; int ret; segment .text global asm_main asm_main: enter 0,0 pusha mov eax, [L1] add eax, [L2] mov [ret], eax popa mov eax, [ret] leave ret
Run
다음과 같이 C code를 compile하고, assembly code를 nasm을 통해 compile하고 나온 relocatable file들을 executable file로 만들어준다.
$ gcc -m32 -c main.c $ nasm -f elf hello.asm -o hello.o $ gcc -m32 main.o hello.o -o hello
Print Function
기본적으로 “asm_io.inc” include 파일에선 다양한 debugging 용 print 함수를 제공한다.
Function | Register | Description |
---|---|---|
print_int | eax | eax 주소에 저장된 값을 4 bytes로 출력 |
print_char | eax | eax 주소에 저장된 값을 1 byte로 출력 |
print_string | eax | eax 주소에 저장된 값을 string으로 출력, 즉 \0이 나올 때 까지 출력 |
print_nl | 새로운 라인으로 변경 | |
read_int | eax | 4 byte를 eax로 읽음 |
read_char | 1 byte를 eax로 읽음 | |
dump_regs | Register 값을 16 진수로 출력 dump_regs [identifier] | |
dump_mem | Memory 주소의 값을 16 진수로 출력 dump_mem [identifier] [address] [size of 16 bytes granularity] | |
dump_stack |
Reference
- https://ko.wikipedia.org/wiki/%EB%84%B7%EC%99%80%EC%9D%B4%EB%93%9C_%EC%96%B4%EC%85%88%EB%B8%94%EB%9F%AC