为了编译《计算机组成与设计-硬件/软件接口》上的程序,然而UbuntuX86上的gcc只能编译成X86汇编。
Sourcery CodeBench出了一个gcc工具链用于编译为MIPS汇编。
有收费版和免费版,我用的是免费版。
https://sourcery.mentor.com/GNUToolchain/subscription3537?lite=MIPS
在这里找到下载最新版本。
有两个版本:GNU/Linux版本和ELF版本
我下载的是https://sourcery.mentor.com/GNUToolchain/release3133
参考文档:https://sourcery.mentor.com/GNUToolchain/doc22952/getting-started.pdf
两个版本区别见最底下注1。
右键勾上可执行的权限。
命令行执行:
$ ./mips-2015.11-32-mips-linux-gnu.bin
然而没法执行。寻求各种文档各种问答。找到解决方法:
Since 12.04 Ubuntu introduced Multi Arch (https://wiki.ubuntu.com/MultiarchSpec) and removed ia32-libs ia32-libs-gtk packages from the repository. To install 32-bit libs you need the run the following command line
ubuntu在12.04后,移除了32位的库,因此我们得安装:
命令行如下:
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install libgtk2.0-0:i386 libxtst6:i386 gtk2-engines-murrine:i386 lib32stdc++6 libxt6:i386 libdbus-glib-1-2:i386 libasound2:i386
如果不能安装,出现“Hash 校验和不符”或者“发生故障,这可能是有软件包被要求保持现状的缘故。”,请跳到最后注2。
安装32位库后,我们可以打开该文件了bin。
然后按照指示进行安装即可。Ubuntu的话,取消在桌面生成图标。
如果中途失败退出了,请再运行一次,安装在同一目录下即可继续安装。
安装后,重启,命令行输入mips-linux-gnu-gcc -v可以看到结果。
mips-的参数可见https://gcc.gnu.org/onlinedocs/gcc/MIPS-Options.html
#include<stdio.h>
int main(){
printf("hello");
}
.file 1 "hello.c"
.section .mdebug.abi32
.previous
.nan legacy
.module fp=32
.module oddspreg
.abicalls
.option pic0
.rdata
.align 2
$LC0:
.ascii "hello\000"
.text
.align 2
.globl main
.set nomips16
.set nomicromips
.ent main
.type main, @function
main:
.frame $fp,32,$31 # vars= 0, regs= 2/0, args= 16, gp= 8
.mask 0xc0000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-32
sw $31,28($sp)
sw $fp,24($sp)
move $fp,$sp
lui $2,%hi($LC0)
addiu $4,$2,%lo($LC0)
jal printf
nop
move $2,$0
move $sp,$fp
lw $31,28($sp)
lw $fp,24($sp)
addiu $sp,$sp,32
j $31
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (Sourcery CodeBench Lite 2015.11-32) 5.2.0"
注一:
注2:出现这种情况是因为被墙了。重新选择新的源。
最后,他给我选择了个香港的源。不知道是不是我修改了hosts的原因。