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

问题描述 投票:0回答:1

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

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

一些提示和指示非常值得赞赏,希望扩展我的知识。我尝试过那些在线的东西,但似乎没有帮助我学习。

c assembly mips
1个回答
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个字节,“指向下一个int”将对应于“add to address int size”(即4)。
  2. lwsw使用基于寻址,即他们可以立即添加地址。指针算术也很重要。因此,如果p是一个int指针,并且你想实现x=*(p+2),假设x$t4p$t7,你必须做lw $t4,8($t7),这意味着在地址$t7+8读取内存(如8==2*sizeof(int)

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

© www.soinside.com 2019 - 2024. All rights reserved.