- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于学术问题,鉴于以下大端 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/
我有一条记录: Tconnecting = record var a: int64; b: integer; c: integer; end; 我需要使用UDP协议
我知道,我知道,这听起来很简单,但我很困惑。如果您有以下输入 Data : 1100 0101 1010 1101 并且您想将大端转换为小端,或反之,您认为以下哪项是正确的输出? 1011 0101
我目前正在处理的项目需要与我们不制作的客户端系统交互,因此我们无法控制数据的发送方式。问题是在 C# 中工作,它似乎对 UCS-2 没有任何支持,对 big-endian 的支持也很少。 (据我所知)
我正在编写一个函数,将 ascii 字符串转换为其大端字节序的二进制表示形式。 这是我的代码: int count = 0; for (int i = 0; i = 0; k--) {
我从 MSDN 中找到了以下函数它将 unsigned long 从网络字节转换为主机字节顺序的 unsigned long,即在 little-endian 中定义为: u_long WSAAPI
我正在使用 AES Rijndael 的公共(public)领域引用实现,通常以名称“rijndael-fst-3.0.zip”分发。我打算用它来加密网络数据,我想知道加密结果在大/小端架构上是否会有
我有一个十六进制字符串,其内容为18000000,该字符串采用主机字节顺序(小端),我需要将其转换为网络字节顺序(大端)。生成的十六进制字符串将为 00000018。 总而言之,我需要转换180000
我有一个十六进制字符串,其内容为18000000,该字符串采用主机字节顺序(小端),我需要将其转换为网络字节顺序(大端)。生成的十六进制字符串将为 00000018。 总而言之,我需要转换180000
我正在生成用于模拟网络的单元测试的二进制文件。通过网络发送的一些数据采用 Little Endian 或 Big Endian 模式,我想使用 stub 模拟这些数据并创建二进制文件。 因此,换句话说
这个问题在这里已经有了答案: Endianness Work-around Needed (2 个答案) 关闭 9 年前。 我有一个包含 n 个单精度值的二进制文件。我知道写入数据时使用的格式是大端
我有一个 4 字节编码的日期(大端),我试图从二进制文件中读取它。 我愿意: char date[4]; long seconds; s = read(fd, date, sizeof(char) *
在 Python2.7 中,通过 USB 批量传输,我从相机中获取图像帧: frame = dev.read(0x81, 0x2B6B0, 1000) 我知道一帧是 342x260 = 88920 像
我有一个 byte[4],它包含一个 32 位无符号整数(按大端顺序),我需要将它转换为 long(因为 int 不能保存无符号数)。 此外,我该如何反之(即从包含 32 位无符号整数的 long 到
public static void main(String[] args) { File inFile = null; if (0 0) { getMarker(re
我正在使用 Node.JS。 Node's buffers支持小端 UCS-2,但不支持我需要的大端。我该怎么做? 最佳答案 根据维基百科,UCS-2 should always be big-end
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我需要通过串行线路 (RS-232) 从 Arduino 接收十六进制编码的单精度大端浮点值。如何将它们转换为 Python 的 double 大端字节序的 float ? Arduino 发送类似“
类似于如何使用包: N An unsigned long (32-bit) in "network" (big-endian) order. 是否有任何方法可以在 Perl 中以“网络”(大端)顺序
我有一个这样的 C 结构...... struct icmp_prefixopt { u_int8_t icmpopt_type; u_int8_t icm
我正在使用 PHP、fopen、fseek、pack 等创建然后将数据写入文件(一个新的“ESRI Shape 文件”)。文件规范在这里 http://www.esri.com/library/whi
我是一名优秀的程序员,十分优秀!