我无法理解一个事实:源代码是文本,它会被翻译成汇编语言(大致如此),但如果我能看到汇编语言,那就意味着它也是文本,机器码也是如此。这个“文本”在什么时候变成 CPU 中的信号。
答案1
当然都是文本,区别在于抽象层次。汇编语言和 C 语言的 Hello World
SECTION .data ; initialised data section
Msg: db "hello world", 10 ; message to print
MsgLen: equ $ - Msg ; length of message
SECTION .text ; code section
global start
start:
; printing message, use write()
; system call 4 syntax:
; user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte)
push dword MsgLen
push dword Msg
push dword 1
sub esp, 4
mov eax, 4
int 80H
add esp, 16
; program exit, use sys_exit()
push dword 0
sub esp, 4
mov eax, 1
int 80H
相对
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
}
换句话说,没有打印到屏幕命令,但 C 允许我们使用。这意味着 PRINT 实际上代表了一堆 CPU 可以处理的低级代码。汇编更接近 CPU 可以处理的指令。
我们不能告诉它打印到屏幕上,我们必须告诉它如何一步一步地做。像 C 这样的语言更接近人类语言,但它需要将命令翻译成 CPU 可以理解的东西。汇编语言是告诉 CPU 做什么的更直接的方式,机器语言以更文本的形式表示。
它与我们在计算机中随处可见的数据表示的低级到高级级别相同。例如,“HELLO”(ascii)表示为十六进制“48 45 4C 4C 4F”,二进制表示为“01001000 01000101 01001100 01001100 01001100 01001111”。一般来说,越接近“计算机语言”,我们人类就越难理解。
甚至更低的级别,零和一也会变成编码脉冲或电信号和电荷。简化,除了“HELLO”之外还有一些抽象层,例如要写入 SSD 的是“01001000 01000101 01001100 01001100 01001100 01001111”>,它被转换为电荷以对单个 NAND 单元进行编程。是的,0100 等是可读文本,但它是模拟信号的解释/表示。
答案2
一切都是文本,文本是二进制编码的...所以无论您看到什么(无论是源代码、机器代码、音乐文件还是介于两者之间的任何内容)实际上始终是 1 和 0(开和关)。
这机器代码只是 CPU 被设计用来读取的语言中的指令(CPU 不会读取十六进制或其他什么,它知道读取 1 和 0,并使用每组二进制数据来找出要执行的操作的指令。)
答案3
源代码是文本,
没错,但是“源代码“是含糊的。有高级编程语言,也有汇编语言。如果你用汇编语言编写,那么汇编语言就是你的源代码。
它被翻译成汇编语言(大致),但如果我能看到汇编语言,那也意味着它是文本,机器代码也是一样。
是的,编译器通常将高级编程语言转换为汇编语言,然后再转换为机器代码。
不要将汇编语言与机器代码混为一谈。
汇编语言有象征性的标签和变量名。
机器代码仅使用数字地址。
尝试用机器代码(仅由数字甚至操作码助记符组成)手写程序,您就会开始理解与汇编语言的实际区别。
编程语言(高级语言或汇编语言)的一个显著特点是使用语句标签和命名变量的能力。语句标签允许您插入或删除其他语句,并让编译器(或汇编器)处理地址更改。命名变量的能力意味着您让编译器分配存储位置并处理地址引用。
这个“文本”在CPU中变成信号的时刻是什么时候。
这 ”源代码“需要编译并组装成机器代码。
该机器代码可能以可加载到内存并执行的程序(称为二进制可执行文件)的形式存在。此类可执行文件通常是独立程序,不需要操作系统(请参阅可执行文件是否需要操作系统内核才能运行?)。
在操作系统下执行的机器代码通常以指定依赖项(例如动态链接器和共享库)的文件格式打包。操作系统将验证权限、分配资源、将可执行文件加载到内存中、执行地址重定位和/或与共享库链接,然后允许程序执行。
机器代码(在主内存中)由 CPU 指令组成,可以显示为数字。
基本 CPU 不断执行一个周期的
- 获取存储在寄存器中的内存地址的(下一条)指令
Program Counter
; - 增加
Program Counter
寄存器; - 将该指令解码为操作码和操作数;
- 执行该指令。
处理器缓存、指令流水线、预测分支、等等是 CPU 增强功能,不会影响对数字计算机基本操作的理解
答案4
从回复的问题评论来看:
为了更好地解释:我认为作为机器代码的“一”和“零”的存储方式与作为文本的“一”和“零”的存储方式不同
那是对的。
test
让我们创建一个包含数字0
的文件ASCII 文本:
$ echo 0 > test
$ cat test
0
test
现在,让我们看一下二进制表示的文件:
$ xxd -b test | cut -d ' ' -f 2
00110000
这个二进制数可以转换成十进制。在 ASCII 表中查找,这是文本字符的代码0
。
$ python3 -c 'print(chr(48))'
0
现在,让我们以二进制(机器码的存储方式)向文件写入 0,然后查看:
$ dd if=/dev/zero bs=1 count=1 of=test
1+0 records in
1+0 records out
1 byte copied, 0.000234102 s, 4.3 kB/s
$ $ xxd -b test | cut -d ' ' -f 2
00000000
tl;dr 文本使用编码(例如 ASCII)存储,以将字符映射到一系列二进制数字。