0

アセンブラが 16 ビット コード movzbw (%ax)、%ax のエラーをスローする エラー: `(%ax)' は有効なベース/インデックス式ではありません

ただし、以下の命令は 32 ビット コード生成で有効です。movzbl (%eax), %eax

環境: プロセッサー: Intel(x86) アセンブラー: 「GNU AS」 オペレーティング システム: 「Linux」 目的: 「Hello, World」を画面に出力する非常に単純なブートローダーを作成しているときに、関数に文字列を渡そうとしています。次に、バイトごとにトラバースしてから印刷します。

16 ビット リアル モード コードの書き込みエラーを回避するために使用できる同等の命令は何ですか?

詳細: 以下は、「16 ビット GNU AS」アセンブラーでシミュレートしようとしている C コードです。

void _prints(char*);


int main(void)
{
   char* mess = "hello";
   _prints(mess);
   return 0;
}

void _prints(char* str)
{
   while(*str)
   {
      ++str;
   }
}

注:コマンド「gcc -S test.c」を使用してアセンブリ ファイルを生成しようとすると、_prints 関数に命令「movzbl (%eax), %eax」が表示されます。同じアセンブラを使用して 16 ビットのリアル モード コードをシミュレートしたいのですが、「movzbw (%ax), %ax」の使用中にエラーがスローされます。

助けてください

4

1 に答える 1

2

リアル モードでは、(%ax)( [ax]) は有効な間接アドレス指定方法ではありません。レジスターを使用する必要があり%bpます。Intel (または AMD) プロセッサのマニュアルを手に取り、Volume 2 (Intel 用) を最初から最後まで読むことをお勧めします。

eリアル モードをシミュレートするために を削除するだけの場合は、その必要はありません。プログラムは 16 ビットの実行可能ファイルにコンパイルされません。32 ビットまたは 64 ビットの実行可能ファイルのままgccです。16 個の実行可能ファイルを生成する唯一の方法は、OpenWatcom を使用することです。それでも、16 ビット プログラムを作成する必要はありません。それらは遅く、リアル モードとプロテクト モードの間の切り替え (実行スレッドの変更) は、プロセッサの負荷が高くなります。

これはブートローダー用であると述べたように、このようなブートローダーを作成することはできません。アセンブリを手動で記述する必要があります。私が知っている例外はありません。

于 2013-04-14T08:34:37.040 に答える