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}]