dw - ワードの定義
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 25/45。
db は 1 バイトのデータを作成します。しかし、1 バイト(0-255)に収まらない、より大きな数値を保存する必要がある場合もあります。そのために dw を使用します。Define Word です。
x86アセンブリにおけるwordは2バイト(16ビット)です。
構文:
label dw valuelabel:このメモリアドレスに付ける名前dw:Define Wordディレクティブvalue:格納するnumber(0~65,535)
例:
section .data
smallNum dw 1000 ; 2バイト、値1000
bigNum dw 65535 ; 2バイト、最大値(全ビットが1)
price dw 499 ; 2バイト、値4991つのword(2バイト)に格納できるもの:
| 種類 | 範囲 | 例 |
|---|---|---|
| 小〜中程度のnumber | 0 to 65,535 | dw 32000 |
| メモリオフセット(16-bit) | 0 to 65,535 | dw 0x7FFF |
1行に複数の単語:
section .data
values dw 100, 200, 300, 400 ; 4つのワードを作成します(合計8バイト)コードでwordを使用する方法:
wordは2 bytesなので、16-bit register ax(alではなく)を使用します:
section .data
myWord dw 1000
section .text
mov ax, [myWord] ; 値 1000 を ax にロードする
add ax, 500 ; ax が 1500 になる
mov [myWord], ax ; 1500 を myWord に格納し直す比較: db と dw
| ディレクティブ | サイズ | 範囲 | 使用するレジスタ |
|---|---|---|---|
db | 1 byte | 0 to 255 | al |
dw | 2 bytes | 0 to 65,535 | ax |
チャレンジ
簡単population という名前の word を、値 25000 で .data セクションに作成します。
自分で試してみよう
%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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド