所以我正在使用SPIM模拟器学习MIPS并且我坚持这个问题.
我想添加两个64位数字,存储在四个32位寄存器中.所以我添加了LO字节,然后是进位和HI字节.但是没有adc/addc命令,即添加进位.
所以我必须在状态寄存器中添加进位.但是,我究竟如何阅读这个寄存器?
如果$ t0是临时寄存器1,那么持有进位标志的状态寄存器的等价物是什么?
我google了很多,我仍然找不到任何甚至使用状态寄存器的例子.
在学校,我们已经用MIPS汇编语言编程了一段时间.我有兴趣深入研究x86程序集,我听说这有点难度(甚至我的MIPS教科书都说这个).
在进入x86世界之前,我应该知道哪些核心信息是MIPS程序员?
是否有任何命令行解释器或x86 linux的任何其他程序集来运行MIPS汇编程序?
我希望能够编写简单的MIPS汇编程序,并在本地计算机的控制台上运行它们.
我知道SPIM但它需要X Windows,我很好奇是否有更好的选择.
编辑:原来它不需要X Windows.我仍然有SPIM的问题.在我的拙见中,这不是最好的.Qemu/Cross编译的工具链是一个更多的工作,但我有更少的怪癖.
当我尝试在MIPS中处理无符号整数时,我执行的每个操作的结果都保持有符号(即,整数都是2的补码),即使我执行的每个操作都是无符号的:addu,multu所以第四个......
当我在该范围内打印数字时,[2^31, 2^32 - 1]我得到它们的"溢出"负值,好像它们已经签名(我猜它们是).
但是,当我尝试这样的事情:
li $v0, 1
li $a0, 2147483648 # or any bigger number
syscall
Run Code Online (Sandbox Code Playgroud)
打印的号码总是 2147483647 (2^31 - 1)
我很困惑......我错过了什么?
PS:我没有包含我的代码,因为它不是非常易读(例如汇编代码)并且抛开这个问题,似乎工作正常.如果有人认为有必要,我会马上加入!
我为一个类完成了C到MIPS的转换,我想针对程序集进行检查.我听说有一种配置gcc的方法,它可以将C代码转换为MIPS架构而不是x86架构(我的计算机用户使用Intel i5处理器)并打印输出.
在Ubuntu(gcc附带)中运行终端,我用什么命令配置gcc转换为MIPS?我还需要安装什么吗?
编辑:让我澄清一下.请阅读这个.我不是在寻找使用哪种编译器,或者人们说"你可以交叉编译,但你应该使用其他没有指示如何设置的东西."
如果您要发布,至少请参阅说明.GCC附带Ubuntu.我没有关于如何安装编译器的经验,除了GCC之外,找不到其他任何内容的在线教程并不容易.然后是我需要知道的交叉编译的情况.谢谢.
我无法理解指令jal在MIPS处理器中的工作原理.我的两个问题是:
a)在"jal"之后存储在R31中的值是什么:PC + 4或PC + 8?
b)如果它真的是PC + 8,那么PC + 4上的指令会发生什么?它是在跳转之前执行还是从未执行过?
在Patterson和Hennessy(第四版),第113页:
"跳转和链接指令:跳转到并寻址并同时将下一条指令的地址保存在寄存器中的指令(MIPS中的$ ra)"
"程序计数器(PC):包含正在执行的程序中的指令地址的寄存器"
阅读完这两个陈述之后,$ ra中保存的值应为(PC + 4).
但是,在本书附带的MIPS参考数据(绿卡)中,jal指令的算法定义如下:
"跳转和链接:jal:J:R [31] = PC + 8; PC = JumpAddr"
该网站还声明"它真的是PC + 8 ",但奇怪的是,之后它说由于流水线是一个高级主题"我们假设返回地址是PC + 4 ".
我来自8086汇编,所以我知道返回地址和跟随地址之间存在很大差异,因为如果我假设某些事情并非如此,那么程序将无法工作.谢谢.
我对add和addu之间的区别感到困惑.
MIPS指令参考说:
我的理解是使用带有签名操作数的add和带有无符号操作数的addu.
但是让我们考虑这个例子(只有6位):
overflow | V 1 | 1 1 1 <- carry | 1 1 1 1 0 1 + | 1 1 1 1 1 0 = ----------------- | 1 1 1 0 1 1
这是我的理由:
现在我的问题是:
我正在尝试针对Mips处理器交叉编译Azure IoT SDKC。使用较旧版本的CMake(2.8.12.2)交叉编译同一SDK的较旧版本是否可以正常工作,因此我怀疑它本身就是代码。我猜这是Mips GCC编译器。
错误信息:
CMake Error at /usr/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52 (message):
The C compiler
"/usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: /home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp
Run Build Command:"/usr/bin/make" "cmTC_2cc84/fast"
/usr/bin/make -f CMakeFiles/cmTC_2cc84.dir/build.make CMakeFiles/cmTC_2cc84.dir/build
make[1]: Entering directory '/home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o
/usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc --sysroot=/usr/local/mipsisa32r2el/r23 -o CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o -c /home/axis/azure-iot-sdk-c/cmake/iotsdk_linux/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTC_2cc84
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_2cc84.dir/link.txt --verbose=1
/usr/local/mipsisa32r2el/r23/bin/mipsisa32r2el-axis-linux-gnu-gcc --sysroot=/usr/local/mipsisa32r2el/r23 -rdynamic CMakeFiles/cmTC_2cc84.dir/testCCompiler.c.o -o cmTC_2cc84
/usr/local/mipsisa32r2el/r23/lib/gcc/mipsisa32r2el-axis-linux-gnu/4.7.2/../../../../mipsisa32r2el-axis-linux-gnu/bin/ld: this linker was not configured to use sysroots
collect2: error: …Run Code Online (Sandbox Code Playgroud) 有谁知道我可以找到32位MIPS指令/操作码列表的网站,具有以下功能:
我知道很多网站都记录了指令集的"一部分",主要用于教学目的.他们倾向于遗漏或仅部分描述浮点和特权指令.
如果你想知道,我正在研究MIL处理器子集的Verilog代码,并试图弄清楚它在多大程度上符合任何真正的MIPS处理器的指令集!谢谢你的任何指示.