3

我被赋予了以下任务:

考虑以下十六进制值序列:

55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3

此字节序列表示 32 位模式下 Intel 80386 机器语言中的子例程。

  • 当执行此子程序中的指令时,它们会将值留在寄存器 %ecx 和 %edx 中。价值观是什么?

  • 执行此子例程完成的计算的 C 程序是什么,然后打印由该程序计算的 %ecx 和 %edx 的值,就像它们在子例程执行结束时出现的那样。

由于我没有记住 80386 指令集,我必须首先将这些操作码字节转换为它们的汇编语言助记符等价物。那么,在某处是否有在线参考,将十六进制值映射到指令之类的表?我查看了英特尔的网站,但一无所获。还是有更好的方法来破译这个......?

4

5 回答 5

10

虽然您可以作弊并使用反汇编程序(反汇编程序对学习没有太大帮助),但我建议您通过阅读Intel 80386 手册中的相关章节来实际学习一些东西。从第 17 章开始。如果/当您遇到困难时,请返回 StackOverflow 并发布一个问题,说明您已经完成了多远以及您不了解的内容。

于 2010-01-31T22:28:43.913 回答
2

您应该使用反汇编程序来查看说明是什么。您可以从NASM 包中获取 NDISASM 。将字节存储在文件中并运行:

ndisasm -b 32 file        # -b 32 specifies you're running in 32 bit mode
于 2010-01-31T22:08:53.680 回答
1

我不会使用反汇编程序,而是阅读说明手册并弄清楚每组位的含义。这将为您提供相应的组装说明。从那里开始,将其放入 C 中应该不会太难。我同意另一张海报,即在 x86 中执行此任务时搞砸了。SPARC 或 MIPS 之类的东西会容易得多(因为它们有固定宽度的指令)。

于 2010-02-01T03:58:49.117 回答
0

有一种比建议的方法更简单的方法,我怀疑这是老师的想法:

  1. 转到命令提示符
  2. 运行调试
  3. 命令“e”
  4. 输入字节值
  5. 命令“你”
  6. 阅读结果

从图表中解码操作码非常非常乏味,如果这是我想要的,我会感到惊讶。

于 2010-02-01T21:57:21.567 回答
0

如果您使用的是 Unix,请使用 objdump -d。

于 2010-02-04T10:21:40.117 回答