Bootstrap

计算机原理基础

1.语言

机器语言 状态0和1

最早的程序员:穿孔带卡

加0110
减0100

汇编语言 人能够理解的语言转化为机器能理解的语言 汇编一般用于底层的编写,单片机..

加 INC -编译器-> 0110
减 DEC          0100

高级语言 c语言等

加 A+B -编译器-> 0110
减 A-b  		   0100

2.进制

在计算机中,整数通常以补码的形式存储

运算的本质就是加法

减法的本质其实就是加法

除法的本质,除数除以那个数最接近的即可

结论:无论是什么进制,本身都是有一套完美的运算体系,我们都可以通过列表的方式将他们计算出来

2.1二进制

计算机使用二进制 0 1 状态 电子

3.数据宽度

计算机:内存!给数据增加数据宽度

c和c++,java都需要定义数据的类型,计算机底层需要我们给这些数据定义宽度

位0 1

字节0~0xFF

字 0~0xFFFF

双字0~0xFFFFFFFF

在计算机中,每一个数据都需要给他定义类型 给他定义宽度 在内存中的宽度

4.有符号数无符号数

数据都是有宽度的 每个数据代表什么意思

二进制解码增加一个规则

符号规则 第一位为符号为0为正数 1为负数

5.原码反码补码

有符号编码规则

原码 :最高位符号位,对齐它进行本身求值即可

反码:

  • 正数:反码和原码相同

  • 负数:符号位一定是1,其余位对原码取反

补码:

  • 正数:补码和原码相同

  • 负数:符号位一定是1,对反码+1

在计算机当中负数以补码的形式存储

6.位运算

6.1 &与运算(都为1则为1,其余为0) 串联

1011 0001

1101 1000

1001 0000

6.2 |或运算 并联

两个有一个为1,结果为1

6.3 ^异或运算 交叉电路

不一样则为1(^)

6.4 ~非运算

单目运算符 (1为0,0为1,1为负数)

1101 1000

0010 0111

通过这些可以完成我们的加减乘除

6.5 位运算(移动位)

左移×2对于十进制(<<) 所有二进制位全部左移若干位,高位就丢弃了低位补0

右移 所有二进制向右移动若干位,低位丢弃了,高位就需要补0,1(由符号为决定)

7.位运算的加减乘除

计算机只认识0和1

基本数学是建立在 加减乘除

# 计算机是怎么操作的
0000 0100
0000 0101
加法:计算机不会直接相加
0000 1001
# 计算机的实现原理
# 第一步,异或,如果不考虑进位,异或可以直接出结果 目的计算出程序的没有进的位
0000 0100
0000 0101
0000 0001
# 第二步,与运算(判断进位,如果与运算结果为0,没有进位) 目的计算出程序进的位
0000 0100
0000 0101
0000 0100
# 第三步,将与运算的结果,左移一位 0000 1000 进位结果 将与运算该进的位进1
#第四步,异或(进位结果和异或结果) 将两个结果加到一起即为结果
0000 0001
0000 1000
0000 1001
# 第五步 与运算,确认是否有进位,结果都为0,没有进位
0000 0001
0000 1000
0000 0000
# 所以最终的结果就是与运算为0的结果的上一个异或运算

 4-5

#计算机是怎么操作的
4+(-5)
0000 0100
1111 1011(补码)
(减法:计算机是不会直接减的)
1111 1111

0000 0100
1111 1011
第一步,异或
1111 1111

判断进位
最终结果1111 1111 16 ff     10进制 -1 

× x*y 就是y个x相加,还是加法

除 x/y 本质是减法,x能减去多少个y

计算机只会做加法

机器语言就是位运算 都是电路来实现的 这就是计算机最底层的原理

8.汇编语言

通过汇编指令可以给计算机发一些操作,然后让计算机执行 编译器

在学习汇编之前,大家需要先掌握环境的配置

学汇编不是为了写代码

理解程序的本质 懂汇编

9.通用寄存器

通用的寄存器可以存任意的东西

存储数据:CPU>内存>硬盘

32位 CPU 8 16 32

64位 CPU 8 16 32 64

通用寄存器

32位的通用寄存器有8个

存值的范围0~ffffffff

对于二进制来说,直接修改值

计算机如果向寄存器存值

10.内存

寄存器很小,不够用 所以说,数据放到内存

每个应用程序进程都有4GB的内存空间,空头支票

程序真正运行的时候,才会用到物理内存

内存地址

计算机内存地址很多,空间很大,每个空间分配一个地址,名字

 

 

这些给内存起的变化,就是我们的地址 32位 8个16进制的值

32位:寻址能力 4GB

FFFFFFFF+1=100000000 最大的值

位是怎么限制内存大小的

100000000 内存地址*8=位:800000000

转换为10进制 /8;4294967296字节

最终发现就是4GB

所以32位机器的最大寻址能力是4GB

64位机器大于64G 绰绰有余

每个内存地址都有一个编号 可以通过编号向里面存值

内存如何存值 ?

  • 数据宽度byte

  • 地址位置0xFFFFFFFF

    不是任意的地址都可以写东西的,申请使用的 只有程序申请过的内存我们才可以使用

汇编如何向内存中写值
mov 数据宽度 内存地址,1
传递值的大小一定要和数据宽度相等

内存地址有很多种写法

ds:[0x19FF70+4] 内存地址偏移

ds:[eax]内存地址偏移

ds:[eax+4] 寄存器偏移

数组[]

ds:[reg+reg*{1,2,4,8}]

;