Ubuntu で x86 AT&T アセンブリを使用しています。
ベース インデックス モードなどの複雑な間接アドレッシング モードを単純な間接アドレッシング モードに書き換える必要があります。
たとえば、次のスニペットを見てください。
.L4:
movl i, %eax
movzbl ch, %edx
movb %dl, dict(%eax)
この行movb %dl, dict(%eax)
は、インデックス付きアドレス指定に基づいていると思います。それが何をするかというdict+%eax
と、それを取得して逆参照し、そこに配置%dl
するということですよね?
単純な間接アドレッシングにするために、次のように記述しました。
.L4:
movl i, %eax
movzbl ch, %edx
addl dict, %eax
movb %dl, (%eax)
ご覧のとおり、最初に追加dict
し%eax
て結果を配置し%eax
ました。次に、次の行で結果を逆参照します。
これは上記と同じように機能するはずですよね?
それもコンパイルされますが、実行すると、新しいmovb
行でセグメンテーション違反が発生します。
なぜこれが機能しないのですか?