2017-02-21 376 views
1

文件assem.s包含汇编代码中的函数。 test.c调用函数,但我发现了以下错误:如何将汇编文件(.s文件)链接到C程序

mips-mti-elf-gcc -o test test.c assem.s 
In file included from test.c:2:0: 
assem.s:1:2: error: expected identifier or '(' before '.' token 
    .text 
^
assem.s:3:22: error: stray '@' in program 
    .type asm_memcheck, @function 
        ^

assem.s: Assemble messages: 
assem.s:6: Warning: used $at without ".set noat" 
assem.s:38: Warning: .end directive without a preceding .ent directive 

我的源文件如下: test.c注意局部变量a,b,c和d在程序中没有意义。它主要用于观察寄存器中的值。

1 #include<stdio.h> 
    2 #include"assem.s" 
    3 
    4 extern void asm_memcheck(); 
    5 
    6 int main() 
    7 { 
    8 int a=1; 
    9 int b=2; 
10 int c=3; 
11 float d=4.0; 
12 
13 asm_memcheck(); 
14 
15 } 
16 

assem.s:

1   .text 
    2   .globl asm_memcheck 
    3   .type asm_memcheck, @function 
    4 asm_memcheck: 
    5   sw $zero,0xFFF00000 
    6   sw $at,0xFFF00004 
    7   sw $v0,0xFFF00008 
    8   sw $v1,0xFFF0000C 
    9   sw $a0,0xFFF00010 
10   sw $a1,0xFFF00014 
11   sw $a2,0xFFF00018 
12   sw $a3,0xFFF0001C 
13   sw $t0,0xFFF00020 
14   sw $t1,0xFFF00024 
15   sw $t2,0xFFF00028 
16   sw $t3,0xFFF0002C 
17   sw $t4,0xFFF00030 
18   sw $t5,0xFFF00034 
19   sw $t6,0xFFF00038 
20   sw $t7,0xFFF0003C 
21   sw $s0,0xFFF00040 
22   sw $s1,0xFFF00044 
23   sw $s2,0xFFF00048 
24   sw $s3,0xFFF0004C 
25   sw $s4,0xFFF00050 
26   sw $s5,0xFFF00054 
27   sw $s6,0xFFF00058 
28   sw $s7,0xFFF0005C 
29   sw $t8,0xFFF00060 
30   sw $t9,0xFFF00064 
31   sw $k0,0xFFF00068 
32   sw $k1,0xFFF0006C 
33   sw $gp,0xFFF00070 
34   sw $sp,0xFFF00074 
35   sw $fp,0xFFF00078 
36   sw $ra,0xFFF0007C 
37 
38   .end asm_memcheck 
39 

回答

3

您看到的问题来自#include"assem.s"行:C编译器尝试读取汇编代码,因为它是C代码。

所以,不包括"assem.s"在C代码:

test.c的

#include<stdio.h> 
extern void asm_memcheck(); 

int main() 
{ 
    int a=1; 
    int b=2; 
    int c=3; 
    float d=4.0; 
    asm_memcheck(); 
} 

,并建立为你写之前:

mips-mti-elf-gcc -o test test.c assem.s 
2

如果你只是想将它作为一个快速的黑客,你可以内嵌了。

#include <stdio.h> 

int main() 
{ 
    int a=1; 
    int b=2; 
    int c=3; 
    float d=4.0; 

    asm("sw $zero,0xFFF00000\n\t" 
     "sw $at,0xFFF00004\n\t" 
     "sw $v0,0xFFF00008\n\t" 
     "sw $v1,0xFFF0000C\n\t" 
     "sw $a0,0xFFF00010\n\t" 
     "sw $a1,0xFFF00014\n\t" 
     "sw $a2,0xFFF00018\n\t" 
     "sw $a3,0xFFF0001C\n\t" 
     "sw $t0,0xFFF00020\n\t" 
     "sw $t1,0xFFF00024\n\t" 
     "sw $t2,0xFFF00028\n\t" 
     "sw $t3,0xFFF0002C\n\t" 
     "sw $t4,0xFFF00030\n\t" 
     "sw $t5,0xFFF00034\n\t" 
     "sw $t6,0xFFF00038\n\t" 
     "sw $t7,0xFFF0003C\n\t" 
     "sw $s0,0xFFF00040\n\t" 
     "sw $s1,0xFFF00044\n\t" 
     "sw $s2,0xFFF00048\n\t" 
     "sw $s3,0xFFF0004C\n\t" 
     "sw $s4,0xFFF00050\n\t" 
     "sw $s5,0xFFF00054\n\t" 
     "sw $s6,0xFFF00058\n\t" 
     "sw $s7,0xFFF0005C\n\t" 
     "sw $t8,0xFFF00060\n\t" 
     "sw $t9,0xFFF00064\n\t" 
     "sw $k0,0xFFF00068\n\t" 
     "sw $k1,0xFFF0006C\n\t" 
     "sw $gp,0xFFF00070\n\t" 
     "sw $sp,0xFFF00074\n\t" 
     "sw $fp,0xFFF00078\n\t" 
     "sw $ra,0xFFF0007C"); 
} 

如果你希望它是一个单独的文件,我想你会需要使用汇编,然后莫名其妙的结果联系起来。

相关问题