参考书籍:《程序是怎样跑起来的》
CPU是什么(Processing Unit)
是由多个晶体管组成的电子元件,一般称为IC(integrated circuit,集成电路)
cpu主要由4部分构成:寄存器、控制器、运算器、时钟
微型计算机组成主要:控制器、运算器、存储器、输入设备/输出设备
可以看出控制器和运算器都在cpu中
寄存器
用于暂存指令,数据等处理对象
控制器
负责将内存中的指令数据读入到寄存器,并根据结果控制整个计算机
运算器
计算机只能对数据进行加法运算,所以-1在计算机的存储全是1,也就是我们认为的-1的补码,计算机存储的数据都是补码
时钟
负责cpu的计时,G=109 =10亿
程序员编写程序存储到计算机的过程
内存
常说的是计算机的主存(main memory),掉电后数据丢失,通过控制芯片和cpu相连,每个字节都有一个地址,计算机通过该地址读取内存中的数据或指令
有多种形式的硬件内存
ROM(Read-Only Memory)只能读取,断电不丢数据,存放一下不可变更信息,比如bios
RAM(random access memory)即随机存储内存可读可写,断电会丢失zhuan数据,存放临时数据,比如内存中的数据
SRAM是英文Static RAM的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。
DRAM:动态RAM ,需要刷新才能保存数据,关机后清除
程序是将寄存器作为对象进行多种处理
汇编语言(assembly)通过助记符(memonic)来编写程序,
通常常称将汇编语言转化未机器语言的过程称为汇编,与之相反的称为反汇编,将汇编语言转化为机器语言的程序称为汇编器(assembler)
编译(compiler):将使用高级语言编写的程序转换为机器语言的过程。用于转换的语气称为编译器(compiler)
主要的寄存器
累加、标志、程序计数器、基地址、变址、通用、指令、栈寄存器。其中,基址和变址以及通用寄存器一般有多个,其他都只有一个
决定程序流程的程序计数器(program counter)
操作系统(os,operating system)指的是管理和控制计算机硬件与软件资源的计算机程序。
程序计数器会随着每执行一个指令自动加1,若执行的指令占用了多个内存地址,增加与指令长度相同的地址长度
控制程序变化的标志寄存器(flag register)
寄存器中存储数据是否溢出或负数、正数、零,或奇偶数,来判断程序的走向
例如,累加寄存器的数据(xxx)和通用寄存器的数据(yyy)进行比较,自动进行xxx-yyy的运算,将标志结果存入标志寄存器中
函数调用的过程
机器语言中的call和return指令可以完成,通过调用函数后又返回到调用前的位置。call指令调用函数后,要执行的指令地址存储在栈寄存器中,函数处理完毕后再通过return将栈中的地址设置为程序计数器的值
基地址和变址
将内存区域进行 一定的划分
计算机中的二进制
所有的内容都是存储位二进制的形式
位是最小单位,字节是信息的基本单位,内存和磁盘都是使用字节单位来存储和读写数据的。
数据存储时,若所占的字节数大于单位处理字节的字节数,那么高位补0,例如一个16位的数据,处理时使用的8位的,那么高8位补0
位权、基数
基数:可以简单的理解为几进制那么基数就是几
位权:每个个数据位需要乘的数据,例如十进制的123,那么1的位权就是102 =100,也就是基数的几次幂,幂指数根据数据从低到高的位置从0开始
整个数据值是每位的数值X位权再进行相加得到
移位运算
相当于将数据进行基数的移动位数次幂的变化,例如(十进制)123向左移动2位,那么相当于变为原来的102 倍、
向高位移动时,空出的低位值补0即可,
逻辑右移和算术右移
逻辑右移,图像模式非数值模式,进行位的右移,最高位补0,就像霓虹灯的移动
算术右移,在最高位补充原本符号位的值(0或1)
计算机进行存储的数据都是补数
计算机只能进行加法运算,使用正数表示负数。取得补数的方法,将负数的数值(负数的绝对值),进行按位取反,最后加1
例如-1的数值是1,00000001进过取反后1111110再加1得到11111111(补码)
正数的补码就是自身
原码、反码、补码
正数的三种都相同
负数则不同,例如-1,原码10000001,反码11111110,补码11111111
补码运算,按位取反后再加1
通过1(补码)的补码运算得到-1的补码,进过-1(补码)的补码运算得到1的补码,00000001→11111111,11111111→00000001
逻辑运算和算术运算
算术运算:只有加减乘除的四则运算
逻辑运算;只有0或1的逻辑判断
计算机的100个0.1相加并不等于100
数值在电脑中的存储,都是以二进制的形式表示的,例如,二进制11.1表示的是十进制的121+120+1*2-1 = 3.5,因此0.1无法精确的表示。
将十进制的0.1转化为二进制的方式是,将0.1的小数位每次都乘以2的正数部分作为对应的二进制小数位,得到0.0001100(1100循环),因此不会得到准确的值
计算机中浮点数的存储
存储的浮点数据是默认以1…m形式的数据,其中m就是小数位的二进制数,而计算机中n就是的2,符号位是最高位,下面是由IEEE(Institute of Electrical and Electronic Engineers)的规定(都是指的二进制形式),而且指数e也是有正负之分的,因此8位的二进制的幂数只能是-128 ~ +127
数据存放不准确的解决办法
1、将使用的数据进行增大,然后计算,得到结果后再变小
2、使用不同的编码方式,BCD码,将每4位二进制都进行准确的表示一位十进制的值