2017-02-21 59 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 отметить, что локальные переменные а, Ь, с и 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" в вашем коде на Си:

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"); 
} 

Если вы хотите быть отдельный файл, я думаю, вам нужно будет использовать ассемблер, а затем связать результат в каким-то образом.