dq - 쿼드 워드 정의
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 27번째.
dd는 4바이트의 데이터를 생성합니다. 하지만 때로는 더 큰 숫자나 메모리 주소가 필요할 때가 있습니다. 그럴 때는 dq — Define Quad Word를 사용합니다.
x86 어셈블리에서 quad word는 8바이트(64비트)입니다.
구문:
label dq value예제:
section .data
myNumber dq 10000000000 ; 8바이트, 값 100억
bigNum dq 123456789012 ; 매우 큰 숫자
address dq msg ; "msg" 레이블의 메모리 주소비교 표:
| 지시어 | 크기 | 범위 | 사용할 레지스터 |
|---|---|---|---|
db | 1 바이트 | 0 ~ 255 | al |
dw | 2 바이트 | 0 ~ 65,535 | ax |
dd | 4 바이트 | 0 ~ 4,294,967,295 | eax |
dq | 8 바이트 | 매우 큼 (2⁶⁴-1) | rax |
코드에서 쿼드 워드(quad word)를 사용하는 방법:
section .data
myNumber dq 5000000000
section .text
mov rax, [myNumber] ; rax에 값을 로드합니다
add rax, 1000000000 ; rax는 60억이 됩니다
mov [myNumber], rax ; 다시 저장합니다특수 용도: 주소 저장
dq는 메모리 주소(포인터)를 저장하는 데에도 사용됩니다:
section .data
message db 'Hello', 0
pointer dq message ; message의 주소를 저장합니다중요한 규칙:
| 규칙 | 설명 |
|---|---|
로드하거나 저장하려면 rax를 사용하세요 | rax는 64비트 레지스터입니다 |
챌린지
쉬움.data 섹션에 값이 13800000000인 universe_age라는 이름의 quad word를 생성하세요.
직접 해보기
%include "data.asm"
section .data
msg db 'universe_age = '
msg_len equ $ - msg
newline db 0xa
section .bss
buffer resb 64
section .text
global _start
_start:
; rax에 쿼드 워드 값을 로드합니다
mov rax, [universe_age]
; rax를 10진수 문자열로 변환합니다
mov rsi, buffer
add rsi, 63 ; 버퍼의 끝으로 이동합니다
mov byte [rsi], 0 ; 널 종료 문자
mov rcx, 10 ; 10진수 변환을 위한 제수
convert_loop:
xor rdx, rdx ; 나눗셈을 위해 rdx를 비웁니다
div rcx ; rax를 10으로 나눕니다, rax = 몫, rdx = 나머지
add dl, '0' ; 나머지를 ASCII로 변환합니다
dec rsi
mov [rsi], dl ; 숫자를 저장합니다
cmp rax, 0
jnz convert_loop
; 값이 덮어씌워지기 전에 숫자 포인터와 길이를 저장합니다
mov r8, rsi ; r8 = 첫 번째 숫자에 대한 포인터
mov r9, buffer
add r9, 63
sub r9, rsi ; r9 = 숫자의 개수
; 메시지 출력
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.