[1. 프로그램 메모리 구조]
컴퓨터 프로그램의 메모리 구조는 아래와 그림과 같이 크게 4가지로 구분 된다.
- Code 영역
- text section: CPU가 수행 할 명령어를 저장
- Data 영역
- data section: 초기화 된 전역 변수, static 변수가 저장됨. (const)
- bss section: 초기화 되지 않은 전역 변수, static 변수가 저장 됨
- Heap 영역
- 동적 할당 된 변수가 저장 됨
- Stack 영역
- 그 외 변수가 저장 됨
[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 |