(初稿)
1. 指令和数据
这是在应用上的概念,其实都是二进制数据, cpu通过控制总线获得的数据是指令, 通过数据总线获得的是数据。
所有运算都是在cpu中进行的, cpu如何执行内存中的指令? CS:IP中存放了指令所在的内存地址, 通过地址总线定位,读取指令数据,并在cpu中执行。
简单理解计算机: cpu+外设,cpu通过地址总线寻址外部设备。
2. 地址总线、数据总线、控制总线。
寻址[1] 数据交换[2] 器件选择/读写指令[3]
3. 总线
一类、若干条导线的集合。
4. 内存空间映射
主板: 通过总线(和cpu总线不是同一个东西)连接各项外设,诸如 cpu,memory, slot等
接口卡: cpu 不能对外设进行直接控制(如显示器, 音像等),直接控制这些设备的是插在扩展插槽上的接口卡。cpu与扩展插槽通过总线相连,通过控制它来间接控制外设。
memory IC: 1. 随机存储RAM(应该是常见的内存条)装在主板和扩展插槽上。 2. 装有BIOS的ROM(主板BIOS, 显卡BIOS, 网卡BIOS等) 3. 接口卡上的RAM,如显存。
这些设备物理上独立, 但从cpu的角度上来看, 他们都是内存,只是地址范围不同,操作不同范围的内存,可能就是对不同的设备进行操作。
8086地址总线20条,寻址能力应该是1MB。
5. 寄存器
寄存器有两种,段寄存器和普通寄存器。普通寄存器用于存储cpu计算过程中的中间数据,段寄存器用于存储cpu定制化的一些数据,比如下一条指令的内存地址, 栈段空间地址。
sreg 不能被直接赋值,只能通过reg中转。
6. 汇编寻址方法
cpu的地址总线是20位的,而寄存器只有16位,因此采用段地址*16 + 偏移地址的方法获得20位地址。 非常重要,寻找某个内存单元的数据都是通过这个方法。
7. 段的概念
内存物理上没有分段, 只是由于cpu的寻址方式,使得我们可以用分段的方法来管理内存。
根据编程的需要,可以将一段连续的内存空间划分为一个段, 用段地址 * 16定位段的起始地址, 用偏移地址来定位段中的内存单元。
8. CS,IP----指令
两者合作指示了当前cpu要读取的指令的地址。CS为段寄存器(通常指向我们写的代码的首地址), IP为指针寄存器(偏移)。
没有提供直接修改段寄存器的指令, 但可以通过jmp。
9. 编程中段的概念
9.1. 数据段 存放我们要用到的数据
9.2. 代码段 存放代码
9.3. 栈段 栈数据。
9.4. 通过伪指令指示这几种段。
10. DS [idata]
访问内存空间的方法, 通过DS指示数据段基址,通过[...]访问段内数据。
eg: mov ax, [5] == mov ax, DS:[5]
11. SS,SP----栈。
共同定位栈段数据, SS:IP== SS*16 + IP。
当push数据时, 栈顶向低地址发展。
任意时刻, SS:IP指向栈顶元素,当栈为空时, 指向栈段起始地址+2
12. 寻址方法进阶
[bx/di/si], [idata], [bx/di/si+idata], ds:/cs:/es:/ss:[...](这个被称为段前缀), [bx+si/di], [bx+si/di+idata],通过他们灵活实现寻址,很适合数组访问应用。
(注意, si/di不能被拆分成8位)
13. cx的默认作用, 用来作为判断条件。
eg: loop, jcxz, 都需要用到cx
14. 明确指令要处理的数据长度
(1)通过寄存器名指定, eg: mov ax,1 ==> word, mov al,1 ==> byte
(2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度。X可以为word或byte。
eg: mov word ptr ds:[1], 1 ==>word, mov byte ptr ds:[1], 1 ==>byte
15. 转移: 短转移, 长转移
jmp short <tag>(只使用了IP)
jmp far <tag> ( 使用了CS和IP)
jmp word
16. BIOS基本概念
计算机有许多外设,想象每个外设都在其rom里固化了一套程序,并将其统一编址至内存中。cpu通过寻址执行相应外设在内存中的程序,就能够控制相应外设。
17. pc启动过程
。加电后,CS=0FFFFH, IP=0,自动从FFFF:0开始执行程序,此处有一条跳转程序, 将控制权交给BIOS,执行硬件系统检测以及
初始化程序
。硬件检测及初始化完成后,开始系统引导,调用int 19h中断:寻找启动盘,如果选择从软盘启动,计算机自动检测软盘的0面0磁道,如果发现它以0xaa55结束,则Bios认为它是一个引导扇区(Boot sector),将其加载至内存0000:7c00,并跳转至该地址,执行这段引导代码,并从此将控制权由BIOS交给操作系统,也即启动操作系统。
引导代码最前头要加上一条“org 07c00h”,就是告诉编译器, 该代码在0x7c00处执行, 段基址就是0x7c00. 可以试一下把7c00改成0000, 看会有什么问题。
18. BootSector和Bootloader
个人认为两者只是应用环境不同, 一个是在PC机下,一个是在嵌入式环境下。
而且嵌入式环境下通常不像PC下有BIOS, 所以此整个系统的加载启动任务就完全由BootLoader来完成。
19. 默认段寄存器
BX,SI,DI这3个默认ds段寄存器
BP这默认ss段寄存器
AX,CX,DX,SP这4个不能用来寻址,所以哪个段寄存器也不默认。
20. RAM简单理解为内存条,专门用于存放数据,易擦写修改,ROM简单理解为存指令的地方,不易擦写。
21. 寄存器的用途很明确: 保存上下文信息, 中间数据。 eg: CS:IP定义了下一条要执行的指令的内存地址。
SS:IP定义了栈段的位置。
22. 经常看到: 将控制权交给xxx。 意思就是跳转到xxx, 执行xxx部分的代码。
23. 执行指令放在内存RAM中, 在cpu外面怎么执行它呢?
cpu通过3总线与RAM连接, 控制总线打开片选开关, 地址总线定位代码地址, 数据总线取指令字节数据, 取得指令后, 在cpu中执行。
24. 实模式下, 代码中的标号是什么意思? 初步理解是: 段内偏移。