2013-07-16 18 views
2

我在组件任何方法从机器码获取助记符?

.text 
.globl _start 
_start: 
     movl $1, %eax 
     movl $1, %ebx 
     int $0x80 

我已组装它有一个简单的程序的程序。我有倾倒它的内容如下

[email protected]:~# objdump -d out  
out:  file format elf32-i386 
Disassembly of section .text: 

08048054 <_start>: 
8048054:  b8 01 00 00 00   mov $0x1,%eax 
8048059:  bb 01 00 00 00   mov $0x1,%ebx 
804805e:  cd 80     int $0x80 

现在的问题是,我可以回去只给出下面的机器代码的助记符\xb8\x01\x00\x00\x00\xbb\x01\x00\x00\x00\xcd\x80

+1

x86是可变的指令长度,所以一般来说你不能接受任何旧的字节和解码它们。助记符就是这样,机器码就是指令,助记符只是某人的解释,反汇编程序通常会这样做,但您可以使用处理器供应商提供的文档自己完成此操作。 –

+0

现在,这是非常非常恼人的从文档逐行翻译。我最终发现了他们对NASM的解散程序集合ndisasm,但是我正在使用GAS汇编程序,无论如何回到GAS有点助记符 – vikkyhacks

+0

@dwelch,当然这是可能的 - 你只需要假设字节*是*指令。 –

回答

5

这是相当有据可查How do I disassemble raw x86 code?

做你的天赋IFIC例如,这个工作对我来说(在Linux计算机上,用GNU工具链):

printf '\xb8\x01\x00\x00\x00\xbb\x01\x00\x00\x00\xcd\x80' > /tmp/binary 
objdump -D -b binary -mi386 /tmp/binary 

有了这个作为选项简短的文档:

  [-D|--disassemble-all] 
      [-b bfdname|--target=bfdname] 
      [-m machine|--architecture=machine] 

I386指定目标。我必须从原始示例命令中删除addr16和data16,否则这将无法工作。

3

你只需要告诉objdump要在一个操作纯二进制文件:

$ hexdump -vC binaryFile 
00000000 b8 01 00 00 00 bb 01 00 00 00 cd 80    |............| 
0000000c 
$ objdump -D -b binary -m i386 binaryFile 

binaryFile:  file format binary 


Disassembly of section .data: 

00000000 <.data>: 
    0: b8 01 00 00 00   mov $0x1,%eax 
    5: bb 01 00 00 00   mov $0x1,%ebx 
    a: cd 80     int $0x80 
+0

user2258778的回答下面是一个小清洁。 objdump工具支持用于反汇编原始数据的“二进制”格式。不需要使用objcopy来生成ELF文件。 –

+0

是的 - 我更多地阅读了objdump手册页后更新了我的答案。 –

相关问题