15

objdump -d を実行するたびに、nop 命令 (何もしない命令) のバッチを含む asm コードが常に表示されます。

たとえば、次の同じプログラムを使用します。

#include <stdio.h>
#include <math.h>

int main()
{
    printf("Hello World!\n");
    printf("cos:  %f\n", cos(1));
    return 1;
}

たとえば、objdump には、エントリ ポイントの最後に 2 つの nop があります。

0000000000400450 <_start>:
400450: 31 ed                   xor    %ebp,%ebp
400452: 49 89 d1                mov    %rdx,%r9
400455: 5e                      pop    %rsi
400456: 48 89 e2                mov    %rsp,%rdx
400459: 48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
40045d: 50                      push   %rax
40045e: 54                      push   %rsp
40045f: 49 c7 c0 00 06 40 00    mov    $0x400600,%r8
400466: 48 c7 c1 70 05 40 00    mov    $0x400570,%rcx
40046d: 48 c7 c7 34 05 40 00    mov    $0x400534,%rdi
400474: e8 bf ff ff ff          callq  400438 <__libc_start_main@plt>
400479: f4                      hlt    
40047a: 90                      nop
40047b: 90                      nop 

これは多くの例の 1 つにすぎませんが、その考えは理解できます。C コードがこのようにコンパイルされるのはなぜですか? 前もって感謝します。

4

2 に答える 2

18

次のnop関数を強制的に 4 バイト境界に揃えるために s が追加されます。(最後に続くアドレスnopは 4 で割り切れる 40047c になることに注意してください)

于 2011-05-05T17:32:56.457 に答える
8

非常に多くの場合、これらは単にパディングを行うために使用されるため、単語境界で整列されていない任意のコードへのアクセスは CPU にとってはるかに高価になるため、後続の処理が単語または境界で再び開始されます。

于 2011-05-05T17:32:53.983 に答える