如何解决将Big-Endian MIPS转换为C
对于一个学术问题,考虑到以下大端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
描述为以?
再次初始化的局部变量,但我还要说明一下,由于机器代码片段的不完整,这是一种猜测。
在大多数情况下,可以使用htonl()或ntohl()来进行字节转换。
可以快速实现:
int iIn,iOut;
char *pIn,*pOut;
iIn = 0x123456789;
pIn = (char*) &iIn;
pOut = (char*) &iOut;
pOut[0] = pIn[3];
pOut[1] = pIn[2];
pOut[2] = pIn[1];
pOut[3] = pIn[0];
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。