汇编是很底层的 编程语言,一条汇编指令对应一条机器指令,机器指令是 A0 00010400
之类的二进制指令。
例如 addl %ebx,%eax
翻译成 机器指令 就是 d8 01
。汇编指令 addl
在计算机存储的时候 是 ASCII 码来的,是单字节字符串。 汇编器把 这些汇编字符串 翻译成 二进制指令,就叫 parse。
C 语言的代码 也是字符串存储,把 C 语言 翻译(parse) 成 汇编,汇编再翻译成 二进制机器指令。
现代 汇编语言 的应用,基本上都是在 操作系统 之上 使用汇编语言,虽然 用汇编语言 能重造 一个 linux
或 windows
操作系统。
但是 现在工程开发,包括 ffmpeg
,state-thread
,使用的部分汇编功能,都是在 操作系统 之上的。
所以 学习 汇编语言,你不要把他看成 是一种 脱离 操作系统的 东西,虽然 它汇编 确实是可以脱离操作系统 ,在裸机器上跑。但是现在已经很少在裸机器上跑汇编了,过去的几十年技术发展,有丰厚的技术积累,很多东西已经分层,封装好了。
在操作系统实现的过程中,因为要让上层应用能做一些精细控制,所以才暴露了 汇编 接口 给程序员用。
所以 学习跟 使用汇编,你要 把 汇编 看成 跟 C 语言一样的东西,他们都是编程语言,他们都是编程语言。
在操作系统 之上使用 汇编,就跟 使用 C 语言类似,有很多 操作系统的 API
函数可以调用。
汇编程序 在 操作系统的运行是单独开一个进程来运行的,不同的 汇编程序 无法操作其他进程的内存数据。 虽然 汇编是硬件级语言,本来是可以直接操作内存硬件,但是在操作系统里面就是不行。
这个 就是 保护模式 (Protected Mode),保护模式是处理器的原生状态,在这种模式下,所有的指令和特性都是可用的。分配给程序的独立内存区域被称为段,而处理器会阻止程序使用自身段范围之外的内存。
大部分应用程序,nginx
,apache
,包括我们自己的写的C程序代码,都是跑在 保护模式 (Protected Mode) 下的。
nginx
奔溃了,不会影响到 apache
,这些程序被操作系统封装 保护起来了,所以 叫 保护模式。我们知道 汇编 是能直接 访问内存硬件的,如果不加以保护,就会导致全部程序崩溃。
比较常见的还有 一个 模式 是 实地址模式 (Real-Address Mode) ,这个是早期 intel 处理器的编程环境,应该是裸机器用的,没有操作系统的汇编环境。程序员一般很少接触到这个模式。
所以 对于 比较多的程序员来说,最常接触的 就是保护模式,只需要了解 保护模式下 汇编程序的 机制就行,其他的模式用到再说。
上面讲的 模式 是 32 位的,64位的操作模式不是这样。64 位是 基于 x86 指令集进行扩展的,所以是向后兼容 x86 指令集。
64 位 操作模式有两种:
1,兼容模式,兼容以前的 16 位跟 32位。
2,64 位模式,把这个模式看成是 32 位的保护模式就行,一样不能操作其他进程的内存,只是功能更强大了。
扩展知识:
1,我们经常见到的 X86-64 这个词,这个 X86 代表 CPU 是 x86 架构,intel 跟 AMD 很多 CPU 都是 x86 架构。后面的 64
代表 这是一个64位的系统,或者程序是运行在 64 位模式下的。
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。QQ:2338195090。