1

私は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も使用できるため、問題は依然として存在します。

4

2 に答える 2

2

あなたの質問には複数のタイプミスがあると思います :-) まず、16 ビット モードでは [bp][bx][si][di] はすべて有効なアドレッシング モードです。古い 8086 でも [bx] を実効アドレスとして使用できます。[dx] は 16 ビット モードでは使用できないため、32 ビット モードで実行する必要があります。あなたのラインと一緒に

mov dx, msg

前に

mov al, byte [bx]

あなたが実際に「mov al, [dx]」と書き、nasm が [dx] を無効なアドレスとして正しく不平を言っていると思います。したがって、[bx] を使用できないことがわかったのであれば、間違っていました。「d」の代わりに「b」のスペルを間違えないように、もっと注意する必要があることがわかりました。

于 2011-04-18T15:29:53.177 に答える
1

エラーがこの行にないことを確認しますか?

mov ds, data

おそらくあなたは次のことを意味しました:

mov ds, ax
于 2011-04-17T03:30:03.010 に答える