计算机系统概论

Update#

[2018-11-25-created]

说明#

课程《计算机系统概论》笔记。

基本数值计算#

计算机采用的是进位计数制#

什么是进位计数制#

指用一组固定的符号和统一的规则来表示数值的方法。

基:符号的个数。比如十进制的 0,1,2,3...9。

权:符号本身所处的位置的信息。比如个、十、百、千...

进制#

二进制#

计算机是以电子器件发展来的,在计算机的发展阶段,难以制造具有多个稳定状态的器件(现在呢?),但是较为容易具有两个稳定状态的电子器件。

比如用有无电流,高低电压来表示二进制中的 0 和 1。

十六进制#

计算机中使用的是二进制,一连串的二进制数看起来是非常恼火的。先驱们想要一种简洁的表示方式,选择了十六进制。为什么?因为二进制和十六进制的转换非常方便,每四位二进制数就表示一个十六进制数。

开发工具提供的调试都是十六进制。

二进制怎么计算#

数字逻辑电路#

输入:将信息以二进制的形式存储到计算机中的储存单元。

触发器:是一个具有记忆功能的,具有两个稳定状态的信息储存器件。做储存用。保存外界来的信号。

早期的输入方式:纸带打孔。通过光敏的方式,有孔的地方就有电流。这样来传递信息。

一位全加器#

两个一位二进制数相加求和的组合线路。

设二进制数 A、B、A、B 的和 C。

C=(A∧!B)∨ (!A∧B)

一位全加器较简单。

多位加法的算法#

多位二进制加法种类多。

从低位到高位的运算#

...

计算机的工作原理#

计算机的作用#

帮助人们高速地进行信息自动处理的电子装置。

把物理世界的信息用计算机表示出来。

理解数据与指令#

老师给了一个很诡异的例子。

#include<stdio.h>
    int x=1;            //全局变量
    int testFunction(){
    x++;return x;}      //将全局变量加1的函数
int main(){ //VS2012 VC++ main函数
    int result1,result2;    //两个整型变量,用于存放调用函数的返回值
    unsigned char s[]   
={0x55,0x8b,0xec,0x81,0xec,0xc0,0x00,0x00,0x00,0x53,0x56,0x57,0x8d,0xbd,0x40,0xff,0xff,0xff,0xb9,0x30,0x00,0x00,0x00,0xb8,0xcc,0xcc,0xcc,0xcc,0xf3,0xab,0xb8,0x01,0x00,0x00,0x00,0x5f,0x5e,0x5b,0x8b,0xe5,0x5d,0xc3};

    int (*p)();     //指向函数的指针
    p=(int(_cdecl*)(void))&s[0];    //函数指针指向了一个数组???
    result1=testFunction();     //第一次调用函数
    result2=p();            //通过指针调用数组????
    printf("result1=%d,result2=%d",result1,result2);
    return 0;
}

诡异之处上面都已经标识了。这个例子简单说明了某种意上来说,指令和数据并没有什么不同。这里可以先狭义地认为指令即函数,数据即程序中的数据。毕竟它们都是以二进制的形式放在内存中的,所以我们可以通过特殊的操作把数据当作指令来操作。

虽然我们把它们分为了数据,指令。但是计算机始终只能识别机器语言。

当然,计算机有某种方法来识别什么是数据什么是指令。

上面说的其实就是冯·诺依曼提出存储程序原理。即把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。

  • 计算机处理的数据和指令一律用二进制数表示
  • 顺序执行程序:计算机运行过程中,把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行,这一概念称作顺序执行程序。
  • 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成

指令的执行#

将指令和数据储存到储存单元,然后从制定的储存单元开始取出指令,一条条执行。

我们怎么知道执行哪条指令呢#

首先,程序会从主函数入口开始执行。「主函数」这个词会让我们自然而然地想到 C 这类语言中的main 。然后,计算机中还有一个专门的单元储存下一条要执行的指令。这个单元叫作程序计数器

程序的执行过程#

内存:程序执行时用于临时存放数据和代码(指令)的设备

「load hello.exe` information and instruments from disk to memory.」

数据的机器级表示与处理#

数据是怎么输入输出的#

输出#

屏幕的构成基本单位是 pixel (像素)。屏幕上每个像素点到底显示什么由显存(显示内存)上的一块储存器的内容决定。在32bit真彩色情况下,每四个字节的存储单元对应于屏幕上的一个点。

当我们执行printf("Hello World!") 后,printf 调用 C 运行库,然后 C 运行库与操作系统交互,调用了系统的 API 。

总之执行后,计算机会去操作系统的字库中寻找每个字的字模,而字模便是决定了要填哪些像素的重要东西。

一个字是由很多个像素组成的,字库就储存了每个字由哪些像素组成,以及这些像素的位置。

struct pixelPoint{
    screenX, screenY;
    Color RGB;
}

显存告知计算机要以什么颜色来显示。

颜色的表示是通过 RGB 或 RGBA ,分别是 Red,Green,Blue,Alpha。即红、绿、蓝、透明度。

当计算机没装系统时,也能够进行输出数据。比如 BIOS 里面。

PS:装过系统的话对这玩意一定不会陌生。

BIOS:basic input and output system

BIOS 是一组固化在计算机主板上 ROM 芯片的程序,保存着计算机最重要的基本输入输出的程序、开机自检程序和系统启动程序。

这里的输出是由主板产商提供的,厂家在主板上固化了基本的输入输出。

毕竟有了这个,电脑才能拿来进行安装系统等基本操作嘛...

其它#
  • PS:操作系统又会调用主板上的输入输出?

  • 直接写屏技术

输入#

输入方式很多,这里提一下键盘输入。

  • 每一个按键都有两个唯一的数值进行标志(按下,松起)。
  • 通过这唯一的数值,得到的一个编码,从而知道用户输入的是什么(键盘扫描码)。
  • 通过 BIOS 键盘驱动程序,将得到的键盘扫描码转换成 ASCII 码或扩展的 ASCII 码。
  • 结论:简单的可以认为:从键盘输入得到的是字符(ASCII码)

输入的信息也要经过 CPU 。按键输入信息经过 CPU 中的 register (寄存器,信息的临时储存单元)保存至 memory 。

数据#