【问题标题】:Converting C Code Into Assembly Mips Language将 C 代码转换为汇编 Mips 语言
【发布时间】:2019-08-03 10:55:28
【问题描述】:

您好,所以我对整个 MIPS 汇编代码是全新的,并且正在尝试使用在线帮助资源自学。我可以理解它的某些部分以及它是如何工作的。我现在需要解决的问题是

int A[50], B[50]; 
for (i=1; i < 50; i++) { 
 A[i] = A[i] + B[i-1] / A[i-1]; 
}

如果希望扩展我的知识,我们将非常感谢一些提示和指示。我已经尝试过那些在线的东西,但似乎对我学习没有帮助。

【问题讨论】:

  • 我已经尝试过那些在线的东西,但似乎对我学习没有帮助 - 那么你期望在这里得到什么? “在线事物”是指一些在线 c-to-mips 翻译器?
  • 您可以查看编译器如何将您的代码转换为程序集。不要忘记关闭优化,否则任何编译器都会优化你的代码)
  • @EugeneSh。是的,c-mips。在不寻找某人为我做这件事时,有些人对这个(我)是新手,所以我认为不需要这种态度。只是在寻找我最好的选择
  • 查看编译器输出通常是最好的选择。 @ForceBru:这里没有太多需要优化的地方,-O0 代码真的很吵而且很难理解(充满了存储/重新加载)。来自 gcc(用于 MIPS II)和 clang(用于 MIPS32r6)的godbolt.org/z/RbYSsR 非常合理。 teq 是一个捕获除以零的陷阱。如果针对基线 MIPS I,它使用break 指令上的条件分支。

标签: c assembly mips


【解决方案1】:

这是编译器如何翻译这种代码的。
这是 C 代码,但它严格等同于您的原始代码,并且它的编写方式使得每条 C 指令都可以映射到 asm 指令。我什至写了应该使用哪个指令。

int * pA=&A[0];     // mov
int * pB=&B[0];     // mov
int i=1;            // addi
int n=50;           // addi
do{
  // body of for loop
  int B_1=*(pB-1) ; // lw
  int A_1=*(pA-1) ; // lw
  int D=B_1/A1;     // div
  int A=*pA;        // lw
  A += D;           // add
  *pA = A;          // sw
  // increment part of the loop
  i+=1;             // addi
  pA+=1;            // addi
  pb+=1;            // addi
  // test part of the loop
  while (i<N);      // blt -> do
 }

您只需为所有变量选择一个寄存器(例如,选择将pA 复制到$t3(或r4 或其他),并弄清楚如何在asm 中翻译此指令。看看MIPS 文档和翻译应该很容易。

虽然有几件重要的事情需要了解。

  1. 指针类似于处理器操作的内存地址,除非涉及增量(或一般的指针算术)。如果p 是指向C 中T 类型元素的指针,p++ 意味着p 将指向T 类型的下一个元素。对于地址,必须考虑类型的size。如果int 是 4 个字节,“指向下一个 int”将对应于“添加到地址的 int 大小”(即 4)。

  2. lwsw 使用基于寻址,即它们可以向地址添加立即数。指针算术也是相关的。所以如果p是一个int指针,并且你想实现x=*(p+2),假设x$t4p$t7,你必须做lw $t4,8($t7)这意味着读内存地址$t7+8(如8==2*sizeof(int)

编写第一个代码应该不会太难。然后,您可以尝试对其进行优化。例如,也许每次迭代都加载A[i-1] 没有用?也许你可以减少变量(寄存器)的数量?

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 2014-08-16
    • 1970-01-01
    • 2020-07-28
    • 2021-08-22
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多