在看《自己动手写CPU》的时候,里面需要将MIPS转换成机器码作为输入的指令,不过书上的工具以及一些步骤在实际中是不能用的,因此在这里将“从MIPS汇编转换成机器码”的完整过程下来

安装Linux虚拟机

因为汇编工具需要在Linux的环境下运行,所以需要安装Linux虚拟机,我用的软件是VMware,Linux系统是Ubuntu 18.04,具体的安装过程网上有很多教程,这里就不再详细的叙述了

安装GNU工具链

下载

百度云下载链接:https://pan.baidu.com/s/13RMZTfJNdQwe6hTz2S8Ndw
提取码:9z9w

添加环境变量

下载完成解压之后,在根目录使用vi .bashrc修改.bashrc的内容,在最后一行添加 export PATH=“$PATH:[工具链解压路径]/bin”,如下图所示

添加完成之后重启系统,重启完成后打开终端输入mips-linux-gnu-,然后按两次tab键就会列出刚刚安装的所有编译工具

这样,安装就算完成了,如果没有出现编译工具,那么应该是环境变量没有添加成功,请自行在网上搜索如何添加环境变量

我们会用到的GNU汇编工具

(前面都有mips-linux-gnu-前缀)

as: GNU汇编器,用来将汇编程序编译为目标文件

ld: GNU链接器,将目标文件通过ld链接、重定位数据生成可执行文件

objdump: 用于列出关于二进制文件的各种信息

使用GNU工具链进行编译

新建一个汇编程序文件

文件名为inst_rom.S(因为我是用来生成指令的,你可以替换为相应的文件),文件内容如下:

.org 0x0     #程序从地址0x0开始
.global _start  #定义一个全局符号 _start
.set noat       #允许使用寄存器 $1
_start:ori $1,$0,0xfmtc0 $1,$11,0x0lui $1,0x1000ori $1,$1,0x401mtc0 $1,$12,0x0mfc0 $2,$12,0x0_loop:j _loopsync

一个简单的mips汇编程序

编译

mips-linux-gnu-as -mips32 inst_rom.S -o inst_rom.o

使用 as 来进行编译,“-mips32” 选项表示按照MIPS32 指令集架构进行编译,”-o” 选项用于指令生成的目标文件。
如果报错 “no such file”,因为这个程序是 32 位的,所以在 64 位的系统上执行会出现这个问题,需要安装 32 库,不同的系统安装方法不同,请自行百度。

链接

使用 ld 来进行链接,在 ld 的参数中需要声明一个链接描述脚本,链接描述脚本用于描述输入文件各个Section如何映射到输出文件的各个Section中,并控制输出文件中Section和符号的内存布局

新建一个链接描述脚本文件

文件名为 ram.ld,文件内容如下:

MEMORY{ram(wrx)  :ORIGIN = 0x00000000, LENGTH = 0x00001000
}
SECTIONS{.text :{*(.test)} > ram.data :{*(.data)} > ram.bss :{*(.bss)} > ram
}ENTRY (_start)

其中定义了一个存储块——ram,并且权限为wrx,wrx在Linux中表示可读、可写以及可运行(我个人的理解,并且没有这个就不能使用),其起始地址为0x0,长度为0x1000,然后只是编译器输出文件包含三个Section,分别是 .text、.data、.bss,这三个Section从ram的起始地址开始依次存放,并且与输入文件中的这三个Section意义对应,最后的ENTRY指定程序的入口地址,也就是前面汇编程序中定义的那个全局符号 _start

链接

mips-linux-gnu-ld -T ram.ld inst_rom.o -o inst_rom.om

得到对应的机器码

获取反编译文件

mips-linux-gnu-objdump -D inst_rom.om > inst_rom.asm

书上是用的 objcopy得到 二进制文件,然后用他的那个工具从中提取出机器码的内容,因为我是看的电子书,没有光盘,在网上也没找到那个小程序,所以只能改为使用 objdump 获取反编译文件

利用小程序提取机器码

小程序的获取:百度云链接:https://pan.baidu.com/s/1uFx2Oae7EMfTz_M0a9hMRA
提取码:2fh3

./myfun.exe inst_rom.asm inst_rom.data

注意这个小程序是在 Linux 下运行的,所以下载下来之后要放到 Linux 的同一个目录下面。
最后生成的inst_rom.data中就是我们需要的机器码文件了。

通过Makefile来简化操作

从一个汇编程序打机器码文件,需要四步操作:编译、链接、反编译、提取,有些繁琐,如果对输入文件以及输出文件的名称没有要求的话,可以使用Makefile来简化操作,如果有要求,也可以通过修改Makefile来完成操作,相对来说也很简便

编写Makefile文件

新建一个文件,名为Makefile,文件内容如下

ifndef CROSS_COMPILE
CROSS_COMPILE = mips-linux-gnu-
endif
CC = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
OBJDUMP = $(CROSS_COMPILE)objdump
OBJECTS = inst_rom.o
export CROSS_COMPILE
# 前面的应该都好理解,就是一些别名
all:inst_rom.data           # 最后要获取的文件
inst_rom.o: inst_rom.S      # $<表示输入文件, $@表示输出文件$(CC) -mips32 $< -o $@   # $< 对应inst_rom.S,$@对应inst_rom.o
inst_rom.om: ram.ld $(OBJECTS)$(LD) -T ram.ld $(OBJECTS) -o $@
inst_rom.asm: inst_rom.om$(OBJDUMP) -D $< > $@
inst_rom.data: inst_rom.asm./myfun.exe $< $@build:touch inst_rom.data
clean:  # make clean时清除以下文件rm -f *.o *.om *.asm *.data

