gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:43:52 25 4
gpt4 key购买 nike

首先,我知道这是一个非常奇怪的请求。我只想要它作为计算机课的教具。很高兴能够以二进制形式显示一条指令,以显示哪些位将进入操作码、参数等。完整的十六进制没问题,但如果可能的话,我正在寻找二进制。

我正在使用 OSX (Mountain Lion)。

我使用了以下命令(分别)来获取程序集:

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

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

otool sum.o -tV

但我真的很想以某种方式获得每条指令的完整二进制行。穿插一些东西会很理想,但这可能要求太高了。

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

最佳答案

我只能代表 Linux,但也许它有帮助。您可以使用 objdump 获取散布的 source-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;
}

编译 & 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]

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

关于c++ - 为 OSX 上的简单 C/CPP 程序获取文本化二进制文件(0 和 1)的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26738393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com