2

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行でセグメンテーション違反が発生します。

なぜこれが機能しないのですか?

4

1 に答える 1

3

at&t 構文の特殊性を除いて、すべてが正しく行われています。$即値には符号が必要で、そこではアドレスを即値として使用します。だからあなたが本当に欲しいのはaddl $dict, %eax. アドレスでメモリから値をロードしdict、後でそれをアドレスとして使用したため、障害が発生しました。

于 2015-04-07T17:36:52.207 に答える