Menu
Coddy logo textTech

dw - ワードの定義

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

db は1バイトのデータを作成します。しかし、1バイト(0-255)に収まらない大きな数値を格納する必要がある場合があります。そのためには、dwDefine Word を使用します。

x86アセンブリにおけるワードは2バイト(16ビット)です。

構文:

label dw value
  • label — このメモリアドレスに付ける名前
  • dw — Define Word(ワード定義)ディレクティブ
  • value — 格納する数値(0から65,535まで)

例:

section .data
    smallNum dw 1000       ; 2バイト、値 1000
    bigNum   dw 65535      ; 2バイト、最大値(すべてのビットが1)
    price    dw 499        ; 2バイト、値 499

1ワード(2バイト)に格納できるもの:

タイプ範囲
小規模から中規模の数値0 から 65,535dw 32000
メモリオフセット(16ビット)0 から 65,535dw 0x7FFF

1行に複数のワード:

section .data
    values dw 100, 200, 300, 400    ; 4つのワード(計8バイト)を作成します

コード内でワード(word)を使用する方法:

ワードは2バイトなので、16ビットレジスタの axal ではなく)を使用します:

section .data
    myWord dw 1000

section .text
    mov ax, [myWord]    ; axに値1000を読み込む
    add ax, 500         ; axは1500になる
    mov [myWord], ax    ; 1500をmyWordに保存する

比較: db 対 dw

ディレクティブサイズ範囲使用するレジスタ
db1 バイト0 から 255al
dw2 バイト0 から 65,535ax
challenge icon

チャレンジ

簡単

.data セクションに、値 25000 を持つ population という名前の word を作成してください。

自分で試してみよう

%include "data.asm"

section .data
    msg db 'population = '
    msg_len equ $ - msg
    newline db 0xa

section .bss
    buffer resb 16

section .text
    global _start

_start:
    ; axにワード値をロードする
    mov ax, [population]
    
    ; axを10進数の文字列に変換する
    mov rsi, buffer
    add rsi, 15          ; バッファの末尾に移動
    mov byte [rsi], 0    ; ヌル終端文字
    
    mov cx, 10           ; 10進数変換用の除数
    
convert_loop:
    xor dx, dx           ; 除算のためにdxをクリア
    div cx               ; axを10で割る。ax = 商、dx = 余り
    add dl, '0'          ; 余りをASCIIに変換
    dec rsi
    mov [rsi], dl        ; 桁を格納
    cmp ax, 0
    jnz convert_loop

    ; 上書きされる前に桁のポインタと長さを保存
    mov r8, rsi          ; r8 = 最初の桁へのポインタ
    mov r9, buffer
    add r9, 15
    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腕試し

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

基礎のすべてのレッスン