Mixing C and Assembly files

后端 未结 4 980
囚心锁ツ
囚心锁ツ 2020-12-16 23:24

I want to use a naked function in my C++ program using g++. Unfortunately g++, unlike VC++, does not support naked functions and the only way to manage this is to write your

4条回答
  •  情书的邮戳
    2020-12-17 00:25

    In C++ file:

    extern "C" void foo(); // Stop name mangling games
    
    int main() {
      foo();
    }
    

    in "naked" asm file, for x86:

    # modified from http://asm.sourceforge.net/howto/hello.html
    
    .text                   # section declaration
        .global foo
    
    foo:
    
    # write our string to stdout
    
        movl    $len,%edx   # third argument: message length
        movl    $msg,%ecx   # second argument: pointer to message to write
        movl    $1,%ebx     # first argument: file handle (stdout)
        movl    $4,%eax     # system call number (sys_write)
        int $0x80       # call kernel
    
    # and exit
    
        movl    $0,%ebx     # first argument: exit code
        movl    $1,%eax     # system call number (sys_exit)
        int $0x80       # call kernel
    
    .data                   # section declaration
    
    msg:
        .ascii  "Hello, world!\n"   # our dear string
        len = . - msg           # length of our dear string
    

    Compile, assemble and link (with g++ rather than ld because it's much easier to do it that way for C++) and run:

    ajw@rapunzel:/tmp > g++ -Wall -Wextra test.cc -c -o test.o
    ajw@rapunzel:/tmp > as -o asm.o asm.S
    ajw@rapunzel:/tmp > g++ test.o asm.o
    ajw@rapunzel:/tmp > ./a.out
    Hello, world!
    

    If you want to pass arguments to your function or return anything you need to respect the calling conventions.

提交回复
热议问题