dd - ダブルワードの定義
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 26/45。
dw は2バイトのデータを作成します。しかし、時にはさらに大きな数値が必要になることがあります。そのために、dd — Define Double Word を使用します。
x86アセンブリにおけるダブルワードは、4バイト(32ビット)です。
構文:
label dd value例:
section .data
myNumber dd 50000 ; 4バイト、値 50000
bigNum dd 4000000 ; 4バイト、値 400万
max32 dd 4294967295 ; 32ビットの最大値比較表:
| ディレクティブ | サイズ | 範囲 | 使用するレジスタ |
|---|---|---|---|
db | 1 バイト | 0 から 255 | al |
dw | 2 バイト | 0 から 65,535 | ax |
dd | 4 バイト | 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 を使用します | eax は32ビットレジスタです |
チャレンジ
簡単.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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。