Linux,  Programming

[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 뼈대를 나타낼 수 있다.

  1. Include direction
  2. DX direction
  3. RESX direction
  4. 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 함수를 제공한다.

FunctionRegisterDescription
print_inteaxeax 주소에 저장된 값을 4 bytes로 출력
print_chareaxeax 주소에 저장된 값을 1 byte로 출력
print_stringeaxeax 주소에 저장된 값을 string으로 출력, 즉 \0이 나올 때 까지 출력
print_nl새로운 라인으로 변경
read_inteax4 byte를 eax로 읽음
read_char1 byte를 eax로 읽음
dump_regsRegister 값을 16 진수로 출력
dump_regs [identifier]
dump_memMemory 주소의 값을 16 진수로 출력
dump_mem [identifier] [address] [size of 16 bytes granularity]
dump_stack

Reference

  1. 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

Leave a Reply

Your email address will not be published. Required fields are marked *