誰かがこのコードの理由を説明できますか:
#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 を使用しています。