.data 섹션
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 23번째.
2장에서는 메모리에서 값을 불러오고 메모리에 값을 저장했습니다. 그런데 그 메모리는 어디서 온 걸까요? 누가 num1, num2, result를 만들었을까요?
정답은 .data 섹션입니다. 이곳에서 메모리에 자신만의 데이터를 만듭니다.
.data 섹션이란 무엇인가요?
.data 섹션은 프로그램이 실행되기 전에 메모리에 저장될 데이터를 정의하는 어셈블리 프로그램의 일부입니다.
구문:
section .data
; 여기에 데이터 정의를 작성하세요필요한 이유:
| .data 섹션이 없는 경우 | .data 섹션이 있는 경우 |
|---|---|
| 사용할 데이터가 없습니다 | 숫자, 문자열 및 변수를 만들 수 있습니다 |
| 메모리 주소를 알 수 없습니다 | myNumber 또는 message와 같은 레이블을 사용할 수 있습니다 |
| 코드를 테스트할 수 없습니다 | 만든 데이터를 불러오고 저장할 수 있습니다 |
간단한 예:
section .data
age db 25 ; 값이 25인 "age"라는 바이트를 만듭니다
price dw 1000 ; 값이 1000인 "price"라는 워드를 만듭니다
name db 'Bob' ; 문자 B, o, b로 이루어진 "name"이라는 문자열을 만듭니다파일에서의 위치:
0장에서 배운 두 파일 패턴을 기억하세요:
| 파일 | 내용 |
|---|---|
data.asm | 데이터 정의가 포함된 section .data |
main.asm | %include "data.asm" 다음에 코드가 포함된 section .text |
프로그램이 실행될 때 일어나는 일:
- 운영 체제가 프로그램을 메모리에 로드합니다
.data섹션을 읽고 데이터를 특정 메모리 주소에 배치합니다
- 레이블(
age,price,name)은 주소가 됩니다 - 이제 코드는
[age],[price],[name]을 사용해 이러한 주소에 접근할 수 있습니다
중요한 규칙:
| 규칙 | 설명 |
|---|---|
| 데이터를 한곳에 모아 두세요 | section .data를 두 번 이상 열 수도 있지만(어셈블러가 각 부분을 합칩니다), data.asm의 한 섹션에 모아 두는 편이 읽기 쉽습니다 |
| 레이블은 고유해야 합니다 | age 레이블을 두 개 만들 수 없습니다 |
| 코드가 실행되기 전에 데이터가 생성됩니다 | _start가 시작될 때 바로 사용할 수 있습니다 |
다음 수업에서는 db, dw, dd, dq를 사용하여 다양한 유형의 데이터를 정의하는 방법을 배우게 됩니다.
챌린지
data.asm 파일에 다음을 수행하는 코드를 작성하세요:
.data섹션을 만드세요- 값이 5인
count라는 바이트를 만드세요
직접 해보기
%include "data.asm"
section .text
global _start
_start:
; count의 값을 al로 불러오기
mov al, [count]
; 출력할 수 있도록 값 저장하기
mov r12, rax
; ASCII로 변환하여 출력하기 (0-9만 해당)
add al, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; 종료하기
mov rax, 60
mov rdi, 0
syscall
section .bss
digit resb 1이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드