数据的表示方法:在计算机里 数据的表示由 0 1 0 1 组成称为 二进制
X86汇编语言 从模式到保护模式 笔记(一)
0:代表着 低电平 代表着开关的关
1:代表高电平 代表着开关的开
这跟 摩斯密码是一个原理的 , 通过组合 0 1 可以表示成不同的消息。
其实计算机系统内部是通过一系列的逻辑代数 组合 形成 不同的计算
包括: 与 或 非
与门: 假设 a 和 b 都是 1 那么就输出 1
其实这个概念也不难理解
假设有个 串联开关X86汇编语言 从模式到保护模式 笔记(一)
如上图 假设继电器 开关有两种状态 开状态1 关状态0 只有当 满足 2个继电器开关同时 为开 1 的时候 点灯就会点亮 亮代表1 不亮代表0 那么 就变可以得出:

AND 开关1 (0) 开关2(1)
开关1(0) 0 0
开关2(1) 0 1

X86汇编语言 从模式到保护模式 笔记(一)
或门: 其实就是一个并联电路 图上有2个继电器 a 和 继电器b 当继电器a的 开关被打开
电路会处于联通状态 当继电器b 被打开 也会属于 联通状态 所以 就有了如下定义:

或门 开关a(1) 开关b(0)
开关b(0) 1 0
开关a(1) 1 1

当 a 和 b 有一个是 1那么就是 1 这就是或运算 就像 中文或那样的 意思 2者之间有一个为真 就返回真。

X86汇编语言 从模式到保护模式 笔记(一)
非门: 上图 中 有一开关 a 当其处于 关闭时 电路是处于通路的状态 当 开关处于关闭 那么 电路就会处于 断路的状态。
设开关状态 0为 关闭 1位打开 电路状态 1 为通路 0 为断路 那么 就会有如下关系:

开关a 打开(1) 开关a 关闭(0)
电路 0 1

非就是取反, 取到一种状态定义的对立面的表示。开的对立面就是关喽。

其实 通过组合 上面这三中逻辑 就可以组合成 新的 一系列的 计算 逻辑 例如:与非 或非 异或 。本质就是在电路输出和另一个电路的输入相互叠加。

那么其实处理器就是将这样的电路通过封装 写入硅晶cpu, 那么你肯定要问为什么要用硅呢? 因为 组成cpu 的 其实就是上面图表示的电路 的叠加在一起 不过电路使用的是mos这样的半导体管组合成的,属于半导体材料。

下面介绍下 比较知名的intel x86 cpu的cpu结构 寄存器的相关知识:

内存中数据是如何存储的:

内存中 数据一般 按字节访问 一个字节是 8位 也就是 8个0或1 11111111 一个字(word)是 2个字节 16位 一个双字(double byte) 是 4个字节 32位。
如果按照 字访问 那么 16位的 字 可以拆成 高 8位 和 低 8位
如果双字则是 高16位 低 16位
X86汇编语言 从模式到保护模式 笔记(一)
X86汇编语言 从模式到保护模式 笔记(一)
内存地址 可以按照1个字节访问 上图 0000 可以存储一个字节 也就是 8个位 0001 也存放了 1个字节 8个位 ,但是 通过特定的指令 设计 可以让cpu按照一定长度的访问 比如一次访问 一个 字 一个双字

假设有一个 16字节的存储容器 那么他的 地址范围是多少呢?
其实很简单 就是 0~ 2 << 16 -2 也就是 65535 用16进制 表示成 0x ~0xffff. 那么 可以保存多少个字呢 2 << 15 / 2<< 8 = 512个字

指令和指令集

X86汇编语言 从模式到保护模式 笔记(一)
什么是寄存器呢?
是寄存器 和内存是一样的主要用来存储 数据 但是那为什么要寄存器 而不是直接访问 内内存呢 ?主要是因为cpu是很快的,可能是内存的上百倍的速度 如果 每次计算 都要通过内存的话 那么 cpu的速度就会被内存速度拖累,因为在访问内存的时候 等待时就不能干其他事情了,这就像木桶效应一样,往往可能决定系统性能的是系统的最短的短板,在现代计算机里最大短板 俨然就是io的 读取 cpu访问 一级缓存,二级缓存从,缓存访问内存,内存访问硬盘,就是为了弥补这种硬件性能带来的缺陷,加入哪一天硬盘访问速度 能和内存相当 那么内存也就不需要了,虽然很难但还是要对未来抱有希望的。

上面说了内存里 数据是怎么存放的,那么光是存放数据 如果没有定义怎么取数据 怎么对内存操作那么 那么计算机也是运行不起来的,那么 在内存中数据是怎么操作的呢?
对于内存中的数据 其实是 通过指令 来操作的。
那么指令集 是怎么构成的呢?
它由三部分 : 操作码 操作数1 操作数2
例如 mov ax,1 这条指令的 mov代表传递 将 1 这个立即数 传入 ax寄存器是一个16位的寄存器 又分为 al 和 ah 两个低8位的寄存器。
mov ax,[0x0ff1] 什么是立即数呢 其实表示的是 直接的值 而 [0x0ff1] 这个其实是 c语言里的指针 通过这个地址 寻找到 值 赋值给 寄存器ax

什么是低端字节序,高端字节序?
假设 一次取多个字节 那么 01 10 这两个 字节 01 是 高位 10 是低位 把 高位 放在前面 就是 打断存储 把 低位放在前面就是小端 存储 intelcpu 使用的是 小端 存储
X86汇编语言 从模式到保护模式 笔记(一)

低地址 低位 高地址 高位 小端存储
低地址 高位 高地址 低位 大端存储

应用程序的内存地址每次是固定的吗?
加入 写一个程序 每次写死了 自己该被分配的 内存地址 如果那么写的话 你 电脑那么多程序 怎么保证 这两个程序的内存地址不会冲突呢?
这显然是不可取的 那么在内存里 实际是怎么解决这个问题的呢?
使用相对位置,而不是使用真实的物理地址,程序每次都重新计算内存地址进行加载。在intel cpu 就是分段机制了,
段地址 + 偏移地址 形式
代码段寄存器(CS),数据段寄存器(DS)
X86汇编语言 从模式到保护模式 笔记(一)
A1 02 00 这条指令 是将 0002H处 传到 ax 寄存器 而 0002H不是绝对的 物理地址
而是根据当前DS段地址 + 0002H 计算出来的才是实际的物理地址。
假设此时Ds数据段地址是:1000H 那么 计算 后的 物理地址是 1000H * 16 + 0002H = 10002H 为什么要乘以 16 那是因为 寄存器只能 保存16 位 的数据 但是8086提供了 20根的地址线。这样它的寻址能力就是 2 << 19 =1048576 bytes 也就是 1M的空间。 但是 16位的寄存器直接相加 得到的 偏移 那还是 16位 没法 表示所有20位的地址空间,所以就有了 通过 段地址 * 16 + 偏移 这样 就能产生 20位的地址了。

8086 处理器 内部有8个16位的通用寄存器 ,分别 叫 AX,BX,CX,DX,SI,DI,BP,SP
X86汇编语言 从模式到保护模式 笔记(一)这里面 AX BX CX DX 又可以 划分为 AH(High) AL(Low) 的 高 8位 和 低八位 寄存器 。
分割出来的 高8位 寄存器 和 低八位寄存器相互之间 是可以独立使用的 不会互相影响。

如果Ds 为 25BCH 那么 物理地址访问范围为多少?
0x25BC * 16 + 0xffff 为段最大地址 为 ‘0x35bbf’ 。

相关文章: