dd - ダブルワードの定義
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 26/45。
dwは2バイトのデータを作成します。しかし、さらに大きな数値が必要になることもあります。その場合はddを使用します:Define Double Word。
x86アセンブリにおけるdouble wordは4バイト(32ビット)です。
構文:
label dd value例:
section .data
myNumber dd 50000 ; 4バイト、値 50000
bigNum dd 4000000 ; 4バイト、値 400万
max32 dd 4294967295 ; 32ビットの最大値比較表:
| ディレクティブ | サイズ | 範囲 | 使用するレジスター |
|---|---|---|---|
db | 1 byte | 0 から 255 | al |
dw | 2 bytes | 0 から 65,535 | ax |
dd | 4 bytes | 0 から 4,294,967,295 | eax |
コードで double word を使用する方法:
section .data
myNumber dd 50000
section .text
mov eax, [myNumber] ; 値をeaxにロード
add eax, 10000 ; eaxが60000になる
mov [myNumber], eax ; 書き戻す重要なルール:
| ルール | 説明 |
|---|---|
eax を使って Load または Store を行う | eax は32ビットレジスタです |
チャレンジ
簡単Create distance called(名前)のダブルワードを、値 125000 として .data section に作成します。
自分で試してみよう
%include "data.asm"
section .data
msg db 'distance = '
msg_len equ $ - msg
newline db 0xa
section .bss
buffer resb 32
section .text
global _start
_start:
; ダブルワード値をeaxにロードする
mov eax, [distance]
; eaxを10進数文字列に変換する
mov rsi, buffer
add rsi, 31 ; バッファの末尾へ移動する
mov byte [rsi], 0 ; ヌル終端文字
mov ecx, 10 ; 10進変換用の除数
convert_loop:
xor edx, edx ; 除算のためにedxをクリアする
div ecx ; eaxを10で除算する。eax = 商、edx = 余り
add dl, '0' ; 余りをASCIIに変換する
dec rsi
mov [rsi], dl ; 桁を格納する
cmp eax, 0
jnz convert_loop
; 上書きされる前に桁のポインタと長さを保存する
mov r8, rsi ; r8 = 最初の桁へのポインタ
mov r9, buffer
add r9, 31
sub r9, rsi ; r9 = 桁数
; メッセージを出力
mov rax, 1
mov rdi, 1
mov rdx, msg_len
mov rsi, msg
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プレイグラウンド