dq - クアッドワードの定義
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 27/45。
dd は4バイトのデータを作成します。しかし、時にはさらに大きな数値やメモリアドレスが必要になることがあります。そのために、dq — Define Quad Word を使用します。
x86アセンブリにおけるクアッドワードは、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 |
コード内でクアッドワードを使用する方法:
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 という名前のクアッドワードを作成してください。
自分で試してみよう
%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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。