在OSX上为简单的C / CPP程序获取文本化二进制(0和1)的最简单方法

时间:2014-11-04 15:03:17

标签: c++ macos assembly binary clang

首先,我知道这是一个非常奇怪的请求。我只希望它作为计算机课上的教学辅助工具。很高兴能够以二进制形式显示一个指令,以显示哪些位将转到操作码,参数等。完整的十六进制是好的,但如果可能的话,我正在寻找二进制文件。

我正在使用OSX(Mountain Lion)。

我已经使用以下命令(单独)来获得汇编:

clang -emit-llvm -S sum.cpp
clang -S -mllvm --x86-asm-syntax=intel sum.cpp

我使用以下命令获取一些十六进制值:

otool sum.o -tV

但我真的想以某种方式获得每条指令的完整二进制代码。穿插的东西是理想的,但这可能要求太多。

我想我可以在十六进制编辑器中查看obj代码,但是不能确保指令正确对齐,以使它们“易于”阅读或理解。

1 个答案:

答案 0 :(得分:0)

我只能说Linux,但也许它有帮助。您可以使用objdump来获取散布的源-hex-asm-output。

示例(sum.cpp):

#include <iostream>
using namespace std;

int sum (int a, int b)
{
    return a + b;
}

int main ()
{
    int a = 3, b = 4, c;
    c = sum (a,b);
    cout << c << endl;
    return 0;
}

编译&amp; objdump的:

clang++ -g sum.cpp 
objdump -d -S -C -Mintel a.out >objdump.txt

您可以在objdump.txt内搜索并找到:

00000000004007f0 <sum(int, int)>:
#include <iostream>
using namespace std;

int sum (int a, int b)
{
  4007f0:   89 7c 24 fc             mov    DWORD PTR [rsp-0x4],edi
  4007f4:   89 74 24 f8             mov    DWORD PTR [rsp-0x8],esi
    return a + b;
  4007f8:   8b 74 24 fc             mov    esi,DWORD PTR [rsp-0x4]
  4007fc:   03 74 24 f8             add    esi,DWORD PTR [rsp-0x8]
  400800:   89 f0                   mov    eax,esi
  400802:   c3                      ret    
  400803:   66 66 66 66 2e 0f 1f    data32 data32 data32 nop WORD PTR cs:[rax+rax*1+0x0]
  40080a:   84 00 00 00 00 00 

0000000000400810 <main>:
}

int main ()
{
  400810:   55                      push   rbp
  400811:   48 89 e5                mov    rbp,rsp
  400814:   48 83 ec 20             sub    rsp,0x20
  400818:   c7 45 fc 00 00 00 00    mov    DWORD PTR [rbp-0x4],0x0
    int a = 3, b = 4, c;
  40081f:   c7 45 f8 03 00 00 00    mov    DWORD PTR [rbp-0x8],0x3
  400826:   c7 45 f4 04 00 00 00    mov    DWORD PTR [rbp-0xc],0x4
    c = sum (a,b);
  40082d:   8b 7d f8                mov    edi,DWORD PTR [rbp-0x8]
  400830:   8b 75 f4                mov    esi,DWORD PTR [rbp-0xc]
  400833:   e8 b8 ff ff ff          call   4007f0 <sum(int, int)>
  400838:   48 8d 3c 25 40 0d 60    lea    rdi,ds:0x600d40
  40083f:   00 
  400840:   89 45 f0                mov    DWORD PTR [rbp-0x10],eax
    cout << c << endl;
  400843:   8b 75 f0                mov    esi,DWORD PTR [rbp-0x10]
  400846:   e8 05 fe ff ff          call   400650 <std::ostream::operator<<(int)@plt>
  40084b:   48 8d 34 25 b0 06 40    lea    rsi,ds:0x4006b0
  400852:   00 
  400853:   48 89 c7                mov    rdi,rax
  400856:   e8 45 fe ff ff          call   4006a0 <std::ostream::operator<<(std::ostream& (*)(std::ostream&))@plt>
  40085b:   b9 00 00 00 00          mov    ecx,0x0
    return 0;
  400860:   48 89 45 e8             mov    QWORD PTR [rbp-0x18],rax
  400864:   89 c8                   mov    eax,ecx
  400866:   48 83 c4 20             add    rsp,0x20
  40086a:   5d                      pop    rbp
  40086b:   c3                      ret    
  40086c:   0f 1f 40 00             nop    DWORD PTR [rax+0x0]

最后一步是开发一个将十六进制转换为二进制的程序。