语言
- 人和人沟通?语言!老外!计算机!学习计算机语言
什么是机器语言
- 我们目前主流的电子计算机
- 状态0和1
- 加 0100 0000
- 减 0100 1000
- 乘 0100 1000 0100 1000
- 除 0100 1000 1100 1000
这些复杂的机器语言,能简化吗?助记符!汇编语言!人能够理解的语言转换成计算机语言
- 加:INC -编译器->0100 0000
- 减 :BEC 0100 1000
- 乘 : MUL 0100 1000 0100 1000
- 除: div 0100 1000 1100 1000
离程序的本质:隔阂!汇编一般用于底层的编写,单片机
c语言
- 加 : A + B -编译器->0100 0000
- 减 : A - B 0100 1000
- 乘 : A * B 0100 1000 0100 1000
- 除 : A / B 0100 1000 1100 1000
进制
- 学习进制的障碍?
- 10进制!:人类天然的选择的就是10进制,10个指头。所以我们需要跳出固有的思维方法!“屈指可数”
- 二进制:思想,每一种进制都是完美的,都有自己的计算方式
- 进制:
1进制; 一进一 结嗓记事 11
2进制: 二进一 计算机
八进制: 八进一 8个符号组成:0, 1, 2,3, 4,5, 6,7
十进制 : 十进一 十个符号组成: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
十六进制: 十六进一 十六个符号组成: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a,b, c, d, e, f
进制远远没有大家想的那么复杂:
- 就是一组定义的符号,逢几进几。可以自己随便定义的。我们要做学习和创造者。
- 加密解密:程序猿,破解程序的人!进制的加密是有一定规律的。
进制怎么计算
//用八进制计算下面的数
2 + 3 =5
2*3 = 6
4+5 = 11
4*5 = 24
运算的本质是查数;
0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,21,22,23,24,25、、、、
277 + 333 = 632
276 * 54 = 20250
237 - 54 = 163
234 / 4 = 47
277
+
333
-------
632
276
*
54
-------
1370
1666
-------
20250
//减法的本质是 237 + (-54)
237
-
54
-------
163
//除法的本质是,除数乘与商等于被除数
234
/
4
-------
47
八进制加法表
1+1 = 2 | ||||||
---|---|---|---|---|---|---|
1+2 = 3 | 2 +2=4 | |||||
1+3 = 4 | 2+3 = 5 | 3+3 = 6 | ||||
1+4 = 5 | 2+4 = 6 | 3+4 = 7 | 4+4 = 10 | |||
1+5 = 6 | 2+5 = 7 | 3+5 = 10 | 4+5 = 11 | 5+5 = 12 | ||
1+6 = 7 | 2+6 = 10 | 3+6 = 11 | 4+6 = 12 | 5+6 = 13 | 6+6 = 14 | |
1+7 = 10 | 2+7 = 11 | 3+7 = 12 | 4+7 = 13 | 5+7 = 14 | 6+7 = 15 | 7+7 = 16 |
八进制乘法表
1*1 = 1 | ||||||
---|---|---|---|---|---|---|
1*2 = 2 | 2*2=4 | |||||
1*3 = 3 | 2*3 = 6 | 3*3 = 11 | ||||
1*4 = 4 | 2*4 = 10 | 3*4 = 14 | 4*4 = 20 | |||
1*5 = 5 | 2*5 = 12 | 3*5 = 17 | 4*5 = 24 | 5*5 = 31 | ||
1*6 = 6 | 2*6 = 14 | 3*6 = 22 | 4*6 = 30 | 5*6 = 36 | 6*6 = 44 | |
1*7 = 7 | 2*7 = 16 | 3*7 = 25 | 4*7 = 34 | 5*7 = 43 | 6*7 = 52 | 7*7 = 61 |
- 结论:论是什么进制,本身都是一套完美的运算体系的,完美都可以通过列表的方式将它计算出来。
二进制
- 计算机使用二进制0 , 1!状态!电子!物理极限:摩尔定律!硬操作,追求语言的极限!并发语言!软操作。
量子计算机
- 可以实现量子计算机计算的机器。
- 传统的计算机:集成电路 0,1 。 硅晶片
- 量子计算机的单位:昆比特!(量子比特!量子的两态来表示)
- 光子:正交偏振方向。
- 磁场:电子的自旋方向。
- 21世纪:计算机,快到了浸透!汇编落伍了,本质问题
- 量子计算机!提高计算机的能力
- 量子比特,量子叠加态,量子纠缠,量子并行原理。。。
- 2019年,Google研究人员展示其最新54比特量子计算机,该计算只用200秒便可计算完毕当前世界最大的超级计算机需1万年进行的运算。
- 2020年,6,18 量子体积64的量子计算机!!!
- 霍化韦尔,将在一年之内得到至少10个有效量子比特。相当于1024个量子体积。
- 电子计算机–>量子计算机
电子计算机:0和1
- 二进制:
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
- 二进制这么写很麻烦!二进制能够简写
这就是我没打16进制
0 1 2 3 4 5 6 7 8 9 a b c d e f
为什么要学习理解二进制?
- 寄存器,内存,位!底层的每一位都有含义的,汇编入门理解的基础。
- 汇编高层:了解程序的深层!操作系统的内核
数据宽度
- 计算机:内存,给数据增加数据宽度
- c和c++都需要定义数据类型,计算机底层需要我们给这些数据定义宽度
- 位:0 1
- 字节: 0 - 0XFF
- 字: 0 - 0XFFFF
- 双字: 0 - 0XFFFFFFF
- 在计算机中,每一个数据都需要给它定义类型。给它定义宽度,在内存中的宽度。
有符号和无符号
- 数据都是有宽度的。每个数据代表什么意思呢?
规则:二进制解码增加一个规则?
- 无符号规则:你这个数字是什么,那就是什么
1 0 0 1 1 0 1 0 十六进制: 0X9A 十进制:154
- 有符号数规则:最高位是符号位:1(负数) 0 (正数)
原码反码补码
编码规则
- 有符号数的编码规则
- 原码:最高位符号位,对其它的位进行本身绝对值即可。
- 反码:正数:与原码相同 。 负数:符号位一定是1,其余位对原码取反
- 补码:正数:与原码相同。 负数:符号位一定是1,反码+1
测试
现在所说的都是8位
如果是正数那都相同;
1
原码:0 0 0 0 0 0 0 1
反码:0 0 0 0 0 0 0 1
补码:0 0 0 0 0 0 0 1
现在所说的都是8位
-1
原码:1 0 0 0 0 0 0 1
反码:1 1 1 1 1 1 1 0
补码:1 1 1 1 1 1 1 1
-7
原码:0 0 0 0 0 1 1 1
反码:1 1 1 1 1 0 0 0
补码:1 1 1 1 1 0 0 1
- 如果看到一个数字,二进制的,需要了解它是有符号还是无符号
寄存器:mov 寄存器,值
学习直接操作来查看是最有效的
位运算
- 计算机现在可以存储所以的数字(正数、浮点数、字符)的位运算!
- 很多底层的调试器。需要通过位来判断CPU的状态
与运算:(and & )两个都为1,结果才为1
1 0 1 1 0 0 0 1
1 1 0 1 1 0 0 0
---------------与运算
1 0 0 1 0 0 0 0
或运算(or | )只要有一个1,结果就为1
1 0 1 1 0 0 0 1
1 1 0 1 1 0 0 0
---------------或运算
1 1 1 1 1 0 0 1
**异或运算(or ^ )不一样就是1,一样就是0
1 0 1 1 0 0 0 1
1 1 0 1 1 0 0 0
---------------异或运算
0 1 1 0 1 0 0 1
非运算(单目运算符 ~) 0 就是1,1就是0
1 0 1 1 0 0 0 1
---------------非运算
0 1 0 0 1 1 1 0
通过浙西可以完成加减乘除!位运算来实现加减乘除
位运算(移动位)
- 左移(shl <<):所以二进制左移若干位,高位丢弃,低位补0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
- 右移(shr >>):所以二进制右移若干位,低位丢去,高位就需要补0,1(符号位决定);
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
位运算的加减乘除
计算 4 + 5
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
----------------------计算机是不会直接进行加法的
0 0 0 0 1 0 0 1
- 计算机实现的原理
- 第一步:异或,如果不考虑进位,异或就可以直接得到结果。
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
---------------------
0 0 0 0 0 0 0 1
- 第二步:与运算(判断仅为,如果与运算结果为0,没有排位)
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
----------------------
0 0 0 0 0 1 0 0
- 第三步:将与运算的结果,左移一位
0 0 0 0 0 1 0 0
----------------------
0 0 0 0 1 0 0 0
- 第四步:将第一步与第三步的进行异或。
0 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0
----------------------
0 0 0 0 1 0 0 1
- 第五步:将第一步与第三步与运算(判断进位,如果与运算结果为0,没有进位)
0 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0
----------------------
0 0 0 0 0 0 0 0
所以最终的结果就是与运算为0的上一个异或运算。
计算4-5(其实就是4+(-5))
0 0 0 0 0 1 0 0
1 1 1 1 1 0 1 1
-------------------
1 1 1 1 1 1 1 1
- 计算机实现的原理
- 第一步:异或,如果不考虑进位,异或就可以直接得到结果。
0 0 0 0 0 1 0 0
1 1 1 1 1 0 1 1
-------------------
1 1 1 1 1 1 1 1
- 第二步:与运算(判断仅为,如果与运算结果为0,没有排位)
0 0 0 0 0 1 0 0
1 1 1 1 1 0 1 1
-------------------
0 0 0 0 0 0 0 0
- 所以结果就是与运算什么那个了
乘法,说白了就是x*y,y个x相加。
除法,x/y,本质就是减法,就是x能减去多少个y
- 机器语言就是位运算。都是电路来实现的,这就是计算机的最底层的本质。
汇编语言环境理解
- 通过汇编指令可以给计算机发一些操作,然后让计算机执行。编译器的大佬,几乎都是原始的IDE
- 在学习汇编之前,大家需要掌握环境的配置。(1、Vc6(程序到汇编的理解)2、OD! 3、抓包工具! 4、加密解密工具)
- 学汇编不是为了写代码,理解程序的本质。
通用寄存器:
- 存储数据:CPU > 内存 >硬盘
- 32位CPU: 6, 16, 32
- 64位CPU: 8, 16, 32, 64
通用寄存器:32位的通用寄存器只有8个
- 存值的范围:0 ~ FFFFFFFF
- 对于二进制来说:直接修改值
计算机如何向寄存器存值
- mov指令
mov存的地址,存的数
mov存的地址1,存的地址1
可以将数字写入到寄存器,可以将寄存器中的值写到寄存器!
计算机:计算机!
32位 16位 8位
--------------------------
EAX AX AL
ECX CX CL
EDX DX DL
EBX BX BL
ESP SP AH
ENP NP CH
ESI SI DH
EDI DI BH
L代表低8位,H代表高8位
除了这些通用的寄存器外,其它的寄存器都有自己的特定功能。
内存
- 寄存器很小,不够用。所以说,数据方到内存!
- 每个应用程度进程都有4GB的内存空间,空头支票
- 程序真正运行的时候,才会用到物理内存
- 1B = 8bit
- 1KB = 1024B
- 1MB = 1024KB
- 1GB = 1024MB
- 计算机中内存地址很多,空间很大。
内存地址
- 计算机中的内存地址很多,空间很大,每个空间分配一个地址,名字。
- 这些给内存起的编号,就是我们的内存地址,32位 8个 16进制的值。
- 32位:寻找能力!
FFFFFFFF + 1 = 100000000 最大的值
- 位是怎么限制大小的
100000000内存地址*8 = 位:800000000
转换为10进制/8 : 4294 967 296字节
- 所有每个内存地址都有一个编号!可以通过这些编号往里面存值。
内存如何存值
- 数据宽度:byte word dword
- 地址的位置: 0xFFFFFFFF
- 不是任意的地址都可以写东西的,要申请使用的。所以只有程序申请的内容我们才可以使用
汇编中如何向内存写值
mov 数据宽度 内存地址 1
mov byte/word/dword ptr ds:[0x19FF70],1
传递值的大小一定要和数据宽度相等
内存地址有多种写法
ds: [0x19FF70 + 4] 内存地址便宜
ds:[eax] 寄存器
ds:[eax + 4] 寄存器偏移
数组[]
ds:[reg + reg*{1,2,3,4}]
ds:[reg + reg*{1,2,3,4} + 4]