らんだむな記憶

blogというものを体験してみようか!的なー

インラインアセンブラ

やや不安は残るが試しに書いてみた。

#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 が何で入ってくるのかは今はまだ分からないけど。