dq - 쿼드 워드 정의
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 27번째.
dd는 4바이트의 데이터를 생성합니다. 하지만 때로는 훨씬 더 큰 숫자나 메모리 주소가 필요합니다. 이때는 dq를 사용합니다: 쿼드 워드 정의.
x86 어셈블리에서 quad word는 8바이트(64비트)입니다.
구문:
label dq value예시:
section .data
myNumber dq 10000000000 ; 8바이트, 값 100억
bigNum dq 123456789012 ; 매우 큰 수
address dq msg ; 레이블 "msg"의 메모리 주소비교 표:
| 지시어 | 크기 | 범위 | 사용할 레지스터 |
|---|---|---|---|
db | 1 byte | 0에서 255까지 | al |
dw | 2 bytes | 0에서 65,535까지 | ax |
dd | 4 bytes | 0에서 4,294,967,295까지 | eax |
dq | 8 bytes | Very large (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를 Create합니다.
직접 해보기
%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를 십진수 문자열로 변환
mov rsi, buffer
add rsi, 63 ; 버퍼의 끝으로 이동
mov byte [rsi], 0 ; 널 종료 문자
mov rcx, 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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드