You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C代码交叉编译为适配RSIM的MIPS R10000汇编及语法错误排查求助

C代码交叉编译为适配RSIM的MIPS R10000汇编及语法错误排查求助

各位前辈好!我目前在学校的服务器环境下做一个基于MIPS R10000架构(指定用服务器自带的RSIM模拟器)的Dijkstra算法实现项目,遇到了交叉编译和汇编语法兼容的棘手问题,想请教大家的解决方案:

背景

因为项目复杂度较高,我同时在做两件事:一是从零手写MIPS汇编实现算法,二是用C先写出正确的算法逻辑(毕竟C上手快太多)。现在手写汇编卡在了收尾细节上,所以想把C代码交叉编译成RSIM能识别的MIPS汇编,对比着找出自己手写代码里的问题,但试了各种方法都没成功。

我试过的方法及遇到的问题

1. 本地GCC加-S选项生成汇编

我用gcc -S dijkstra.c生成了汇编代码,但后来才知道这是x86架构的汇编,完全不兼容RSIM的MIPS要求。把这份汇编交给RSIM配套的rasm汇编器处理时,报了一堆语法错误,比如不认识.section、.type这类伪指令,还有x86特有的pushq、movq指令也无法识别。

我的测试C代码很简单:

#include <stdio.h>

int main() {
    printf("Hello, World!");
    return 0;
}

本地GCC生成的x86汇编代码:

.text
.section    .rodata
.LC0:
.string     "Hello, World!"
.text
.globl      main
.type       main, @function
main:
.LFB0:
.cfi_startproc
endbr64
pushq   %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq    %rsp, %rbp
.cfi_def_cfa_register 6
leaq    .LC0(%rip), %rdi
movl    $0, %eax
call    printf@PLT
movl    $0, %eax
popq    %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size   main, .-main
.ident  "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0"
.section    .note.GNU-stack,"",@progbits
.section    .note.gnu.property,"a"
.align 8
.long   1f - 0f
.long   4f - 1f
.long   5
0:
.string     "GNU"
1:
.align 8
.long   0xc0000002
.long   3f - 2f
2:
.long   0x3
3:
.align 8
4:

执行make时的错误输出:

cd ~/Courses/CSCI250/Dijkstras
make

/home/fac/wrc/bin/rasm -l dijkstra.asm > dijkstra.lst
2 0000                       .section        .rodata
Info: Unimplemented directive
4 0000                       .string "Hello, World!"
Error: Syntax error near label field
7 0000                       .type   main, @function
Error: Syntax error near label field
10 0000                       .cfi_startproc
Error: Syntax error near label field
11 0000                       endbr64
Error: Syntax error near label field
12 0000                       pushq   %rbp
Error: Syntax error near label field
13 0000                       .cfi_def_cfa_offset 16
Error: Syntax error near label field
14 0000                       .cfi_offset 6, -16
Error: Syntax error near label field
15 0000                       movq    %rsp, %rbp
Error: Syntax error near label field
16 0000                       .cfi_def_cfa_register 6
Error: Syntax error near label field
17 0000                       leaq    .LC0(%rip), %rdi
Error: Syntax error near label field
18 0000                       movl    $0, %eax
Error: Syntax error near label field
19 0000                       call    printf@PLT
Error: Syntax error near label field
20 0000                       movl    $0, %eax
Error: Syntax error near label field
21 0000                       popq    %rbp
Error: Syntax error near label field
22 0000                       .cfi_def_cfa 7, 8
Error: Syntax error near label field
23 0000                       ret
Error: Syntax error near label field
24 0000                       .cfi_endproc
Error: Syntax error near label field
26 0000                       .size   main, .-main
Error: Syntax error near label field
27 0000                       .ident  "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0"
Error: Syntax error near label field
28 0000                       .section        .note.GNU-stack,"",@progbits
Info: Unimplemented directive
Error: Syntax error near comment field
29 0000                       .section        .note.gnu.property,"a"
Info: Unimplemented directive
Error: Syntax error near comment field
31 0000                       .long    1f - 0f
Error: Syntax error near label field
32 0000                       .long    4f - 1f
Error: Syntax error near label field
33 0000                       .long    5
Error: Syntax error near label field
34 0000               0:
Error: Syntax error near label field
35 0000                       .string  "GNU"
Error: Syntax error near label field
36 0000               1:
Error: Syntax error near label field
38 0000                       .long    0xc0000002
Error: Syntax error near label field
39 0000                       .long    3f - 2f
Error: Syntax error near label field
40 0000               2:
Error: Syntax error near label field
41 0000                       .long    0x3
Error: Syntax error near label field
42 0000               3:
Error: Syntax error near label field
44 0000               4:
Error: Syntax error near label field

There were 3 informational messages
There were 33 fatal errors
make: *** [Makefile:20: dijkstra.obj] Error 33

2. 尝试Compiler Explorer

我调整了Compiler Explorer上所有可能的输出选项,但还是没找到能生成适配RSIM的MIPS汇编的配置,似乎默认的编译器都不针对RSIM做优化。

3. 尝试指定MIPS架构的GCC选项

我试过用gcc -S -march=mips1 dijkstra.c,结果直接报错,说我的GCC不支持MIPS架构的目标,给出的有效选项全是x86系列的:

cd ~/Courses/CSCI250/Dijkstras
gcc -S -march=mips1 dijkstra.c

cc1: error: bad value (‘mips1’) for ‘-march=’ switch
cc1: note: valid arguments to ‘-march=’ switch are: nocona core2 nehalem corei7 westmere sandybridge corei7-avx ivybridge core-avx-i haswell core-avx2 broadwell skylake skylake-avx512 cannonlake icelake-client icelake-server cascadelake tigerlake bonnell atom silvermont slm goldmont goldmont-plus tremont knl knm x86-64 eden-x2 nano nano-1000 nano-2000 nano-3000 nano-x2 eden-x4 nano-x4 k8 k8-sse3 opteron opteron-sse3 athlon64 athlon64-sse3 athlon-fx amdfam10 barcelona bdver1 bdver2 bdver3 bdver4 znver1 znver2 btver1 btver2 native

4. 尝试Buildroot

我查了资料说Buildroot可以生成交叉编译工具链,但我完全搞不懂怎么配置才能生成适配RSIM的MIPS R10000工具链,也不确定生成的工具链能不能在RSIM上正常运行。

我的需求

想请教大家:有没有办法生成RSIM模拟器能兼容的MIPS R10000汇编代码?或者有没有正确的交叉编译工具链配置方法,让我能把C代码转成可以直接参考的MIPS汇编,好把有用的部分移植到我自己手写的代码里?

感谢各位的帮助!


备注:内容来源于stack exchange,提问作者Aidan Mellin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:42:58