我总是想知道可执行文件中的符号是什么意思,例如当我汇编我的程序时,它会创建一个文件,但是当我用文本编辑器打开该文件时,它有这些不可读的代码,例如^ @ ^ B这是机器代码吗?我以为机器代码就像汇编一样,但是带有二进制文件。
答案 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),但它通常与指令的编码不重叠。当一串二进制数字与有效可打印字符的编码不匹配时,它通常与转义序列或其他各种事物相匹配,因此它们会像这些奇怪的符号一样显示。
请注意,说明和字符的长度通常不同,因此不要指望一个符号必然意味着"机器代码"。
编辑:这是一个非常简化的可执行格式模型,仅用于解释符号是什么。可执行文件比指令列表更复杂。