
深入理解计算机系统
不用多说,基本功很重要
程序员可乐、
一个有故事的程序员,持续更新技术教程
展开
-
深入理解计算机系统(序章)------谈程序员为什么要懂底层计算机结构
万丈高楼平地起,计算机系统就像程序员金字塔的地基。理解了计算机系统的构造原理,在写程序的道路上才能越走越远。道理LZ很早就懂了,可是一直没下定决心好好钻研,或许是觉得日常工作中根本用不到这些,又或许是每次拿起书看到那些复杂的底层架构,看到存储器,寄存器,CPU,总线等等这些概念就头大。总之,由于各种各样的原因,对这块的知识一直没有认真花时间去钻研。那么你可能会问,那你写这篇博客的题目...原创 2017-09-08 09:08:00 · 555 阅读 · 19 评论 -
深入理解计算机系统(1.1)------Hello World 是如何运行的
上一篇序章我谈了谈程序员为啥要懂底层计算机结构,有人赞同也有人反对也好,这都是博主的个人见解,但是博客还是要坚持学下去。这篇博客以案例驱动的模式,通过跟踪一个简单 Hello World 程序的生命周期开始系统的学习,包括它被程序员创建,到在系统上运行,输出简单的消息,然后终止。LZ 将沿着这个程序的声明周期,先简要的介绍一些逐步出现的关键概念、专业术语以及组成部分。后面将会详细...原创 2017-09-11 09:07:00 · 1278 阅读 · 26 评论 -
深入理解计算机系统(1.2)------存储设备
上一章我们讲解了hello world 程序在计算机系统中是如何运行的。hello 程序的机器指令最初是存放在磁盘上的,当程序加载时,他们被复制到主存;当处理器运行程序的时候,指令又从主存复制到处理器。相似的,数据串"Hello World" 初始时在磁盘上,然后复制到主存,最后从主存上复制到显示设备。 从程序员的角度来看,上面的复制就是开销,减缓了程序的真正工作。因此如何将...原创 2017-09-11 19:43:00 · 212 阅读 · 1 评论 -
深入理解计算机系统(2.1)------信息的存储和表示
前面我们介绍了《深入理解计算机系统》第一章的内容----计算机系统漫游。包括简单介绍了 Hello World 程序在计算机中是如何运行的,存储设备的层次结构以及操作系统的抽象概念。第一章的内容只是对很多概念有个简单了解,所以还是不懂的话也不要紧,后面都会对这些概念进行深入的探究。而这一章我们将介绍《深入理解计算机系统》第二章----信息的表示和处理。 程序=数据结构+算法,所...原创 2017-09-14 09:06:00 · 509 阅读 · 3 评论 -
深入理解计算机系统(3.4)------算术和逻辑操作
上一篇博客 我们介绍了几种数据传送指令,包括MOV,MOVS,MOVZ,PUSH和POP等,理解起来也不算难。本篇博客我们来接着看汇编语言的算术与逻辑运算指令,算术无非就是加减乘除,而逻辑运算也就是与或非,移位等操作。下面这张图是汇编里面的算术和逻辑操作: 上面除了 leal(加载有效地址)指令通常用来执行简单的算术操作,其余的指令都是标准的一元或者二元操作,下面我们...原创 2017-09-27 11:05:00 · 495 阅读 · 0 评论 -
深入理解计算机系统(3.5)------特殊的算术操作指令
在上一篇博客 算术和逻辑操作我们介绍了如下图几种常用的算术逻辑指令,但是大家发现没,这几种指令如果在 IA32 上只能操作32位寄存器,比如我用乘法指令IMUL得出的结果超过了32位,那就会产生结果溢出,那应该怎么办呢? 1、特殊的算术操作指令指令 如上图,上面的几个指令支持有符号和无符号的全64位乘积以及整数除法,但是需要注意的是,存储结果的寄存器固...原创 2017-10-01 10:57:00 · 2042 阅读 · 0 评论 -
深入理解计算机系统(3.7)------过程(函数的调用原理)
上篇博客我们讲解了计算机汇编语言是如何实现循环结构的。本篇博客我们将介绍汇编语言中过程的实现方式。 过程在高级语言中也称为函数,方法。一个过程的调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。此外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放空间。大多数机器,包括我们一直讲的 IA32,只提供转移控制到过程和从过程中转移出控制这种简单指...原创 2017-10-05 11:16:00 · 395 阅读 · 0 评论 -
深入理解计算机系统(4.1)------Y86指令集体系结构
本章我们将进入处理器体系结构介绍的神秘海洋中,我们熟悉的手机,电脑等设备的核心硬件都离不开处理器。处理器可以称的上是人类创造的最复杂的系统之一,一块手指大小的硅片,可以容纳一个完整的高性能处理器、大的高速缓存,以及用来连接外部的逻辑电路。而且由于摩尔定律,从性能上讲,今天一块芯片上的处理器,已经使得三十年前比房间那么大的超级计算机都相形见绌了。 那么可能有人会问,我们软件开发者...原创 2017-10-18 20:24:00 · 1921 阅读 · 0 评论 -
深入理解计算机系统(3.6)------汇编的流程控制
前面我们所讲的所有指令,代码执行顺序都是一条接着一条顺序的执行。但是实际上在编码过程中,会有某些结构,比如条件语句(if-else),循环语句(for,do-while)和分支语句(switch)等等,都要求有条件的执行,根据数据测试的结果来决定操作执行的顺序。 在机器代码中,提供两种基本的低级机制来实现有条件的行为:测试数据值,然后根据测试的结果来改变控制流或者数据流。 ...原创 2017-10-04 18:02:00 · 440 阅读 · 0 评论 -
深入理解计算机系统(4.2)------逻辑设计和硬件控制语言HCL
上一篇博客我们简单介绍了Y86指令集体系,而这篇博客我们将介绍指令集体系的逻辑设计和硬件控制语言HCL,为后面去实现Y86打下基础。 在硬件设计中,用电子电路来计算对位进行运算的函数,以及在各种存储器元素中存储位。大多数现代电路技术都是用信号上的高电压或者低电压来表示不同的位值。在当前的技术中心,逻辑 1 是用 1.0 伏特的高电压表示,而逻辑 0 是用 0.0 伏特的低电压表...原创 2017-10-19 14:25:00 · 1161 阅读 · 2 评论 -
深入理解计算机系统(2.7)------浮点数舍入以及运算
上一篇博客我们讲解了二进制小数如何表示以及IEEE浮点标准。而且我们也提到过因为这种表示方法限制了浮点数的范围和精度,浮点数只能近似的表示一个数。 比如 数字1/5,我们能用十进制小数 0.2 准确的表示,但是我们却不能把它准确的表示为一个二进制小数,我们只能通过增加二进制表示的长度来提高表示的精度。如下: 那我们该怎么办呢?1、舍入 对于不能精确...原创 2017-09-23 09:06:00 · 777 阅读 · 0 评论 -
深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准
整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题。但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了。 在 20世纪80年代以前,每个计算机厂商都设计了自己表示浮点数的规则,以及对浮点数执行运算的细节,这对于应用程序在不同机器上的移植造成了巨大的困难。而在这之后,也就是 1985年...原创 2017-09-22 10:27:00 · 515 阅读 · 2 评论 -
深入理解计算机系统(3.3)------操作数指示符和数据传送指令
在上一篇博客程序编码以及数据格式中我们给出了一个简单的C程序,然后编译成了汇编代码。大家看不懂没关系,后面的博客我们将逐渐揭开一些汇编指令的神秘面纱。本篇博客我们将对操作数指示符和数据传送指令进行详细的介绍。1、整数寄存器 上一篇博客我们讲了在汇编语言中,如下的几个处理器状态是可见的: 一、程序计数器(在 IA32 中通常称为 PC,用 %eip 表示):指...原创 2017-09-26 09:08:00 · 1379 阅读 · 6 评论 -
深入理解计算机系统(1.3)------操作系统的抽象概念
上一篇博客我们讲解了存储设备的层次结构,并详细讲解了高速缓存的原理,以及可以利用高速缓存来提高程序性能。如果对Java Web 熟悉的,我们可以理解高速缓存类似Web 端的缓存机制。那么这一篇博客我们来引出并谈谈操作系统的抽象概念。1、操作系统 首先接着来讨论 hello world 程序的例子。当外壳加载和运行 hello 程序,以及 hello 程序输出自己的消息...原创 2017-09-12 09:10:00 · 769 阅读 · 7 评论 -
深入理解计算机系统(3.1)------汇编语言和机器语言
《深入理解计算机系统》第三章——程序的机器级表示。作者首先讲解了汇编代码和机器代码的关系,阐述了汇编承上启下的作用;接着从机器语言IA32着手,分别讲述了如何存储数据、如何访问数据、如何完成运算以及如何进行跳转。通过这些步骤,又告诉了我们分支语句、循环语句是怎么完成的,函数调用、栈帧结构以及递归过程。最后能通过编译器产生的汇编代码表示,我们要了解编译器和它的优化能力,知道编译器能为我...原创 2017-09-24 10:08:00 · 833 阅读 · 2 评论 -
深入理解计算机系统(3.2)------程序编码以及数据格式
在进行本章的讲解之前,我们先说明讲解的机器语言型号。上一篇汇编语言和机器语言我们讲过,机器语言是直接面向处理器(Processor:CPU)的程序设计语言,但是每一种这样的微处理器(CPU)由于硬件设计和内部结构的不同,所以每一种微处理器都有自己的机器指令集,也就是机器语言。而汇编语言是便于记忆的机器语言。本系列博客将会介绍两种相关的机器语言:Intel IA32 和 x86-64。...原创 2017-09-25 13:57:00 · 266 阅读 · 3 评论 -
深入理解计算机系统(2.3)------布尔代数以及C语言运算符
本篇博客我们主要讲解计算机中的布尔代数以及C语言的几个运算符。1、布尔代数 我们知道二进制值是计算机编码、存储和操作信息的核心,随着计算机的发展,围绕数值0和1的研究已经演化出了丰富的数学知识体系。而布尔代数便是乔治.布尔(George Boole)将逻辑值 True(真)和 False(假)编码为二进制0和1,用来研究逻辑推理的一门数学学科。 对于布尔代数,我们需要...原创 2017-09-15 22:51:00 · 784 阅读 · 0 评论 -
深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
上一篇博客我们主要介绍了布尔代数和C语言当中的几个运算符。那么这一篇博客我们主要介绍在计算机中整数是如何表示的,诸如我们在编码过程中遇到的对数据类型进行强制转换可能会得到意想不到的结果在这篇博客里你会得到解答。1、什么是整数? 整数包含正整数,0,负整数。我们从小的数学常识,整数是无穷无尽的,即整数的大小没有限制。 但是在计算机中则不能这样理解,因为计算机是靠数...原创 2017-09-19 09:07:00 · 2061 阅读 · 3 评论 -
深入理解计算机系统(2.2)------进制间的转换原理
上一篇博客我们讲解了信息的在计算机中是如何存储以及如何表示的。但是对于各个进制的转换 LZ 只是一笔带过了,后来LZ仔细研究了进制转换的原理,发现还是挺有感悟的。那么这篇博客就讲讲进制转换。1、进制的介绍 在讲进制之前,我们先看一下数制的定义:用一组固定的数字和一套统一的规则来表示数目的方法称为数制。 而数制有进位计数制与非进位计数制之分。非进位计数制的数码表示...原创 2017-09-14 23:09:00 · 399 阅读 · 0 评论 -
深入理解计算机系统(5.1)------优化程序性能
你能获得的对程序最大的加速比就是当你第一次让它工作起来的时候。 在讲解如何优化程序性能之前,我们首先要明确写程序最主要的目标就是使它在所有可能的情况下都能正常工作,一个运行的很快的程序但是却是错误的结果是没有任何用处的,所以我们在进行程序性能优化之前,首先要保证程序能正常运行,且结果是我们需要的。 而且在很多情况下,让程序跑的更快是...原创 2017-11-06 21:31:00 · 298 阅读 · 5 评论 -
深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字...
上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点。这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字。1、C语言中的有符号数和无符号数 上一篇博客我们给出了C语言中在32位机器和64位机器中支持的整型类型数据,我们这里只给出32位机器上的: 尽管 C 语言标准没有指定有...原创 2017-09-20 13:14:00 · 1300 阅读 · 4 评论 -
深入理解计算机系统(2.6)------整数的运算
前面两篇博客我们详细讲解了计算机中整数的表示,包括有符号和无符号(补码编码)的详细介绍。那么这篇博客我们将对它们的运算有个详细的了解。 在讲解之前首先看下面的一个程序,看看输出结果是啥?#include <stdio.h>int main(){ int i = 2147483647; printf("%d\n",i+1); ...原创 2017-09-21 12:13:00 · 1077 阅读 · 2 评论 -
深入理解计算机系统(3.8)------数组分配和访问
上一篇博客我们讲解了汇编语言中过程(函数)的调用实现。理解数据如何在调用者和被调用者之间传递,以及在被调用者当中局部变量内存的分配以及释放是最重要的。那么这篇博客我们将讲解数组的分配和访问。1、数组的基本原则 我们知道数组是某种基本数据类型数据的集合,对于数据类型 T 和整型常数 N,数组的声明如下:T A[N] 上面的 A 称为数组名称。它有...原创 2017-10-08 10:20:00 · 438 阅读 · 0 评论