嗨,所以我是整个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文档和翻译应该很容易。
虽然有一些重要的事情要知道。
p
是指向C中T
类型元素的指针,则p++
意味着p
将指向T
类型的下一个元素。对于地址,必须考虑类型的大小。如果int
是4个字节,“指向下一个int”将对应于“add to address int size”(即4)。lw
和sw
使用基于寻址,即他们可以立即添加地址。指针算术也很重要。因此,如果p
是一个int
指针,并且你想实现x=*(p+2)
,假设x
在$t4
而p
在$t7
,你必须做lw $t4,8($t7)
,这意味着在地址$t7+8
读取内存(如8==2*sizeof(int)
。编写第一个代码应该不会太难。然后,您可以尝试优化它。例如,在每次迭代时加载A[i-1]
都没用。也许你可以减少变量(寄存器)的数量?