1

特定のデータをメモリ位置0x4000に保存しました。データが画面に印刷されるように、そこからメモリ位置0xb800にバイトを渡したいと思いました。この問題は、0xb800:0に格納しようとすると発生します。これは、 0x4000:0にあると想定する最初のバイトです。例として使用したコードは次のとおりです。

mov ax, 0xb800
mov es, ax
mov byte [es:0], 'A'

これは正常にコンパイルされ、完全に実行されますが、私が適応させようとしているものは、NASMで「無効なセグメントオーバーライド」エラーをスローします。これが私の機能しないコードです:

mov ax, 0xb800
mov es, ax
mov byte [es:0], byte [0x4000:0]

ESセグメントを使用して0x4000:[offset]から1バイトを取得し、それを0xb800:[offset]にフィードすることは可能ですか?もしそうなら、どのように?

4

1 に答える 1

1

これを行うことはできますが、あなたが持っているような単一の命令でそれを行うことはできません。dsなどの別のセグメントレジスタと中間レジスタ(alここ)を使用する必要があります。

mov ax, 0x4000
mov ds, ax
mov ax, 0xb800
mov es, ax
mov al, [ds:0]
mov [es:0], al

ds他の場所で指摘されている場合は、それも考慮する必要があることに注意してください(保存して復元するなど)。

于 2012-08-16T03:12:37.447 に答える