在 mips 汇编中有指令(addi)将整数值放入寄存器,我的问题是:
addi $t1,$zero,8.9 #MIPS ERROR
Run Code Online (Sandbox Code Playgroud)
如果我想将双精度值放入 MIPS 中的寄存器中,我必须使用哪条指令?
在 MIPS 中,参数被放置在 $a0 到 $a4 寄存器中以实现更快的访问。为什么某些 x86 架构选择将参数放置在堆栈上而不是寄存器中?这样做有什么好处呢?
在MIPS中,我知道每条指令PC都会增加4。这是因为该字位于 32 位边界(4 个字节)上。这对我来说是有意义的,自然地我们需要通过两个连续单词的空间位置差异来增加 PC。
例如,我们可能将 0x00000000 作为 PC 值,但是当我们递增 PC 时,它会变为 0x00000004。但是,这个差异实际上是 4 位,而不是 4 个字节(32 位)。为什么是 0x00000004 而不是 0x80000000?
从二进制角度来看,这个问题变成: 0000 0000 0000 0000 0000 0000 0000 0000 到 0000 0000 0000 0000 0000 0000 0000 0010 与 1000 0000 0000 0000 0000 0000 000 0 0000。第二个似乎是 32 位(4 字节)与首先是 4 位的差异。
我唯一能想到的是,必须将 PC 乘以 8 才能得到单词的实际起点。加4应该还不够吧?有人可以解释一下我缺少什么吗?
在讨论 32 位 MIPS 架构时,Patterson-Hennessy 解释说静态数据段开始于0x 1000 0000,结束于0x 1000 FFFF,全局指针$gp默认设置为中间地址0x 1000 8000。据说堆是下一个,因此应该从 开始0x 1001 0000。
然而,一些 MARS 实验告诉我,中间有一个额外的段,从0x 1001 0000到0x 1003 FFFF,因此堆仅从 开始0x 1004 0000。事实上,当我使用系统调用在堆上存储数组时,该数组将被存储在0x 1004 0000以后的位置。
.data当我在程序标题下初始化数据时,似乎会使用这个附加段。这让我感到困惑,因为我期望在下面初始化的数据.data被认为是静态的,因此应该存储在由全局指针控制的段中。
问题。MARS 标准表现出的行为吗?如果是,那么位于静态数据和堆之间的这个附加数据段与位于其前面的静态数据段有何不同?
我是一名大学计算机科学学生,我应该为考试开发一个 MIPS 汇编语言程序,但我确实很难设计它,特别是在分配寄存器、遵循调用约定、将寄存器保存在堆栈...这一切似乎很快变得非常混乱和难以承受,我迷失了方向!
至少在概念上,我不难找出解决特定问题的算法。它更多地与项目的大局、整体结构和设计有关。
鉴于此,您能否指出一种模式,提供一些技巧或最佳实践,以在实际编写代码之前对所有内容进行排序,以便我不会在这个过程中迷失自己?
我的计算机似乎以bigendian顺序存储整数.例如0xFF440022是4 282 646 562.但是它以小端顺序存储字符串数据?IE浏览器.你好世界就像lleh o wo rld.为什么是这样?这台机器被认为是big-endian还是little-endian?
好吧,我很确定我已经用完了所有可能的 XOR 变体来将 $s0 与 $s1 交换,但是,我仍然无法让它工作!这是 MIPS 大会,我正在使用 MARS。请问有人可以为我提供解决方案吗?
您将不胜感激!
所以我的教授把这个问题放在他的幻灯片中,这就是他的答案,不明白他如何将其转换为 MIPS,所以如果有人可以帮助解释这一点,那就太好了。变量i在$s3中,k在$s5中,save[]的基地址在$s6中
他给了我们这个 C 代码:
while( save[i] == k ) {
i += 1;
}
Run Code Online (Sandbox Code Playgroud)
并给了我们这个 MIPS 代码作为回应:
Loop: sll $t1, $s3, 2
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit:
Run Code Online (Sandbox Code Playgroud) 不确定偏移量是否意味着将指令提取并存储在距“加载字”程序计数器一行(4 字节)的地方到寄存器 $s0,4($t0) 中。这在内存中是如何工作的?如果可能,请提供示例。
我目前正在学习计算机组织课程,并且一直在研究 MIPS-32 架构。我注意到我们使用的书列出的操作码全部为小写,而教授列出的操作码全部为大写。我在不同的网站上查找了这一点,发现有些网站的操作码全部为大写,而其他网站的操作码全部为小写。我在堆栈溢出上查找了类似的问题,但没有找到。
例如,要添加,我们可以这样:
ADD $s2, $s1, $s0
Run Code Online (Sandbox Code Playgroud)
但是,其他网站和本书将其描述为:
add $s2, $s1, $s0
Run Code Online (Sandbox Code Playgroud)
谁能澄清哪种操作码格式更传统?我还没有构建汇编语言程序,所以我不确定操作码是否区分大小写;他们是吗?
这是高级函数:J[6] = K[d-e]
d = $t0,e = $t1,J = $s1,K = $s2,最终结果放入$s4
到目前为止我有:
lw $t2, 24($s1) #Load J[6] into $t2
sub $t3, $t0, $t1 #Subtract e from d to $t3
Run Code Online (Sandbox Code Playgroud)
我知道我不能做的是lw $t4, $t3($s2)但我不知道如何翻译 K[$t0 - $t1]。
我需要将其翻译成MIPS汇编(在Mars Assembler上工作)
void mm ( double x[][], double y[][], double z[][], int n)
{
int i,j;
for (i=0; i !=n; i++)
for (j=0; j !=n; j++)
z[i][j] = 0.0;
for (k=0; k !=n; k++)
z[i][j] = z[i][j] + x[i][k] * y[k][j];
}
Run Code Online (Sandbox Code Playgroud)