Menu
Coddy logo textTech

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ビットの最大値

比較表:

ディレクティブサイズ範囲使用するレジスター
db1 byte0 から 255al
dw2 bytes0 から 65,535ax
dd4 bytes0 から 4,294,967,295eax

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

チャレンジ

簡単

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

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

基礎のすべてのレッスン

自分で練習してみよう: Assemblyプレイグラウンド