将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];

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...