首先,我知道这是一个非常奇怪的请求。我只希望它作为计算机课上的教学辅助工具。很高兴能够以二进制形式显示一个指令,以显示哪些位将转到操作码,参数等。完整的十六进制是好的,但如果可能的话,我正在寻找二进制文件。
我正在使用OSX(Mountain Lion)。
我已经使用以下命令(单独)来获得汇编:
clang -emit-llvm -S sum.cpp
clang -S -mllvm --x86-asm-syntax=intel sum.cpp
我使用以下命令获取一些十六进制值:
otool sum.o -tV
但我真的想以某种方式获得每条指令的完整二进制代码。穿插的东西是理想的,但这可能要求太多。
我想我可以在十六进制编辑器中查看obj代码,但是不能确保指令正确对齐,以使它们“易于”阅读或理解。
答案 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]
最后一步是开发一个将十六进制转换为二进制的程序。