如何在Linux中编译X86汇编并调用它的函数?

问题描述 投票:0回答:1

我正在Ubuntu 18.04 X86_64中测试一个X86汇编代码,如下所示。


    #define I8042_DATA_REG          $0x60
    #define I8042_STATUS_REG        $0x64

    .globl   flashy

    .text
    /* Flash 16 times */
    movl    $0x10, %ebx
    flashy:
    /* Turn on LEDs, don't trust stack at this point */
    1:  inb     I8042_STATUS_REG, %al
    testb   $0x02, %al
    jne     1b
    movb    $0xed, %al
    outb    %al, I8042_DATA_REG

    movl    $0x1000, %eax
    1:  subl    $1, %eax
    cmpl    $0, %eax
    jne     1b

    1:  inb     I8042_STATUS_REG, %al
    testb   $0x02, %al
    jne     1b

    movl    $0x1000, %eax
    1:  subl    $1, %eax
    cmpl    $0, %eax
    jne     1b

    /* LEDs ON */
    movb    $0x07, %al
    outb    %al, I8042_DATA_REG

    /* delay */
    movl    $0x07878787, %eax
    1:  subl    $1, %eax
    cmpl    $0, %eax
    jne     1b

    sub     $1, %ebx
    cmpl    $0, %ebx
    jne     flashy

我写了一个简单的main.c来调用上述汇编中的flashy()函数。


    extern void flashy(void);

    int main()
    {
        flashy();
        return 0;
    }

我把它们编译成

gcc -S test.S -o test.o  
gcc -c main.c -o main.o
ld main.o test.o -o testmain 

我收到了ld的警告,如下所示,ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0 and I can not run the generated testmain.

所以我想知道我在构建这个测试的过程中错过了什么。

assembly x86-64
1个回答
0
投票

我发表了神乐坂小鸟的答案。 从*.S和*.c文件在Linux中建立一个执行器的命令。

gcc -c test.S -o test.o  
gcc -c main.c -o main.o  
gcc test.o main.o -o testmain
© www.soinside.com 2019 - 2024. All rights reserved.