底层语言
语言
进制
进制如何运算
二进制 量子计算
有符号数和无符号数
源码反码补码
位运算计算
汇编
寄存器
内存
汇编指令
内存复制
堆栈的指令
汇编如何写函数
堆栈传参
堆栈如何平衡
外挂
语言
人和人沟通。学习计算机的语言!
什么是机器语言?
# 我们目前主流的电子计算机! -> 量子计算机
状态:0 和 1 电路>通电和断电
# 最早的程序员,穿孔卡带!
加 0100 0000
减 0100 1000
乘 0100 1000 0100 1000
除 0100 1000 1100 1000
这些复杂的机器语言,简化。助记符!汇编语言!
人能够理解的语言转换成机器能理解的语言
加 INC -编译器> 0100 0000
减 DEC 0100 1000
乘 MUL 0100 1000 0100 1000
除 DIV 0100 1000 1100 1000
离程序的本质:隔阂!汇编一般用于底层的编写,单片机
C语言
加 A+B INC -编译器> 0100 0000
减 A-B DEC 0100 1000
乘 A*B MUL 0100 1000 0100 1000
除 A/B DIV 0100 1000 1100 1000
爆破
进制
一进制
1
1 1
1 1 1
1 1 1 1
三进制 0 1 2 10 11 12 20 21 22 100 101 102 111 112 120
十进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
二进制 0 1 10 11 100 101 110 111 1000
七进制
0 1 2 3 4 5 6
10 11 12 13 14 15 16
20 21 22 23 24 25 26
进制怎么运算
八进制计算下面结果
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
八进制计算下面的结果
277+333=
276*54=
237-54=
234/4=
运算的本质就是查数
277
333 +
----------
3+7=12
3+7=12
2+3=5
632
276
54 *
-----------
1370
1666 +
-----------
20250
减法的本质就是加法 237+(-54)
237-54=163
除法的本质,除数乘以那个数最接近结果即可
234
4
---------
47
结论:无论是什么进制,本身都有一套完美的运算体系的,我们可以通过列表的方式将他计算出来。
二进制
计算机使用二进制 0 1,电子计算机有两个状态!物理极限:摩尔定律!硬操作。追求语言的极限!并发语言!软操作。
量子计算机:
可以实现量子计算的机器。
传统的计算机:集成电路!0 1。硅晶片
量子计算机的单位:昆比特(量子比特)量子的两态标识。
光子:正交偏振方向
磁场:电子的自旋方向。
21世纪。计算力快到尽头了。
量子计算机!提高计算机的计算力。
量子比特,量子叠加态,量子纠缠,量子并行原理.....
2020年,6.18,量子体积64的量子计算机!
二进制:0 1111
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1111
二进制能否简写
0 1 2 3 4 5 6 7 8 9 a b c d e f
这就是16进制
为什么要学习理解二进制
寄存器、内存、位!底层的每一个位都是有含义的。汇编入门理解的基础
汇编高级:了解程序的深层
数据宽度
计算机:内存是有限制的!给数据增加数据宽度
C和C++、Java都需要定义数据的类型,计算机底层需要我们给这些数据定义宽度。
位 0 1
字节 0~0xFF
字 0~0xFFFF
双字 0~0xFFFFFFFF
在计算机中,每一个数据都需要给它定义类型,给它定义宽度,在内存中的宽度。
有符号数和无符号数
数据都是有宽度的。每个数据代表什么意思?
0 1 0 1 0 1
规则,二进制解码增加一个规则
无符号规则
这个数字是什么,那就是什么
1 0 0 1 1 0 1 0 16进制:0x9A
有符号数的规则
最高位是符号位:1(负数) 0(证书)
1 0 0 1 1 0 1 0
源码反码补码
编码规则
有符号数的编码规则
源码:最高位符号位,对齐它的为进行本身绝对值即可
反码:
- 正数:反码和源码相同
- 负数:符号位一定是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
如果是负数
-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
原码 1 0 0 0 0 1 1 1
反码 1 1 1 1 1 0 0 0
补码 1 1 1 1 1 0 0 1
3+5 = 8
0 1 2 3 4 5
0 1 10 11 100 101
二进制的标志
2 10
4 100
8 1000
11
101
寄存器:
mov指令
位运算
计算机现在可以存储所有的数字(整数、浮点数。字符)。
0 1
2*8最高效计算方式。
很多底层的调试器,需要通过位来判断CPU的状态。
与运算 and &
1011 0001
1101 1000
-----------与运算
1001 0000
或运算 or |
1011 0001
1101 1000
-----------或运算
1111 1001
异或运算 xor ^
不一样就是1。
1011 0001
1101 1000
-----------异或运算
0110 1001
非运算 单目运算符 not ~
0就是1,,1就是0,取反。
1101 1000
-----------非运算
0010 0111
通过这些可以完成加减乘除!
位运算 移动位
左移:shl <<
0000 0001 所有的二进制维权部左移若干位,高位就丢弃了,低位补0
0000 0010
右移:shr >>
0000 0001 所有的二进制维权部右移若干位,低位就丢弃了,高位补0
0000 0000
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
位运算的加减乘除
计算机只认识0 1
基本数学是建立在 加减乘除。
4+5
计算机是怎么操作的
0000 0100 4
0000 0101 5
------------加法
0000 1001
计算机的实现原理
第一步,异或,不考虑进位,异或就可以直接出结果
0000 0100 4
0000 0101 5
------------异或、
0000 0001
第二部,与运算 判断进位,如果与运算结果为0,没有进位
0000 0100 4
0000 0101 5
------------与
0000 0100
第三位,将与运算的结果,左移一位
0000 0100
-----------
0000 1000
第四步,异或运算;第一步和第三部的结果
0000 0001
0000 1000
----------
0000 1001
第五步,与运算 判断进位,如果与运算结果为0,没有进位
0000 0001
0000 1000
----------
0000 0000
所以最终的结果就是与运算为0的结果的上一个异或运算
4-5=?
计算机是怎么操作的
4+(-5)
0000 0100 4
1111 1011 -5
------------加法
1111 1111 ff=-1
计算机的实现原理
第一步,异或,不考虑进位,异或就可以直接出结果
0000 0100 4
1111 1011 -5
------------异或、
1111 1111
第二部,与运算 判断进位,如果与运算结果为0,没有进位
0000 0100 4
1111 1011 -5
------------与
0000 0000
所以最终的结果就是 1111 1111
符号位
乘法:x*y ,就是y个x相加,还是加法
除法:x/y,本质就是减法,就是x能减去多少个y
计算机只会做加法!
汇编语言环境说明
学汇编不是为了写代码
理解程序的本质
《汇编语言》16位 32位 64位 本质机构区别不大,寻址能力增加
汇编入门:了解汇编和程序的对应关系,程序的本质即可
通用寄存器
寄存器:
存储数据:CPU>内存>硬盘
32位 CPU 8 16 32
64位 CPU 8 16 32 64
通用寄存器 可以存储任意的值
32位的通用寄存器只有8个
存值的范围 0~FFFFFFFF
对于二进制来说,直接修改值
计算机如何向寄存器存值
mov指令
mov 存的地址,存的数
mov 存的地址1,存的地址2
可以将数字写入到寄存器,可以将寄存器中的值写到寄存器
不同的寄存器
FFFF FF
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
8位:L低8位,H高8位
除了这些通用的寄存器,其他的寄存器每一位都有自己特定的功能!
内存
寄存器跟小,不够用,所以放到内存
每个应用程序进程都有4GB的内存空间,空头支票
程序真正运行的时候,才会用到物理内存。
1B = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
4G的内存,4096M=》最终计算为为,就是这个可以存储的最大容量的。
计算机中的内存地址很多,空间很大。
内存地址
存一个数:占用的大小,数据宽度!存到哪里
计算机中内存地址很多,空寂很大,每个空间分配一个地址,名字
这些给内存起得编号,就是内存地址。32位 8个 16进制的值
32位:寻址能力 4GB
FFFF FFFF+1 = 100000000,最大的值。
位是怎么限制内存大小的
100000000 内存地址*8 = 位:800000000
转换为10进制:4294 867 296字节
按照规则/1024,最终发现就是4GB
64位
每个内存地址都有一个编号,可以通过这个编号往里边存值
内存如何存值?
数据宽度:byte word dword
地址的位置:0xFFFFFFFF
不是任意的地址都可以写东西的,只能写申请使用的。
只有程序申请的内存才能使用。
汇编如何向内存中写值
mov 数据宽度 内存地址,1
mov byte/word/dword/qword ptr ds:[0019FF74],1
传递的值的大小要和数据宽度相等。
内存地址有多种写法
ds:[0x19FF70+4] 内存地址偏移
ds:[eax] 寄存器
ds:[eax+4] 寄存器偏移
数组[]
ds:[reg+reg*{1,2,4,8}] 数组