MIPS编译环境的建立
GNU 工具链的安装
参考文章:https://blog.csdn.net/qq_33880925/article/details/122741140?spm=1001.2014.3001.5506
工具链地址:
百度网盘: https://pan.baidu.com/s/1W5VnCT7z0YuR7hvjc3Jg0g
提取码: 1nw3
建立共享文件夹
1.点击设置

2.点击选项中的共享文件夹,添加共享文件夹

3.在宿主机中创建一个空文件夹用来和虚拟机共享,在文件夹路径中输入宿主机的
文件路径。
安装 GNU 工具链
1.先把压缩包移动到宿主机与虚拟机的共享文件中。
2.挂载共享文件夹:
在 VMware 中,虚拟机启动后,虚拟机操作系统会自动创建一个挂载点,通常挂载到 /mnt/hgfs/
目录。
如果 VMware Tools 已安装并且共享文件夹已启用,系统应该自动将共享文件夹挂载到 /mnt/hgfs/
目录。你可以通过以下命令检查:
1 | ls /mnt/hgfs/ |

gcc 是共享文件夹,切换到 gcc 目录,查看文件
1 | cd /mnt/hgfs/gcc |

3.将代码解压到/opt目录下
在/mnt/hgfs/gcc
目录下,终端中输入以下代码,解压文件
1 | sudo tar –zxvf gcc-4.3-ls232.tar.gz –C / |
检查/opt/gcc-4.3-ls232/bin
是否存在
1 | cd /opt/gcc-4.3-ls232/ |

4.更改默认路径
打开home目录,点击展示隐藏文件


打开.bashrc文件,在最后一行添加以下代码
1 | export PATH="$PATH:/opt/gcc-4.3-ls232/bin" |

5. 64位的系统需要添加32位的拓展库
在终端输入如下代码
1 | sudo apt install lsb-core lib32z1 lib32ncurses-dev |
6.检查是否安装成功
在终端输入以下代码
1 | mipsel-linux-gcc -v |

如果出现 gcc 的版本号说明安装成功。
编译汇编指令
我们先编写一组汇编指令,命名为 inst_rom.S
,写入以下内容
1 | .org 0x0 # Instruct program starts from 0x0 |

然后我们在终端中输入指令:
1 | mipsel-linux-as -mips32 inst_rom.S -o inst_rom.o |
表示用as工具将inst_rom.S文件编译成inst_rom.o文件。
然后创建一个 ram.ld文件,写入以下内容:
1 | MEMORY |

再输入:
1 | mipsel-linux-ld -T ram.ld inst_rom.o -o inst_rom.om |
表示将inst_rom.o文件链接成inst_rom.om文件。
再输入:
1 | mipsel-linux-objcopy -O binary inst_rom.om inst_rom.bin |
根据.om文件得到了bin文件,
再输入:
1 | mipsel-linux-objdump -D inst_rom.om > inst_rom.asm |
,对汇编指令进行反汇编,得到与机器指令对应的二进制字。
最后将Bin2MEM.exe拷贝到与inst_rom系列文件相同的目录下,执行
1 | ./Bin2Mem.exe -f inst_rom.bin -o inst_rom.data |
第一次执行应该需要修改Bin2Mem.exe文件的权限,输入:
1 | Chmod 777 Bin2Mem.exe |
,最终转化为与Vivado程序中读入的文件类型(.data),执行结果如图
我们打开inst_rom.data文件查看:

这便是我们一开始那几条汇编指令的机器指令。
Make工具
每次都输入四个(加上.asm一共五个)指令显得很麻烦,我们可以编写一个脚本来自动执行命令。
make便是Linux上的一个脚本,当我们只输入make命令的工作流程是:
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件;
- 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“inst_rom.data”这个文件,并把这个文件作为最终的目标文件;
- 如果inst_rom.data文件不存在,或是.data所依赖的后面的 .om 文件的文件修改时间要比.data这个文件新,那么make会执行下面定义的命令来生成.data文件;
- 如果.data所依赖的.om文件也存在,那么make会在当前文件中找目标为.om文件的依赖性,如果找到再根据命令生成.om文件(这是一个递归的过程);
- 如果在找寻的过程中,出现了被依赖的文件找不到的错误,那么make就会直接退出,并报错。
- 如果在一条依赖链中,比如:A依赖B,B依赖C,C依赖D。那么当D更新后,make发现D比C新则会重新构建C,以此类推,最终A也会被更新。
- 简单的说,makefile带来的好处就是——自动化编译,只要一个make命令,所有工程和文件自动编译,类似于Shell的.sh和cmd的.bat
我们编写如下代码:
1 | ifndef CROSS_COMPILE |
其中 $< 表示第一个依赖文件的名称,$@ 表示目标的完整名称
执行以下命令
1 | make all |

至此,我们用gcc编译汇编指令生成机器码的过程就做完了。
————————————————