7

誰かがこのコードの理由を説明できますか:

#include <stdio.h>

int main()
{
  return 0;
}

tcc code.c を使用して tcc でコンパイルすると、次のasm が生成されます。

00401000  |.  55               PUSH EBP
00401001  |.  89E5             MOV EBP,ESP
00401003  |.  81EC 00000000    SUB ESP,0
00401009  |.  90               NOP
0040100A  |.  B8 00000000      MOV EAX,0
0040100F  |.  E9 00000000      JMP fmt_vuln1.00401014
00401014  |.  C9               LEAVE
00401015  |.  C3               RETN

だと思います

00401009  |.  90   NOP

いくつかのメモリ調整のためにあるかもしれませんが、どうですか

0040100F  |.  E9 00000000     JMP fmt_vuln1.00401014
00401014  |.  C9              LEAVE

つまり、コンパイラが次の命令にジャンプするニアジャンプを挿入するのはなぜですか? とにかく LEAVE が実行されるのでしょうか?

TCC 0.9.26 を使用して 32 ビットの実行可能ファイルを生成する 64 ビットの Windows を使用しています。

4

2 に答える 2