やや不安は残るが試しに書いてみた。
#include <stdio.h> static int return_ret(void) { __asm__("mov eax,0x3"); } int main(void) { int ret = return_ret(); printf("%d\n", ret); return 0; }
これを clang
でコンパイルすると
$ clang -O0 -g -masm=intel main.c main.c:6:1: warning: control reaches end of non-void function [-Wreturn-type] } ^ main.c:5:10: error: unknown use of instruction mnemonic without a size suffix
ってなってよく分からないので、とりあえず今回は gcc
で。
$ gcc -O0 -g -masm=intel main.c $ ./a.out 3
ちょっと不思議な気持ち。普通に C で「return 3;
」した場合との違いを objdump
で比較すると、
[インラインアセンブラ使用版]
static int return_ret(void) { 000000000000064a <return_ret> push rbp 000000000000064b <return_ret+0x1> mov rbp,rsp __asm__("mov eax,0x3"); 000000000000064e <return_ret+0x4> mov eax,0x3 } 0000000000000653 <return_ret+0x9> nop 0000000000000654 <return_ret+0xa> pop rbp 0000000000000655 <return_ret+0xb> ret
[非使用版]
static int return_ret(void) { 000000000000064a <return_ret> push rbp 000000000000064b <return_ret+0x1> mov rbp,rsp return 3; 000000000000064e <return_ret+0x4> mov eax,0x3 } 0000000000000653 <return_ret+0x9> pop rbp 0000000000000654 <return_ret+0xa> ret
で一応問題なさそうに見える。nop
が何で入ってくるのかは今はまだ分からないけど。