将 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 文档,翻译应该很容易。
虽然有一些重要的事情需要知道。
指针类似于处理器操作的内存地址,除非涉及增量(或一般指针算法)。如果 p
是指向 C 中类型 T
的元素的指针,那么 p++
意味着 p
将指向下一个类型 T
的元素。对于地址,必须考虑类型的大小。如果一个int
是4个字节,"point to next int"将对应"add to address the size of an int"(即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]
没有用?也许你可以减少变量(寄存器)的数量?
您好,我是整个 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个字节,"point to next int"将对应"add to address the size of an int"(即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]
没有用?也许你可以减少变量(寄存器)的数量?