私はBochsを使用してDOS用のコードを書いています。NASMを使用してプログラムをコンパイルし
ています。次のコードがあるとします。
[BITS 16]
SEGMENT code
..start:
mov ax, data
mov ds, ax
mov bx, msg
mov al, byte [bx]
int 21h
SEGMENT data
msg DB "teststring", 00h
nasmが次のように文句を言うのはなぜですか。
mov al, byte [bx]
無効な実効アドレスの?
bx iを使用する代わりにsiレジストリを使用する場合、プログラムは想定どおりに作品をコンパイルし、 tのASCII値をalにロードします。
それはなぜです?
編集:インデックス作成にBXを使用できないことがわかりました。
データセグメントの特定の部分でポイントされているものをロードしたい場合は、次のようにすることができます。
mov ax, data
mov ds, ax
mov si, msg
mov al, byte [si] ; Loading first char
inc si
mov al, byte [si] ; Loading second char
siが文字列の先頭を指し続けるようにしたい場合は、BXをオフセットとして使用できます。
mov al, byte [si + bx]
あるいは
mov al, byte [si + n] ; where n is an integer value
しかし、私の理解では、bxも使用できるため、問題は依然として存在します。