《汇编语言》(王爽) 小结

 

(初稿)

 

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. 实模式下, 代码中的标号是什么意思? 初步理解是: 段内偏移。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章