Menu
Coddy logo textTech

dq - クアッドワードの定義

CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 27/45。

dd は4バイトのデータを作成します。しかし、時にはさらに大きな数値やメモリアドレスが必要になることがあります。そのために、dqDefine Quad Word を使用します。

x86アセンブリにおけるクアッドワードは、8バイト(64ビット)です。

構文:

label dq value

例:

section .data
    myNumber dq 10000000000     ; 8バイト、値は100億
    bigNum   dq 123456789012    ; 非常に大きな数
    address  dq msg             ; ラベル "msg" のメモリアドレス

比較表:

ディレクティブサイズ範囲使用するレジスタ
db1 バイト0 から 255al
dw2 バイト0 から 65,535ax
dd4 バイト0 から 4,294,967,295eax
dq8 バイト非常に大きい (2⁶⁴-1)rax

コード内でクアッドワードを使用する方法:

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ビットレジスタです
challenge icon

チャレンジ

簡単

.data セクション内に、値 13800000000 を持つ universe_age という名前のクアッドワードを作成してください。

自分で試してみよう

%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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン