我正在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.
所以我想知道我在构建这个测试的过程中错过了什么。
我发表了神乐坂小鸟的答案。 从*.S和*.c文件在Linux中建立一个执行器的命令。
gcc -c test.S -o test.o
gcc -c main.c -o main.o
gcc test.o main.o -o testmain