X86汇编入门-概述 - 弦外之音

/ 0评 / 1

汇编是很底层的 编程语言,一条汇编指令对应一条机器指令,机器指令是 A0 00010400 之类的二进制指令。

例如 addl %ebx,%eax 翻译成 机器指令 就是 d8 01 。汇编指令 addl 在计算机存储的时候 是 ASCII 码来的,是单字节字符串。 汇编器把 这些汇编字符串 翻译成 二进制指令,就叫 parse。

C 语言的代码 也是字符串存储,把 C 语言 翻译(parse) 成 汇编,汇编再翻译成 二进制机器指令。

现代 汇编语言 的应用,基本上都是在 操作系统 之上 使用汇编语言,虽然 用汇编语言 能重造 一个 linuxwindows 操作系统。

但是 现在工程开发,包括 ffmpegstate-thread,使用的部分汇编功能,都是在 操作系统 之上的。

所以 学习 汇编语言,你不要把他看成 是一种 脱离 操作系统的 东西,虽然 它汇编 确实是可以脱离操作系统 ,在裸机器上跑。但是现在已经很少在裸机器上跑汇编了,过去的几十年技术发展,有丰厚的技术积累,很多东西已经分层,封装好了。

在操作系统实现的过程中,因为要让上层应用能做一些精细控制,所以才暴露了 汇编 接口 给程序员用。

所以 学习跟 使用汇编,你要 把 汇编 看成 跟 C 语言一样的东西,他们都是编程语言他们都是编程语言

在操作系统 之上使用 汇编,就跟 使用 C 语言类似,有很多 操作系统的 API 函数可以调用。



汇编程序 在 操作系统的运行是单独开一个进程来运行的,不同的 汇编程序 无法操作其他进程的内存数据。 虽然 汇编是硬件级语言,本来是可以直接操作内存硬件,但是在操作系统里面就是不行。

这个 就是 保护模式 (Protected Mode),保护模式是处理器的原生状态,在这种模式下,所有的指令和特性都是可用的。分配给程序的独立内存区域被称为段,而处理器会阻止程序使用自身段范围之外的内存。

大部分应用程序,nginxapache ,包括我们自己的写的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。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注