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