dd - 더블 워드 정의
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 26번째.
dw는 2바이트의 데이터를 생성합니다. 하지만 때로는 더 큰 숫자가 필요할 때가 있습니다. 그럴 때는 dd — Define Double Word를 사용합니다.
x86 어셈블리에서 더블 워드(double word)는 4바이트(32비트)입니다.
구문:
label dd value예제:
section .data
myNumber dd 50000 ; 4바이트, 값 50000
bigNum dd 4000000 ; 4바이트, 값 400만
max32 dd 4294967295 ; 최대 32비트 값비교 표:
| 지시어 | 크기 | 범위 | 사용할 레지스터 |
|---|---|---|---|
db | 1 바이트 | 0 ~ 255 | al |
dw | 2 바이트 | 0 ~ 65,535 | ax |
dd | 4 바이트 | 0 ~ 4,294,967,295 | eax |
코드에서 double word를 사용하는 방법:
section .data
myNumber dd 50000
section .text
mov eax, [myNumber] ; eax에 값을 로드합니다
add eax, 10000 ; eax는 60000이 됩니다
mov [myNumber], eax ; 다시 저장합니다중요한 규칙:
| 규칙 | 설명 |
|---|---|
로드하거나 저장하려면 eax를 사용하세요 | eax는 32비트 레지스터입니다 |
챌린지
쉬움.data 섹션에 값이 125000인 distance라는 이름의 double word를 생성하세요.
직접 해보기
%include "data.asm"
section .data
msg db 'distance = '
msg_len equ $ - msg
newline db 0xa
section .bss
buffer resb 32
section .text
global _start
_start:
; eax에 double word 값을 로드합니다
mov eax, [distance]
; eax를 10진수 문자열로 변환합니다
mov rsi, buffer
add rsi, 31 ; 버퍼의 끝으로 이동합니다
mov byte [rsi], 0 ; 널 종료 문자
mov ecx, 10 ; 10진수 변환을 위한 제수
convert_loop:
xor edx, edx ; 나눗셈을 위해 edx를 0으로 초기화합니다
div ecx ; eax를 10으로 나눕니다, eax = 몫, edx = 나머지
add dl, '0' ; 나머지를 ASCII로 변환합니다
dec rsi
mov [rsi], dl ; 숫자를 저장합니다
cmp eax, 0
jnz convert_loop
; 값이 덮어씌워지기 전에 숫자 포인터와 길이를 저장합니다
mov r8, rsi ; r8 = 첫 번째 숫자에 대한 포인터
mov r9, buffer
add r9, 31
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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.