计算机底层-狂神说视频笔记

概述

  1. 语言
  2. 进制
  3. 进制如何运算
  4. 二进制
  5. 数据宽度
  6. 有符号数和无符号数
  7. 原码反码补码
  8. 位运算
  9. 位运算计算
  10. 汇编
  11. 寄存器
  12. 内存
  13. 汇编指令
  14. 内存复制
  15. 堆栈的指令
  16. 汇编如何写函数
  17. 堆栈传参
  18. 堆栈平衡

机器语言

什么是机器语言?
目前主流的电子计算机!状态是0 和 1
汇编语言 将复杂的机器语言 简化为 助记符

加 INC ->  编译器-> 0100 0000
减 DEC             0100 1000
乘 MUL             0100 1000 0100 1000
除 DIV             0100 1000 1100 1000

汇编语言一般于底层的编写,单片机。

进制

二进制?
学习进制的障碍
10 进制
人类天然的选择就是10 进制, 10 个手指头 。调出固有的思维方法! “屈指可数”
二进制
思想: 每一种进制都是完美的,都有自己的计算方式!
进制?
1进制: 逢一进一, 结绳记事。1 1
2 进制: 逢二进一, 计算机
八进制: 八进一。 8个符号: 0 , 1, 2 ,3 ,4, 5, 6, 7
10进制: 10进一。 10个符号组成: 0, 1, 2,3 ,4, 5, 6, 7, 8 ,9
16进制: 16进一。16个符号组成: 0, 1, 2, 3, 4, 5 , 6, a, b , c , d , e ,f

一进制
1
1 1
1  1  1
...

# 三进制   1-20 
0   1  2 
10  11 12
20  21 22 
100 101 102
110 111 112 
120 121 122 
# 二进制
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 14 25 26 
# 一组符号,逢几进几
无论是什么进制,本身都有一套完美的运算体系的,我们都可以用过列表的方式将它计算出来!
二进制

计算机使用二进制 0 1! 状态! 电子! 物理极限: 摩尔定律! 追求语言的极限!开发语言! 软操作。
量子计算机:
可以实现量子计算的机器。 传统的计算机: 集成电路!0 1
量子计算机的单位: 昆比特。两个的两态表示。
光子: 正交偏振方向。
磁场: 电子的自旋方向。
21世纪。计算力,快到尽头了!
量子计算机! 提高计算机的计算力。提高计算机的计算力
量子比特, 量子叠加状态, 量子纠缠,量子并行原理…

二进制 0 1111
0 1  10 11 100 101 110 111 1000 1001 1010  1011  1100 1101 1110 1111 
二进制这么些麻烦 ! 二进制是否能简写
0 1  2  3  4    5   6   7   8    9    a     b     c    d    e    f 
这就是我们的16进制    
为什么要学习理解二进制

寄存器,内存 位 底层的每一个位都是有含义的。汇编是入门理解的基础。
汇编高级: 了解程序的深层! 操作系统的内核

数据宽度

计算机: 内存!给数据增加数据宽度
bit Byte Word(16位) Dword(32位 0000 0000 0000 0000 0000 0000 0000 0000)

位  bit   0  1
字节  byte  0-0xFF
字   word  0-0xFFFF
双字  Dword  0- oxFFFFFF  
在计算机中,每一个数据都需要定义类型。给它定义宽度,在内存中的宽度。

有符号数和无符号数

数据都有宽度。每个数据代表什么意思呢?

0 1 0 1 0 1 0 1 

规则, 二进制解码增加一个规则?
无符号数规则
你这个数字是什么, 就是什么。无关正负。

1 0 0 1  1 0 1 0  十六进制: ox9A 

有符号数规则
最高位是符号位: 1(负数)0 (正数)

1 0 0 1 1 0 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
原码 1 0 0 0  0 1 1 1
反码 1 1 1 1  1 0 0 0 
补码 1 1 1 1  1 0 0 1 
需要记忆的几个值
# 二进制标志
2   10 
4   100
8   1000
16  10000
32  100000

如果看到一个数字,二进制的,需要了解它是符号数还是无符号数。
寄存器: mov

位运算

计算机现在可以存储所有的数字(整数, 浮点数 字符)。
运算
2 * 8 最高效计算方式。
很多底层的调试器,需要通过位运算CPU的 状态 。

与运算 and &  
与运算的电路图
1011  0001
1101  1000
-----------
1001  0000 
或运算  or | 
1011  0001
1101  1000
-----------  或运算
1111  1001
3. 异或运算(xor  ^)
不一样就是1.
 电路图如下: 
1011  0001
1101  1000
-----------  异或运算
0110  1001

4. 非运算(单目运算符 not ~)
0就是1, 1 就是 0 
1011  0001
----------  非运算
0100  1110 
通过这些就可以完成我们的加减乘除。

在这里插入图片描述

位运算(移动位, 对于十进值 左移乘2, 右移除2)

左移 (shl <<)
0000  0001   @所有二进制位全部左移若干位,高位就丢弃了, 低位补00000 0010 
右移(shr >>)
0000  0001   @所有二进制位全部右移若干位,高位补0,1 了, 低位就丢弃了。
0000 0010 
	0000 0001    1
	0000 0010    2
	0000 0100    4
	0000 1000    8

位运算实现加减乘除

计算机只认识 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 

# 第五步: 与运算(判断进位,如果与运算结果为0, 没有进位). 
0000 0001
0000 1000
----------
0000 0000

# 所以最终的结果就是与运算为0的结果(上一个异或运算。)

4-5?

# 计算机是怎么操作的
4 + (-5) 
0000 0100
1111 1011   取补码 1111 1011 
--------- 
1111 1111   ff -1 

0000 0100
1111 1011   异或(如果不考虑进位,异或就可以直接出结果)
--------- 
1111 1111   

0000 0100
1111 1011   与运算(判断进位, 如果与运算结果为0, 没有进位)--------- 
0000 0000   

最终结果  1111  1111   16 ff  10  -1 

乘: 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, 存的地址1. 

可以将数字写入到寄存器, 可以 将寄存器中的值写道寄存器。
计算机: 计算力。
不同的寄存器

        FFFF        FF
32168位
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 的内存空间,空头支票。

程序真正运行的时候,才会用到物理内存。
32 位.
1b = 8bit
1kB = 1024B
1MB = 1024KB
1G = 1024MB
4G 的内存,4096MB -> 最终计算为位,就是这个可以存储的最大的容量。
计算机中的内存地址很多,空间很大。
内存地址
存一个数: 占用的大小。数据宽度, 存到哪里?
计算机中内次年地址有很多,空间很大,每个空间分配一个地址。名字
这些给内存起的编号,就是我们的内存地址。 32 位8 个 16 进制的值。
32位: 寻址能力! 4GB.
FFFF FFFF + 1 = 最大的值。
位是怎么限制内存大小的。
100000000 内存地址 * 8 = 位 :
转换为10 进制/ 8 4294. 967, 296 字节 .

64 位, 绰绰有余!
所以每个内存地址都是一个编号! 可以通过这些编号往里面存值。
内存如何存值
数据宽度: byte word dword
地址的位置: 0xFFF FFFF
不是任意的地址都可以写值的,申请使用的。 只有程序申请通过的内存地址我们才可以使用。

汇编如何向内存中写值。
mov  数据宽度, 内存地址, 1 
mov byte/word/dword/qword, 1    
传递的值的大小一定要和数据宽度相等。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值