2012-02-02 5 views
2

gcc -m64 -O test.c -save-tempsを実行した後、私は気付いた: mov %edi, %edi が生成されたアセンブリに表示されます。この指示は何かをしますか?それは%ediをそれ自身に移し、効果的に何も達成しません。このアセンブリが生成される理由:

すべての最適化レベルでこのアセンブリが生成されますが、場合によっては配置が異なる場合があります。

さらなる状況を提供する必要がある場合は教えてください。この質問を投稿する時点で、私はさらなる文脈が必要だとは思わないが、私は間違っている可能性がある。手順の

コード:

subl $400, %edi 
cmpl $20, %edi 
ja  .L4 
mov  %edi, %edi 
jmp  *.L11(,%rdi,8) 

これは、switch文のためのジャンプテーブルを参照しています。

C出典:64ビットモードで

int main() 
{ 

} 

int thing(int x) 
{ 

    switch(x) 
    { 
     case 400: 
     return 1; 
     break; 
     case 404: 
     return 2; 
     break; 
     case 408: 
     return 3; 
     break; 
     case 412: 
     return 4; 
     break; 
     case 416: 
     return 5; 
     break; 
     case 420: 
     return 6; 
     break; 
    } 

} 
+0

は、より高い最適化レベルを試してみてください? '-O2'ですか? – Mysticial

+0

実際に、その命令の周りにもっとアセンブリを表示できますか? (アドレスを含む) – Mysticial

+0

うーん...このスニペットのソースも表示できますか? – Mysticial

答えて

5

、32ビット・レジスタで使用mov命令は、デスティネーションレジスタの上位32ビットをゼロであろう。したがって

mov %edi, %edi 

rdiのトップ32ビットをクリアします。

http://en.wikipedia.org/wiki/MOV_%28x86_instruction%29(すべての方法をスクロールダウン)

+0

Doh!私は実現すべきだった。ご協力ありがとうございました。このアーキテクチャに適応するために私はしばらく時間がかかります。 –

+0

私はこれを最初から疑っていましたが、ソースを見つけるのが難しかったです。その後、あなたが64ビット値を持たないソースを投稿したとき、それは明らかになりました。 – Mysticial

+0

これを拡張するには、** all ** 64ビットモードの32ビット命令では、それぞれのレジスタの上位(63〜32)ビットをクリアする必要があります。出典:Intel最適化ガイド、9.2.1「データサイズが32ビットの場合のレガシー32ビット命令の使用」 –

関連する問題