本周主要学习了MIPS的指令,和上周所规划的任务相差甚远,但是也学习到了一些东西,还要继续向前。
MIPS_learning
直接上代码
1 | #指示的是代码段 |
linux 的一些操作指令
1. mkdir (make directory) # 创建目录
2. cd (change directory) #更改目录(即进入目录)
3. vi first.s (打开一个为first.v 的文件)
4. ls (list) #列出当前目录的子目录
5. gcc -g -o first first.s //由于gcc 无法直接编译mips文档,故改用mips-linux-gnu-gcc 来替代gcc
6. ./first(执行当前目录下的first文件) .(表示当前目录) ..(父目录)
7. echo $? (返回结果)
关于MIPS编译环境的搭建:
1、在 /etc/apt/sources.list 文件末尾添加下面的更新源:
deb http://ftp.de.debian.org/debian squeeze main
deb http://www.emdebian.org/debian/ squeeze main
2、执行命令安装:
sudo apt-get update
sudo apt-get install emdebian-archive-keyring
sudo apt-get install linux-libc-dev-mips-cross
sudo apt-get install libc6-mips-cross libc6-dev-mips-cross
sudo apt-get install gcc-mips-linux-gnu
安装完毕,就可以通过mips-linux-gnu-gcc等命令编译在mips平台的可执行程序。
3、验证方法:
运行命令
mips-linux-gnu-gcc -dumpmachine
如果得到如下结果,则证明已经安装成功
mips-linux-gnu
进行编译时,使用指令mips-linux-gnu-gcc -g -o xxx xxx.s即可。
但是此时执行代码后无法对得到的可执行文件进行执行,百度很长一段时间后终于发现是因为我用的是ubuntu的64位机器,所以无法运行32位的程序,因此需要可以匹配的32位库。具体方法如下:
1.确定有一个64位架构的内核:
dpkg --print-architecture
此时,会提示:amd64,表明确实是一个64位架构内核
2.确认打开多架构支持功能:
dpkg --print-foreign-architectures
若此时输出为:i386 则说明打开了此功能,否则
sudo dpkg --add-architecture i386
sudo apt -get update
来打开此功能
3、检查拥有的库文件是否需要更新版本:
sudo apt-get dist-upgrade
4.执行下面指令:
sudo apt install lib32ncursesw5 lib32ncursesw5-dev
执行之后应该来说就没有问题,但是结果我的电脑还是没有办法成功进行动态链接,陷入绝望
最后,在查了很长时间后,尝试安装了其它的编译环境,都还是不行。究其原因,是因为经过编译后的.out文件无法形成动态链接,链接中出现了很多问题,而又没有解决办法
故,用最后一个方法,即不设置动态链接,全部改用静态,将原编译指令改为:
mips-linux-gnu-gcc -static -o xxx xxx.s
再次执行,通过,利用 echo $?查看结果也显示正确,终于完成。
用GDB(GNU Debuger)调试器可以查看寄存器的内容:
$ gdb add
常用gdb 命令
命令 | 作用 | 简化记号 |
---|---|---|
start | 启动程序 | ———— |
stepi | 单步执行 | ———— |
continue | 继续执行 | c |
quit | 退出 | q |
info all-registers | 查看所有寄存器 | i all |
info registers | 查看通用寄存器 | i r |
info registers t0 t1 | 查看指定寄存器 | i r t0 t1 |
info float | 查看浮点寄存器 | i float |
list | 显示源码 | l |
disassemble | 反汇编 | disas |
step | 执行一条源码 | s |
stepi | 执行一条指令 |
数据移动指令
move $12 $13
指令集中利用add也可以达到此功能
add $12 $13 ,0
hi,lo 寄存器1
2
3
4mfhi $t0 # move from hi to $t0
mflo $t1 # move from lo to $t1
mthi $t0 # move $t0 to hi
mtlo $t1 # move $t1 to lo
数据类型
类型 | 位数 | 字节数 | 记号 | 指令 |
---|---|---|---|---|
byte | 8 | 1 | b | lb # load byte |
halfworld | 16 | 2 | h | lh # load halfbyte |
word | 32 | 4 | w | lw # load word |
doubleworld | 64 | 8 | d | ld # load doubleword |
运算
1 | add $t2,$t1,$t0 |
同理:对于乘除法 有:
mul , mult , dmult , dmultu
div , divu , ddiv , ddivu
用gdb 调试 core dump 文件:
$coredumpclt gdb
下周的规划:
下周的主要学习方向是verilog和计算机组成原理中有关流水线的知识,同时,还是要继续复现vivado 的一些实验结果,争取能尽快赶上进度,同时,也要学习MIPS的指令。