将 C 代码转换为汇编 Mips 语言

Converting C Code Into Assembly Mips Language

您好,我是整个 MIPS 汇编代码的新手,正在尝试通过在线帮助资源自学。我能理解它的某些部分以及它是如何工作的。我现在需要解决的问题是

int A[50], B[50]; 
for (i=1; i < 50; i++) { 
 A[i] = A[i] + B[i-1] / A[i-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 的元素。对于地址,必须考虑类型的大小。如果一个int是4个字节,"point to next int"将对应"add to address the size of an int"(即4)。

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

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