我接到了以下任务:
考虑以下十六进制值序列:
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指令集,我必须首先将这些操作码字节转换为它们的汇编语言助记符。那么,是否有某个在线参考,一个表格将十六进制值映射到指令等?我查看了英特尔的网站,但什么都找不到。或者有更好的解决方法......?
答案 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)
有一个比建议的方法简单得多的方法,我怀疑这是老师的想法:
从图表中解码操作码是非常非常乏味的,如果这是预期的,我会感到惊讶。
答案 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