dw - 워드 정의
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 25번째.
db는 1바이트의 데이터를 생성합니다. 하지만 때로는 단일 바이트(0-255)에 들어가지 않는 더 큰 숫자를 저장해야 할 때가 있습니다. 그럴 때는 dw — Define Word를 사용합니다.
x86 어셈블리에서 워드(word)는 2바이트(16비트)입니다.
구문:
label dw valuelabel— 이 메모리 주소에 부여하는 이름dw— Define Word 지시어value— 저장할 숫자 (0 ~ 65,535)
예제:
section .data
smallNum dw 1000 ; 2바이트, 값 1000
bigNum dw 65535 ; 2바이트, 최댓값 (모든 비트가 1)
price dw 499 ; 2바이트, 값 499워드(2바이트) 하나에 저장할 수 있는 것:
| 유형 | 범위 | 예시 |
|---|---|---|
| 작거나 중간 크기의 숫자 | 0 ~ 65,535 | dw 32000 |
| 메모리 오프셋 (16비트) | 0 ~ 65,535 | dw 0x7FFF |
한 줄에 여러 개의 워드:
section .data
values dw 100, 200, 300, 400 ; 4개의 워드 생성 (총 8바이트)코드에서 word를 사용하는 방법:
word는 2바이트이므로, 16비트 레지스터인 ax(al이 아님)를 사용합니다:
section .data
myWord dw 1000
section .text
mov ax, [myWord] ; ax에 1000 값을 로드합니다
add ax, 500 ; ax는 1500이 됩니다
mov [myWord], ax ; 1500을 다시 myWord에 저장합니다비교: db vs dw
| 지시어 | 크기 | 범위 | 사용할 레지스터 |
|---|---|---|---|
db | 1 바이트 | 0 ~ 255 | al |
dw | 2 바이트 | 0 ~ 65,535 | ax |
챌린지
쉬움.data 섹션에 값이 25000인 population이라는 이름의 word를 생성하세요.
직접 해보기
%include "data.asm"
section .data
msg db 'population = '
msg_len equ $ - msg
newline db 0xa
section .bss
buffer resb 16
section .text
global _start
_start:
; ax에 word 값을 로드
mov ax, [population]
; ax를 10진수 문자열로 변환
mov rsi, buffer
add rsi, 15 ; 버퍼의 끝으로 이동
mov byte [rsi], 0 ; 널 종료 문자
mov cx, 10 ; 10진수 변환을 위한 제수
convert_loop:
xor dx, dx ; 나눗셈을 위해 dx를 비움
div cx ; ax를 10으로 나눔, ax = 몫, dx = 나머지
add dl, '0' ; 나머지를 ASCII로 변환
dec rsi
mov [rsi], dl ; 숫자를 저장
cmp ax, 0
jnz convert_loop
; 값이 덮어씌워지기 전에 숫자 포인터와 길이를 저장
mov r8, rsi ; r8 = 첫 번째 숫자에 대한 포인터
mov r9, buffer
add r9, 15
sub r9, rsi ; r9 = 숫자의 개수
; 메시지 출력
mov rax, 1
mov rdi, 1
mov rdx, msg_len
mov rsi, msg
syscall
; 숫자 출력
mov rax, 1
mov rdi, 1
mov rsi, r8
mov rdx, r9
syscall
; 줄바꿈 출력
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; 종료
mov rax, 60
mov rdi, 0
syscall
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.