본문 바로가기

Assembly

x86 assembly code 구조

[1. 프로그램 메모리 구조]

컴퓨터 프로그램의 메모리 구조는 아래와 그림과 같이 크게 4가지로 구분 된다.

  1. Code 영역
    1. text section: CPU가 수행 할 명령어를 저장
  2. Data 영역
    1. data section: 초기화 된 전역 변수, static 변수가 저장됨. (const)
    2. bss section: 초기화 되지 않은 전역 변수, static 변수가 저장 됨
  3. Heap 영역
    1. 동적 할당 된 변수가 저장 됨
  4. Stack 영역
    1. 그 외 변수가 저장 됨

 

[2. Assembly code structure]

어셈블리 코드 구조 역시 위와 같은 구조로 작성 할 수 있다.

section .data
        str1 db "hello world", 0xa ; label str1 store 'hello world\n' string
        lenstr1 equ $-str1         ; label lenstr1 store str1 length
                                   ; $ is current address

section .bss
        value resb 32               ; reserve byte

section .text
        global _start

_start:
        mov rax, 1
        mov rdi, 1
        mov rsi, str1
        mov rdx, lenstr1
        syscall

        mov DWORD [value], 55

        mov rax, 60
        mov rdi, [value]          ; echo $?
        syscall

section .data 에는 초기화 된 값들을 위치시킨다.

이 때에는 DB, DW, DD, DQ, DT, DDQ

명령어를 사용한다.이 명령어는 x86 machine 은 실제로 지원하지 않는 pseudo instruction 이다.그래서 str1 label 은 byte 단위로 값이 정의 된 시작 주소를 갖게 된다.

 

equ 역시 pseudo instruction 이며 symbol 에 상수 값을 정의 할 때 사용한다.nasm 은 두개의 특수 토큰을 지원하는데 $ 와 $$ 이다.$ 는 해당 label 의 시작주소를 의미한다.$$ 는 현재 section 의 시작주소를 의미한다.따라서 lenstr1 은 현재 시작 주소에서 str1 의 시작주소를 빼기 때문에, str1 의 문자열 길이를 의미한다.

 

section .bss 에는 초기화되지 않는 곳이다.여기서는 RESB, RESW, RESD, RESQ, REST, RESDQ 명령어를 사용하여, 메모리 공간만 할당한다.

코드에서는 32 bytes 만 할당하였다.

 

그리고 indirect addressing mode 를 이용하여 이 메모리 공간에 55 라는 값을 저장하고,

프로그램 종료 시 이 값을 리턴 하고 있다.

 

[3. Label, 주석]

 

 

 

[4. 참고자료]

https://www.tortall.net/projects/yasm/manual/html/nasm-pseudop.html

https://www.tortall.net/projects/yasm/manual/html/nasm-expr.html

'Assembly' 카테고리의 다른 글

x86 assembly data move instruction  (0) 2022.01.09
x86 assembly 디버깅 및 개발환경 구축  (0) 2021.12.21
x86 assembly system call  (0) 2021.12.11
x86 assembly 개요  (0) 2021.12.11