在makefile中最后要获取的是inst_rom.data文件,而获取inst_rom.data需要inst_rom.asm文件,所以执行 ./myfun 那一步操作,而inst_rom.asm需要inst_rom.om ,以此类推依次执行makefile中的内容

以后在命令行使用make就可以完成所有的操作了

如何获取MIPS汇编对应的机器码相关推荐

  1. MIPS汇编模拟器_Mars的使用

    1.Mars是一个十分优秀的MIPS汇编模拟器,使用起来十分的方便.但是由于这是一个基于java平台的窗口程序,所以需要计算机上由支持java的运行环境.也就是说至少需要有JRE,当然了,我们一般都是 ...

  2. mips汇编代码示例解释_通过示例解释cosmosdb

    mips汇编代码示例解释 Since I'm going to be giving a spiel (or two) about Data and AI at Microsoft Ignite lat ...

  3. C语言MIPS指令翻译成机器码,计算机指令

    在软硬件接口中,CPU帮我们做了什么? 从硬件角度来看, CPU就是一个超大规模集成电路,通过电路实现了加法,乘法乃至各种各样的处理逻辑. 从软加工程师的角度来讲,CPU就是一个执行各种计算机指令(I ...

  4. mips汇编计算开方_清华考研辅导班-2020清华大学912计算机专业基础综合考研经验真题参考书目...

    清华大学912计算机专业基础综合考试科目,2020年初试时间安排为12月22日下午14:00-17:00业务课二进行笔试,清华大学自主命题,考试时间3小时. 一.适用院系及专业 清华大学计算机科学与技 ...

  5. MIPS介绍与MIPS汇编的常用指令

    描述 CTF做题时会遇见MIPS汇编的题目,而我们接触的是8086汇编,IDA是不能反汇编的需要自己了解一些MIPS方面的知识; 1. List 1 在不同的设备中,汇编语言对应着不同的机器语言指令集 ...

  6. MIPS汇编实现冒泡排序法

    要求: 利用MIPS汇编实现冒泡排序法 初始化数据为:8,6,3,7,1,0,9,4,5,2 代码实现与解释: 数据: 主函数 排序函数: SWAP函数(交换数组当中两个元素) 输出函数: 运行程序: ...

  7. 【汇编语言与计算机系统结构笔记17】MIPS 汇编初步

    本次笔记内容: 25.MIPS汇编初步-1 26.MIPS汇编初步-2 27.MIPS指令集与汇编程序设计 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录 ...

  8. 计算机组成原理之MIPS汇编:冒泡排序

    一. 实验目的 认识和掌握MIPS汇编语言程序设计的基本方法: 熟悉PCSpim模拟器的使用. 二. 实验内容 从键盘输入10个无符号字数并从大到小进行排序,排序结果在屏幕上显示出来. 三. 实验器材 ...

  9. linux mips汇编指令集,MIPS汇编与指令

    一.MIPS寄存器 MIPS的系统结构及设计理念比较先进,其指令系统经过通用处理器指令体系MIPS I.MIPS II.MIPS III.MIPS IV.MIPS V,以及嵌入式指令体系MIPS16. ...

最新文章

  1. python中执行linux命令(调用linux命令)_Python调用Linux bash命令
  2. 【五校联考5day1】序列
  3. Python基础--列表
  4. python爬知识星球付费数据_用python爬取知识星球
  5. 前端学习(1797):前端调试之css伪元素
  6. (三十)java版spring cloud+spring boot+redis多租户社交电子商务平台- gateway限流
  7. python 注销一大段_Python 编程从入门到实践 第19章 注销一节问题
  8. 解决办法:Could not determine java version from ‘11.0.8‘.
  9. 如何在软件里显示编译时间?__DATE__和__TIME__
  10. 阿里云矢量图标使用方法
  11. java poi word 复制_java poi实现word导出(包括word模板的使用、复制表格、复制行、插入图片的使用)...
  12. 2018会考计算机知识点,2018高中地理会考知识点总结:地理信息技术
  13. 整数dct matlab,关于离散余弦变换(DCT)
  14. 阿里如何实现海量数据实时分析?
  15. Report_Report Builder的一些基本概念(概念)
  16. android 相机编程,Android相机开发系列
  17. 在Ubuntu上编译gptfdisk的方法
  18. D3.js入门基础教程
  19. Eastmoney-Spyder:股吧网页数据抓取分析(一)
  20. 【软件工程】什么?你还在复习软工但是不知道背哪里?速看!--电子科技大学2023年期末考试

热门文章

  1. 三维空间刚体运动1:旋转矩阵与变换矩阵(详解加代码示例)
  2. SpaceSniffer 下载与使用——扫描磁盘空间利器
  3. c语言嵌入式系统编程软件,C语言嵌入式系统编程软件设计研究论文
  4. 彧吉他官网改造计划(二)
  5. 黄金分割Android程序,黄金分割游戏下载-黄金分割 安卓版v1.2-PC6手游网
  6. sku商品选择实现思路
  7. 深度学习试题_初学者入门宝典-机器学习入门资料汇总及学习建议(2018版)
  8. Vue 页面单独设置Meta
  9. 互联网+医疗是机遇也是挑战
  10. 确保精确度的五轴机床、类型与行业发展的新曙光