【问题标题】:Computer Architecture : swapping variables with MIPS计算机体系结构:使用 MIPS 交换变量
【发布时间】:2016-09-24 11:16:08
【问题描述】:

我错过了关于这个主题的课程,因为我在国外,我没能拿到笔记。你能否引导我解决这个问题的正确方向?自从我使用 MIPS 已经有一段时间了,所以它对我来说基本上是一门外语 :D

家庭作业问题:

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

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

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

Part b) 如果 MIPS 不支持字节和半字操作,那么我们只能使用 32 位操作的 ‘load word’ (lw) 和 ‘store word’ (sw)。因此,重写上面的代码,只使用 (lw, sw) 作为内存传输指令。

注意:我真的不是在找你为我解决它,我只是不知道该怎么办。我是在 C 中编写一个交换函数然后转换为 MIPS 还是让它过于复杂?谢谢!

【问题讨论】:

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

标签: architecture mips


【解决方案1】:

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

然后,将 C 代码简化为我所说的“简单 C”。没有whilefor 或复杂的表达式。没有局部变量。只有全局变量是你用.word 定义的东西,比如myvar: .word 23,或者是对应于 mips 寄存器的变量。只有很简单的if (expr) goto label;

请在此处查看我的答案以获取示例:Struggling with the logic in if statement

在这里查看我的回答:MIPS linked list 这也有一堆关于如何编写干净的 asm 代码的提示以及如何使用 C/伪代码构造 asm 代码的示例。

所以,对于第一部分,我们谈论的是unsigned char。将值提取到寄存器变量中后,应用您将在 C 中执行的标准交换。

对于 b 部分,请注意地址与 4 字节边界对齐,因此您可以通过 32 位访问来获取/存储它们。所以,我们正在谈论unsigned int。问题是,当交换完成时,必须进行适当的屏蔽/移位/拆分来交换字节,但交换剩余的 32 位字,仅使用 unsigned int

所以,首先编写 C 代码。您可以使用以下方法伪造 100/200:

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

membuf_t adr100;
membuf_t adr200;

这只是为了让您编写真正的 C 代码并首先对其进行测试。对于 asm,您可以只引用 [hardwired] 地址(例如 0x100($zero))。

但是,100/200 假设您只是将其作为思想实验进行,并且尝试使用类似 marsspim 的模拟器实际调试您的 asm 代码 [因为他们真的不喜欢你在他们模拟的代码中使用这些内存地址]。

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

adr100:     .word   0x01020304
adr200:     .word   0x05060708

然后,在 一切 工作后,只需手动替换 adr* 引用。


更新:

我忘记提到的一件事是您必须注意字节序问题。也就是说,对于 C 代码,当您从 adrXXX.ival 进行 32 位获取时,是位 0-7(小端)或位 24-31(大端)中的 adrXXX.bval[0]?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多