Menu
Coddy logo textTech

dd - ダブルワードの定義

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

dw は2バイトのデータを作成します。しかし、時にはさらに大きな数値が必要になることがあります。そのために、ddDefine Double Word を使用します。

x86アセンブリにおけるダブルワードは、4バイト(32ビット)です。

構文:

label dd value

例:

section .data
    myNumber dd 50000        ; 4バイト、値 50000
    bigNum   dd 4000000      ; 4バイト、値 400万
    max32    dd 4294967295   ; 32ビットの最大値

比較表:

ディレクティブサイズ範囲使用するレジスタ
db1 バイト0 から 255al
dw2 バイト0 から 65,535ax
dd4 バイト0 から 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 を使用しますeax は32ビットレジスタです
challenge icon

チャレンジ

簡単

.data セクションに、値 125000 を持つ distance という名前のダブルワードを作成してください。

自分で試してみよう

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

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

基礎のすべてのレッスン