gpt4 book ai didi

将大端 MIPS 转换为 C

转载 作者:行者123 更新时间:2023-12-04 13:33:48 26 4
gpt4 key购买 nike

对于学术问题,鉴于以下大端 MIPS 代码(左侧最高内存地址,右侧最低内存地址),我被要求提供来自十六进制的 MIPS 代码及其等效 C 代码,以及 C 的一些上下文代码。
80 48 05 00 20 48 89 00 00 00 28 8d 04 00 2a ad 00 00 2a ad 04 00 28 ad 08 00 e0 03
我已经反汇编了 MIPS 代码并将其转换为一些 C 代码。我想知道我是否在反汇编过程中弄乱了字节顺序,因为 C 代码似乎没有目的而不是变量赋值,或者我是否弄乱了 C 代码,使其看起来无关紧要。
请注意,变量的初始化和数组大小只是占位符(它们根本不是 MIPS 代码的一部分),因此程序可能会出错。
任何帮助深表感谢!
MIPS:

Big Endian  Little Endian   Binary Representation (Little Endian)   MIPs Code
80480500 00054880 000000 00000 00101 01001 00010 000000 sll $t1, $a1, 2
20488900 00894820 000000 00100 01001 01001 00000 100000 add $t1, $a0, $t1
0000288d 8d280000 100011 01001 01000 0000000000000000 lw $t0, 0x0000($t1)
04002aad ad2a0004 101011 01001 01010 0000000000000100 sw $t2, 0x0004($t1)
0000a2ad ad2a0000 101011 01001 01010 0000000000000000 sw $t2, 0x0000($t1)
040028ad ad280004 101011 01001 01000 0000000000000100 sw $t0, 0x0004($t1)
0800e003 03e00008 000000 11111 00000 00000 00000 001000 jr $ra
C:
#include <stdio.h>

int main(void) {
int i = 0, t0 = 1, t2 = 2;
int A[10];

t0 = A[i];
A[i + 1] = t2;
A[i] = t2;
A[i] = t0;

return 0;
}

最佳答案

你的拆解看起来不错。
您将 C 代码描述为具有整数返回值的无参数 main,具有局部变量。
但是,让我们注意 $a0 , 和 $a1未初始化尚未使用。此外,它们是 MIPS 调用约定参数寄存器。
未初始化的参数寄存器可能被当作参数。
在 MIPS 调用约定中,$v0是返回值寄存器。但它从未设置,所以这个片段没有返回值。
因此,函数的签名有可能是两个参数并且没有返回值。
但是,我们无法知道整个函数,因为 $t2也未初始化,但不是参数寄存器。显然缺少代码也引发了问题 $a0$a1实际上是参数或只是局部变量。此外,由于缺少机器码,也可能有返回值但我们没有看到它。
如果是我,我会将 C 编写为一个函数,它带有您使用的类型的两个参数( $a0$a1 )。我会描述 $t2作为用 ? 初始化的局部变量又名未知,但我还要添加一个警告,这是由于机器代码片段不完整而导致的猜测。

关于将大端 MIPS 转换为 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63409245/

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