gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:41:07 24 4
gpt4 key购买 nike

您好,我对整个 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
}

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

有一些重要的事情需要了解。

  1. 指针与处理器操作的内存地址类似,但涉及增量(或一般指针算术)时除外。如果p是指向C中T类型元素的指针,则p++意味着p将指向T 类型的下一个元素。对于地址,必须考虑类型的大小。如果int是4个字节,“指向下一个int”将对应于“添加到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] 是没有用的?也许你可以减少变量(寄存器)的数量?

关于将 C 代码转换为汇编 Mips 语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55130455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com