计算机基础知识
硬件
简易计算机:CPU + 内存条 + 主板
软件
作用 : 使计算机按照事先预定好的顺序完成特定的功能
分类:
分类标准 -> 功能
1. 系统软件
DOS (Disk Operating System)
Windows
Linux
Unix
Mac
Android
IOS
...
2. 应用软件
WPS
微信
...
分类标准 -> 人机交互
1. 图形化界面
2. 命令行
计算机语言发展历史
机器语言
第一代语言 二进制
直接输入给计算机使用,不需要经过任何转换
最早的程序员 穿孔卡带
汇编语言
第二代语言 指令代替二进制
解决人类无法读懂机器语言的问题,把人类能够理解的语言转换成机器能够理解的语言
目前应用: 逆向工程,机器人,病毒,外挂
高级语言
第三代语言
面向过程
C 1972年诞生 特点:贴近硬件,运行极快;应用领域:操作系统,编译器,数据库,网络系统等;难点:指针和内存管理
面向对象
C++ 1982年诞生 兼容C 应用领域:图形领域、游戏等
Java 1995年初生 特点:没有指针,不需要进行内存管理,JVM实现WRITE ONCE,RUN ANYWHERE!高可用,高性能,高并发
机器语言
进制
本质:逢几进几
例如:
1进制 逢1进1 --- 结绳记事
2进制 逢2进1 --- 计算机
8进制 逢8进1 --- 0~7
10进制 逢10进1 --- 0~9
16进制 逢16进1 --- 0~9,a~f
进制运算
本质:查数
无论什么进制,本身有一套完美的运算体系,均可以通过列表的方式(加法表和乘法表)进行计算!
减法、乘法的本质都是加法,除法的本质是除数乘以哪个数最接近被除数。
例如:8进制下的 77加法表 和 77乘法表
77加法表
1+1=2
2+1=3 2+2=4
3+1=4 3+2=5 3+3=6
4+1=5 4+2=6 4+3=7 4+4=10
5+1=6 5+2=7 5+3=10 5+4=11
5+5=12
6+1=7 6+2=10 6+3=11 6+4=12 6+5=13 6+6=14
7+1=10 7+2=11 7+3=12 7+4=13 7+5=14 7+6=15
7+7=16
77乘法表
1×1=1
2×1=2 2×2=4
3×1=3 3×2=6 3×3=11
4×1=4 4×2=10 4×3=14 4×4=20
5×1=5 5×2=12 5×3=17 5×4=24
5×5=31
6×1=6 6×2=14 6×3=22 6×4=30 6×5=36 6×6=44
7×1=7 7×2=16 7×3=25 7×4=34 7×5=43 7×6=52
7×7=61
二进制
计算机使用二进制的原因? 电路的电流状态 对应 0 和 1
物理极限:摩尔定律
未来提升计算机计算力:量子计算机的普及
二进制具有标志性的数字
10进制 2进制
2 10
4 100
8 1000
二进制的简化:十六进制 0 1 2 3 4 5 6 7 8 9 A B C D E F
数据宽度
硬件决定了数据的长度限制,即数据的宽度,超出宽度的部门会丢失。
在计算机中每一个数据都需要定义类型 — 定义在内存中的宽度
数据宽度 英文名称 取值范围
8 bits Byte 0-0xFF
16 bits Word 0-0xFFFF
32 bit DWord (Double Word) 0-0xFFFFFFFF
64 bit QWord 0-0xFFFFFFFFFFFFFFFF
有符号数和无符号数
二进制的解码规则:
1. 无符号数的解码规则
数字是什么就是什么
2. 有符号数的解码规则
最高为是符号位:0 -- 正数 ; 1 -- 负数
原码:最高位为符号位,其他位是该负数的绝对值
反码:正数时,反码和原码相同;负数时,最高位为1, 其余位对原码取反
补码:正数时,补码和原码相同;负数时,符号位为1, 反码 + 1
8位下的实例: -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
tips: 二进制的数字,需要注意区分有符号数还是无符号数
位运算
机器语言就是通过电路来实现位运算。计算机只会加法,通过机器语言来实现加法计算器本质就是设计电路。
与运算(and,&)
串行电路
两个都为1,结果为1
1011 0001
1101 1000
------------ 与运算
1001 0000
或运算(or, |)
并行电路
有一个为1,结果为1
1011 0001
1101 1000
------------ 或运算
1111 1001
亦或运算(xor,^)
交叉x行电路
不同为1,相同为0
1011 0001
1101 1000
----------- 异或运算
0110 1001
非运算(not,~)
单目运算符
取反
1011 1000
------------ 非运算
0100 0111
位运算(移动位)
<< 左移 shl
所有二进制全部左移若干位,高位丢弃,低位补0
左移1位,对应十进制数×2
>> 右移 shr
所有二进制全部右移若干位,地位丢弃,高位补0(正数时)或1(负数时)
右移1位,对应十进制数/2
位运算实现加减乘除
加减乘除本质都是加法
异或运算 + 与运算 循环进行,直到与运算结果为0,判断无需进位为之
4 + 5 ?
4 0000 0100
5 0000 0101
---------------- 加法 计算机不会直接加
0000 1001
# 计算机的实现原理
# step1.异或 如果不考虑进位,异或可以直接算出结果
0000 0100
0000 0101
------------- 异或运算
0000 0001
#step2. 与运算 判断进位,如果与运算结果为0,则无需进位
0000 0100
0000 0101
------------- 与运算
0000 0100
#step3.将与运算结果左移一位,进行进位
0000 1000
# step4.异或
0000 0001
0000 1000
------------- 异或运算
0000 1001
#step5.与
0000 0001
0000 1000
------------- 与运算
0000 0000
#与运算结果为0, 最终结果为与运算上一个异或的运算结果
即 0000 1001
4 - 5 ?
-5
原码:1000 0101
反码:1111 1010
补码:1111 1011
# 计算机的实现原理
# step1.异或
0000 0100
1111 1011
------------
1111 1111
#step2. 与运算 判断进位
0000 0100
1111 1011
------------
0000 0000
#与运算结果为0, 因此最终结果为 1111 1111 16进制 FF 10进制 -1
乘 x*y 本质:y个x相加
除 x/y 本质:x最多能减去多少个y
汇编语言
用指令代替二进制
学习汇编语言的目的不是写代码,而是理解程序的本质
环境配置
- Vc 6 指针 --> 内存地址
- OD 反编译软件
- 抓包工具
- 加密解密工具
寄存器
通用寄存器,可以存储各种数据
存储功能: CPU -> 内存 -> 硬盘
寄存器 | 主要用途 | ||
---|---|---|---|
32位 | 16位 | 8位 | |
EAX | AX | AL | 累加器 |
ECX | CX | CL | 计数 |
EDX | DX | DL | I/O指针 |
EBX | BX | BL | DS段的数据指针 |
ESP | SP | AH | 堆栈指针 |
EBP | BP | BH | SS段的数据指针 |
ESI | SI | CH | 字符串操作的源指针;SS段的数据指针 |
EDI | DI | DH | 字符串操作的目标指针;ES段的数据指针 |
tips:8位对应的L代表低8位,H代表高8位
其他寄存器,每一位都有自己特定的功能
内存
寄存器很小,不够用,所以会把数据放入内存中。
32位的CPU,每个应用程序都有4GB的虚拟内存空间。
4GB虚拟内存空间 --> 物理内存 --> 内存条
程序真正运行时,才会用到物理内存
1 Byte = 8 bit
1 KB = 1024 Bytes
1 MB = 1024 KB
1 GB = 1024 MB
4GB内存换算成bit就是可以存储的最大容量
内存地址
计算机内的内存地址很多,空间很大,每个空间都分配一个地址(名字)。
给内存起的编号 如:0xFFFFFFFF就是内存地址
32位对应的内存地址为8个16进制的值
32位的寻址能力为4GB
汇编如何向内存中写值?
#将数字写入寄存器
mov 存的地址,存的数
#寄存器中的值写入另一个寄存器
mov 写入地址,需要复制对象的地址
mov 数据宽度 内存地址,值
mov byte ptr ds:[0x0019ff70],1
内存地址有多种写法
ds:[0x0019ff70 + 4] 内存地址偏移
ds:[eax] 寄存器
ds:[eax + 4] 寄存器偏移
数组[]
ds:[reg + reg*{1,2,4,8}]
ds:[reg + reg*{1,2,4,8} + 4] 偏移