道生一,一生二,二生三,三生万物。
关于汇编语言的诞生
CPU 只负责计算,本身不具备智能。因此无论何种高级语言,其本质都是 0 或 1 组成的机器语言。但是机器语言可读性极差,且代码量巨大,难以使用。因此,汇编语言作为一种简单一些的语言出现了。
汇编语言简单介绍
汇编语言, 即第二代计算机语言,用一些容易理解和记忆的字母,单词来代替一个特定的指令,比如:用“ADD”代表数字逻辑上的加减,“ MOV”代表数据传递等等,通过这种方法,人们很容易去阅读已经完成的程序或者理解程序正在执行的功能,对现有程序的 bug 修复以及运营维护都变得更加简单方便。但计算机的硬件不认识字母符号,这时候就需要一个专门的程序把这些字符变成计算机能够识别的二进制数。因为汇编语言只是将机器语言做了简单编译,所以并没有根本上解决机器语言的特定性,所以汇编语言和机器自身的编程环境息息相关,推广和移植很难,但是还是保持了机器语言优秀的执行效率,因为他的可阅读性和简便性,汇编语言到现在依然是常用的编程语言之一。汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。
(引自百度百科)
寄存器
学习汇编语言,首先必须明白寄存器和内存模型。 我们先简单讲解一下 CPU: 中央处理器(CPU)由三个部分组成:1、运算器;2、控制器;3、寄存器。 其中,运算器用来处理信息,即执行指令;控制器用于控制其他器件进行工作。简单的理解就是这两者分别协调软件和硬件。而寄存器是用来储存信息的。 CPU 的运算速度远大于内存读写的速度,因此为了避免被读写拖慢速度,CPU 一般会设置缓存。但数据在缓存中的地址并不固定,CPU 每次寻址都会消耗时间。于是 CPU 集合了寄存器(register),用于储存常用的地址。 C 语言中的 register 关键字就是将变量储存到寄存器中以提高运行速度。
for (register int i = 1; i <= n; ++i) calc(i);
for (int i = 1; i <= n; ++i) calc(i);
寄存器其实是依靠名称去读数据,而不是地址,因此运行效率大大提升。故寄存器也被称为 CPU 的零级缓存。 早期的 x86 CPU 只有8个寄存器,且每个寄存器都有不同的用途。现在的寄存器都变成了通用寄存器,没有固定名称也没有指定的用途,只是早期寄存器的名字都被保存了下来。
EAX
EBX
ECX
EDX
EDI
ESI
EBP
ESP
其中 ESP 用于保存栈(stack)的地址。 所谓的 32 位、64 位 CPU,就是指寄存器的大小,其中 32 位CPU 寄存器大小为 4 字节。
内存模型:堆(heap)
寄存器只能储存极少量数据,大部分数据都是储存在堆里。每个程序起始时,都会被系统分配一段空间。C 语言中的 new 和 delete 操作就是对堆的操作。堆内的数据无法自动消失,必须手动释放,或利用系统的回收机制释放。
内存模型:栈(stack)
简单来讲,栈是由于函数运行而临时占用的内存区域。 比如一下程序:
int main()
{
int a = 1, b = 2;
}
执行起来是这样的 同理,若调用函数,被调用的函数会继续入栈
int add(int a, int b)
{
return a + b;
}
int main()
{
add(1, 2);
}
后记
技术在进步,底层原理也在被遗忘。我希望在自己学习的同时与各位交流学习心得,推动国内信息技术的发展。现在我们有初出茅庐的鸿蒙,将来,我们也会有媲美 Windows、Mac、Linux 的中国操作系统。 最后,我要表明我所写的内容都是本人的学习笔记,其中可能会有错误,欢迎大家指正。本系列不定期更新。
编辑日期:2021-12-12 修改日期:2021-12-12
|