dq - クアッドワードの定義
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 27/45。
ddは4バイトのデータを作成します。しかし、さらに大きな数値やメモリアドレスが必要になることもあります。その場合はdqを使用します。Define Quad Wordです。
x86 アセンブリにおける quad word は 8 bytes(64 ビット)です。
構文:
label dq value例:
section .data
myNumber dq 10000000000 ; 8バイト、値は100億
bigNum dq 123456789012 ; 非常に大きな数
address dq msg ; ラベル "msg" のメモリアドレス比較表:
| 指令 | サイズ | 範囲 | 使用するレジスタ |
|---|---|---|---|
db | 1 byte | 0 to 255 | al |
dw | 2 bytes | 0 to 65,535 | ax |
dd | 4 bytes | 0 to 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 はメモリアドレス(pointer)の格納にも使用されます。
section .data
message db 'Hello', 0
pointer dq message ; messageのアドレスを格納する重要なルール:
| ルール | 説明 |
|---|---|
raxを使ってLoadまたはStoreを行う | raxは64ビットレジスタです |
チャレンジ
簡単universe_age という名前のquad wordを、値13800000000で.dataセクションに作成します。
自分で試してみよう
%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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド