我如何将Intel 80386机器代码转换为汇编语言?

时间:2010-01-31 22:06:57

标签: assembly x86 intel disassembly machine-code

我接到了以下任务:

  

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

     

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指令集,我必须首先将这些操作码字节转换为它们的汇编语言助记符。那么,是否有某个在线参考,一个表格将十六进制值映射到指令等?我查看了英特尔的网站,但什么都找不到。或者有更好的解决方法......?

6 个答案:

答案 0 :(得分:10)

虽然你可以作弊并使用反汇编程序(反汇编程序不会非常帮助学习),但我建议学习阅读Intel 80386 manual中相关章节的内容。从第17章开始。如果/当你遇到困难时,请回到StackOverflow并发布一个问题,说明你到底有多远以及你不理解的内容。

答案 1 :(得分:2)

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

ndisasm -b 32 file        # -b 32 specifies you're running in 32 bit mode

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

  1. 转到命令提示符
  2. 运行Debug
  3. 命令“e”
  4. 输入字节值
  5. 命令“你”
  6. 阅读结果
  7. 从图表中解码操作码是非常非常乏味的,如果这是预期的,我会感到惊讶。

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

// hex.c
1   #include <sys/mman.h>
2   #include <string.h>
3   
4   int main () {
5     char code[] = {0xB8, 0x3C, 0x0, 0x0, 0x0, 0xBF, 0x2, 0x0, 0x0, 0x0, 0xBA, 0x7D, 0x0, 0x0, 0x0, 0xC3};
6     void *buf;
7     buf = mmap (0,sizeof(code),PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_ANON,-1,0);
8     memcpy (buf, code, sizeof(code));
9     return 0;
10  }

// gcc -g hex.c -o hex
gdb hex;
b 9;
r;
x /10i buf

mov $0x3c,%eax
mov $0x2,%edi
mov $0x7d,%edx
ret