可执行文件中的符号是什么?

时间:2018-02-02 01:43:00

标签: c assembly executable binaryfiles machine-code

我总是想知道可执行文件中的符号是什么意思,例如当我汇编我的程序时,它会创建一个文件,但是当我用文本编辑器打开该文件时,它有这些不可读的代码,例如^ @ ^ B这是机器代码吗?我以为机器代码就像汇编一样,但是带有二进制文件。

2 个答案:

答案 0 :(得分:1)

您看到的是以ersatz表示形式显示的不可打印字符。基本上,UNIX终端驱动程序在某些情况下会将不可打印的字符转换为^X形式的序列,表示ASCII代码等于X的字符027 0x1f )。这是一张完整的表格:

000 NUL ^@    001 SOH ^A    002 STX ^B    003 ETX ^C
004 EOT ^D    005 ENQ ^E    006 ACK ^F    007 BEL ^G
010 BS  ^H    011 HT  ^I    012 LF  ^J    013 VT  ^K
014 FF  ^L    015 CR  ^M    016 SO  ^N    017 SI  ^O
020 DLE ^P    021 DC1 ^Q    022 DC2 ^R    023 DC3 ^S
024 DC4 ^T    025 NAK ^U    026 SYN ^V    027 ETB ^W
030 CAN ^X    031 EM  ^Y    032 SUB ^Z    033 ESC ^[
034 FS  ^\    035 GS  ^]    036 RS  ^^    037 US  ^_

最常见的是^@表示全零的字节。使用像

这样的十六进制转储工具
od -x binary

确认这一点。

答案 1 :(得分:0)

符号是对基础"机器代码"或字节码的错误表示(它取决于文件的可执行类型)。在大多数体系结构中,代码按照指令传递给CPU,这些指令长度为几个字节(取决于体系结构和指令格式)。这些指令以二进制编码,因此指令可能类似于

001011000011010...1001110010

请注意,这是一个简单的示例,通常没有人查看指令的实际二进制或十六进制编码,但是它的编码表示对人眼有更多的意义。这看起来像mov r0 r3

当你运行二进制文件时,你可以想到CPU通过指令读取文件指令并执行它。但是当您尝试使用文本编辑器打开二进制文件来读取它时,它会尝试将文件解释为文本,而不是指令集。字符有自己的二进制编码(通常是UTF-8),但它通常与指令的编码不重叠。当一串二进制数字与有效可打印字符的编码不匹配时,它通常与转义序列或其他各种事物相匹配,因此它们会像这些奇怪的符号一样显示。

请注意,说明和字符的长度通常不同,因此不要指望一个符号必然意味着"机器代码"。

编辑:这是一个非常简化的可执行格式模型,仅用于解释符号是什么。可执行文件比指令列表更复杂。