Architecture 计算机体系结构:使用MIPS交换变量

Architecture 计算机体系结构:使用MIPS交换变量,architecture,mips,Architecture,Mips,我错过了关于这个主题的课程,因为我不在国外,而且我还没有拿到笔记。你能给我指出这个问题的正确方向吗?我已经有一段时间没有使用MIPS了,所以它对我来说基本上是一门外语:D 作业问题: MIPS体系结构支持字节和半字(16位)内存传输操作。指令包括加载字节(lb)、加载字节无符号(lbu)、存储字节(sb)、加载半字(lh)、加载半字无符号(lhu)和存储半字(sh) 代码: 字符a,b;//8位变量(a@地址100)(b@地址200) 第a部分)假设支持8位操作(lb、lbu、sb),编写交换变

我错过了关于这个主题的课程,因为我不在国外,而且我还没有拿到笔记。你能给我指出这个问题的正确方向吗?我已经有一段时间没有使用MIPS了,所以它对我来说基本上是一门外语:D

作业问题:

MIPS体系结构支持字节和半字(16位)内存传输操作。指令包括加载字节(lb)、加载字节无符号(lbu)、存储字节(sb)、加载半字(lh)、加载半字无符号(lhu)和存储半字(sh)

代码: 字符a,b;//8位变量(a@地址100)(b@地址200)

第a部分)假设支持8位操作(lb、lbu、sb),编写交换变量的代码

第二部分)如果MIPS不支持字节和半字操作,那么我们只能使用“加载字”(lw)和“存储字”(sw),这是32位操作。因此,仅使用(lw,sw)作为内存传输指令重写上述代码


注意:我真的不是在找你帮我解决这个问题,我只是不知道该怎么办。我是用C写一个交换函数,然后转换成MIPS,还是让它变得过于复杂?谢谢大家!

首先编写C代码并将其用作mips程序集的伪代码是一种很好的方法

然后,将C代码简化为我所说的“简单C”。没有
用于
,或复杂的表达式。没有局部变量。仅限使用
.word
定义的全局变量,如
myvar:.word 23
或与mips寄存器相对应的变量。只有非常简单的
if(expr)goto标签

有关示例,请参见我的回答:

请看我在这里的答案:这里还有一系列关于如何编写干净的asm代码的提示,以及如何使用C/伪代码构造asm代码的示例

所以,对于a部分,我们讨论的是
无符号字符
。一旦这些值被提取到寄存器变量中,应用一个标准的交换,就像在C中一样

对于b部分,请注意地址与4字节边界对齐,因此您可以使用32位访问来获取/存储地址。所以,我们说的是
无符号int
。问题在于,交换完成后,必须进行适当的屏蔽/移位/拆分,以交换字节,而不是交换剩余的32位字,只使用
无符号int

因此,首先编写C代码。您可以通过以下方式伪造100/200:

typedef union {
    unsigned int ival;
    unsigned char bval[4];
} membuf_t;

membuf_t adr100;
membuf_t adr200;
这只是为了让您能够编写真正的C代码并首先对其进行测试。对于asm,您可以只参考[硬连线]地址(例如
0x100($零)

但是,100/200假设您只是将此作为一个思维实验,而不是尝试使用类似于
mars
spim
的模拟器实际调试asm代码[因为他们真的不喜欢您在他们模拟的代码中使用这些内存地址]

如果是我,我会使用
mars
并编写可以单步执行的代码。为此,再次稍微调整:

adr100:     .word   0x01020304
adr200:     .word   0x05060708
然后,一切正常后,只需手动更换
adr*
参考


更新:

我忘了提到的一件事是,你必须意识到endian的问题。也就是说,对于C代码,当您从adrXXX.ival执行32位提取时,位0-7(小端)或位24-31(大端)中的adrXXX.bval[0]是什么

假设您在x86 PC上编写C代码,它就是little endian。IIRC,mips也是小端点,但是,老实说,我忘记了[有些模型可以是大端点,或者可以动态切换]。模拟器[可能]是小endian,所以,也许,不用担心


在mips(或C)上测试的一种方法是使用额外的测试单元(即创建一个3-4行一次性测试程序):
test:.word 0
。获取一个用0x00000001填充的寄存器。然后,对
测试执行字节存储。然后从
测试执行32位加载。寄存器中的非零字节为您提供机器的endian(即,它在位0-7或位24-31中)。

我投票结束这个问题,因为op要求我们做他的家庭作业。我投票结束您的回答,因为1)我是一位女士,2)我明确表示我不希望有人帮我解决问题。这就是你的教学目的,问问他们。我不能问我的老师,因为我还说我不在国外,所以在意大利我不能打电话或见我的教授,我给他发了电子邮件,他没有回复。我只是不明白你为什么要这么粗鲁,只是想学习,不让别人帮我做作业。这是10个问题,这是我唯一需要帮助的问题。