ログ

見る価値ありません

C言語に機械語を埋め込む

環境

Windows10 1903

WSL1/Ubuntu 18.04.3 LTS

gcc 7.4.0

コード

#include<stdio.h>

int reduce(int (*funcp)(int, int), int array[], size_t size, int acc){
    if(size == 0){
        return acc;
    }else{
        return reduce(funcp, array + 1, size - 1, (*funcp)(acc, *array));
    }
}

int main(void){
    int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    __attribute__((section(".text")))
    static unsigned char add[] = {
        0x55,                 // push %rbp
        0x48, 0x89, 0xe5,     // mov  %rsp, %rbp
        0x89, 0x7d, 0xfc,     // mov  %edi, -0x4(%rbp)
        0x89, 0x75, 0xf8,     // mov  %esi, -0x8(%rbp)
        0x8b, 0x55, 0xfc,     // mov  -0x4(%rbp), %edx
        0x8b, 0x45, 0xf8,     // mov  -0x8(%rbp), %eax
        0x01, 0xd0,           // add  %edx, %eax
        0x5d,                 // pop  %rbp
        0xc3                  // retq
    };

    printf("%d\n", reduce((int(*)(int, int))add, array, sizeof(array) / sizeof(array[0]), 0)); // => 55

    return 0;
}

注意点