如何将程序集文件(.s文件)链接到C程序

时间:2017-02-21 03:28:51

标签: c assembly mips

文件yourlist包含汇编代码中的函数。 assem.s调用该函数,但我收到以下错误:

test.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 注意局部变量a,b,c和d在程序中没有意义。它主要用于观察寄存器中的值。

test.c

assem.s:

  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

2 个答案:

答案 0 :(得分:3)

您看到的问题来自行#include"assem.s":C编译器尝试读取汇编代码,因为它是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

答案 1 :(得分: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");
}

如果您希望它是一个单独的文件,我认为您需要使用汇编程序,然后以某种方式链接结果。