计算机底层学习--基础

概述

  • 基础: 语言、进制、进制如何运算、二进制、数据宽度、有符号数和无符号数、原码反码补码、位运算、位运算计算、汇编、寄存器、内存

  • 进阶:汇编指令、内存复制、堆栈的指令、汇编写函数、堆栈传参、堆栈平衡、外挂

语言

计算机的语言:

# 我们目前的主流计算机
状态:0 和 1
# 最早的程序员,穿孔卡带!
加
减
乘
除

助记符:加INC 、减DEC、乘MUL、除DIV (汇编语言)

助记符通过编译器编译成机器码

暴破:通过底层进行修改!

工具:VC6、OD(ollydbg)

进制

思想:每一种进制数都是完美的!

几进制就有几个不同的符号,可以设定不同的符号,作为进制的加密!

进制运算

#八进制计算
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 26 27

#八进制计算以下结果  九九乘法表 = 加法表!   通过查表来计算
277+333= 632
276*54 = 20250
#减法的本质,其实就是加法
#除法的本质,其实就是乘倒数,除数乘以那个数最接近结果结果。
237-54=

八进制加法表

1 2 3 4 5 6 7
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 2 3 4 5 6 7
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。硅晶片!

​ 量子计算机的单位:昆比特(量子比特)量子的两态来表示。 量子叠加态、量子纠缠、量子并行原理。

​ 光子:正交偏振方向。

​ 磁场:电子的自旋方向。

二进制 0 1
0 1 10 11 100 101 110 111 
简写:产生了十六进制,4位二进制

为什么要学习理解二进制?

寄存器、内存、位!

数据宽度

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

C和C++ Java都需要定义数据类型。其实是定义数据宽度。

位:0 1

字节:0-0xFF

字: 0- 0xFFFF

双字:0- 0xFFFF FFFF

有符号数和无符号数

规则

二进制解码增加规则

  1. 无符号数规则:是什么就是什么
1001 1010 十六进制0x9A
  1. 有符号数规则:最高位为符号位,1代表负数,0代表正数
1001 1010 十六进制如何翻译,用原码 反码 补码

原码 反码 补码

用它来计算!! 计算机存的都是补码

原码:最高位符号位,对其他的位进行绝对值即可。

反码:

  • 正数:反码和原码相同
  • 负数: 符号位一定是1,其他位对原码取反

补码:

  • 正数:补码和原码相同
  • 负数: 符号位一定是1,反码+1
#练习 有符号数 8位2进制

#十进制:1
#原码: 0000 0001
#反码: 0000 0001
#补码: 0000 0001


#十进制:-1
#原码: 1000 0001
#反码: 1111 1110
#补码: 1111 1111

#十进制:-7
#原码: 1000 0111
#反码: 1111 1000
#补码: 1111 1001

位运算

面试题:2*8最高效的运算方式?位运算

与运算(and) 串联电路

#    1 1 0 0
#and 1 0 1 0
-------------
#    1 0 0 0

或运算(or) 并联电路

#   1 1 0 0
#or 1 0 1 0
------------
#   1 1 1 0

异或运算(xor) 不一样就是1

#    1 1 0 0
#xor 1 0 1 0
------------
#    0 1 1 0

非运算(not)

#   0 1
#not----
#   1 0

通过这些就可以完成加减乘除。通过位运算来实现加减乘除

位运算(移动位,左移*2,右移/2)

0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8

左移(shl <<):全部二进制左移若干位,高位丢弃,低位补0

右移(shr>>):全部二进制右移若干位,低位丢弃,高位根据符号位补(正数补0,负数补1)

位运算实现加减乘除

主要是加法!! (异或-与-左移)

4+5?

# 计算机是怎么操作的!
0000 0100
0000 0101
----------(加法:计算机是不会直接加的)
0000 1001

#计算机的实现原理

#第一步:异或. 不考虑进位,异或可以直接出结果。
0000 0100
0000 0101
------------
0000 0001
#第二步:与运算(判断进位,如果与运算结果为0,没有进位)
0000 0100
0000 0101
----------
0000 0100

#第三步:与运算结果左移一位 0000 1000 #进位的结果

#第四步:异或!
0000 0001
0000 1000
----------
0000 1001

#第五步:与运算(判断没有进位,就终止)

4-5?

# 计算机是怎么操作的!
-5
#原码:1000 0101
#反码:1111 1010
#补码:1111 1011

0000 0100
1111 1011
----------(减法:与补码做运算)
1111 1111   (计算机存的是这个)
#原码 1111 1111
#反码 1000 0000
#补码 1000 0001 (代表的值)

#第一步
0000 0100
1111 1011
----------异或
1111 1111

#第二步
0000 0100
1111 1011
----------与(判断)
0000 0000

#最终结果: 1111 1111

乘法:x*y,就是y个x相加,还是加法

除法:x/y,本质是减法,就是X能减去多少个y。

所以,计算机只会做加法。

汇编语言

通过指令执行操作

环境的配置: 1. VC6 2.OD 3.抓包工具 4.加密解密工具

学汇编是为了理解程序的本质

通用寄存器

寄存器:

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

32位CPU 8 16 32

64位CPU 8 16 32 64 提高的是寻址能力

通用寄存器

#32位的通用寄存器只有8个
EAX ECX EDX EBX ESP EBP ESI EDI
#每一个的存值的范围0-FFFF FFFF

计算机如何向寄存器存值

mov指令

mov 存的地址,存的数
mov 存的地址1,存的地址2

不同的通用寄存器

32位  EAX ECX EDX EBX ESP EBP ESI EDI   (FFFF FFFF)
16位  AX CX DX BX SP BP SI DI (FFFF)
8位   AL CL DL CL AH CH DH CH(FF)

8位:L低8位,H高8位。

除了这些通用寄存器之外,那么其他的寄存器每一位都有自己特定的功能!

内存

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

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

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

给内存起的编号,就是我们的内存地址。32位 8个16进制的值

FFFF FFFF+1 =1 0000 0000,最大的值

位是怎么限制内存大小的

1 0000 0000 内存地址 *8 = 8 0000 0000 位

转化为十进制(字节):4,294,967,296字节

最终发现是4GB。

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

数据宽度:byte word dword

地址的位置:0xFFFFFFFF

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

mov byte ptr ds:[地址], 值

内存地址可以有多种写法(+偏移)