龙芯杯备战2

本周主要学习了MIPS的指令,和上周所规划的任务相差甚远,但是也学习到了一些东西,还要继续向前。

MIPS_learning


直接上代码

1
2
3
4
5
6
7
8
    .text  #指示的是代码段
.global main # 定义全局的变量
.ent main #refer to entry
main: nop #什么也不做,空耗一个周期
li $v0,8 #li load immediate 装入立即数
jr $ra #jr jump register 跳转到寄存器保存的地址中
# ra -> return address
.end main

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
4
mfhi $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
2
3
4
5
6
7
8
9
add $t2,$t1,$t0
addi $t2,$t1,8 #i -> immediate
addu $t2,$t1,$t0
addiu $t2,$t1,8 #u-> unsigned
sub $t2,$t1,$t0
subi $t2,$t1,8 #i -> immediate
subu $t2,$t1,$t0
subiu $t2,$t1,8 #u-> unsigned
#dsub,dsubu #(for 64 bits(doubleword))

同理:对于乘除法  有:

mul , mult , dmult , dmultu
div , divu , ddiv , ddivu    

用gdb 调试 core dump 文件:

$coredumpclt gdb

下周的规划:

下周的主要学习方向是verilog和计算机组成原理中有关流水线的知识,同时,还是要继续复现vivado 的一些实验结果,争取能尽快赶上进度,同时,也要学习MIPS的指令。