第一章 基础知识预备
cpu进行读写时,将各类存储器看作同一个逻辑存储器。
每个物理存储器都在这个逻辑存储器中占有一个地址段(地址空间)
内存地址空间的大小受cpu地址总线宽度的限制。
也就是说,逻辑存储器==内存地址空间。
第二章 寄存器
在cpu中,
运算器进行信息处理;
寄存器进行信息存储;
控制器控制器件进行工作;
内部总线(不同于外部总线)连接各种器件,在它们之间进行数据的传送。
在其中,寄存器是cpu中程序员可以用指令读写的部件。
以ax为例,低8位(0~7)构成了al寄存器,高8位(8~16)构成了ah寄存器。二者可以独立使用。
高位字节+低位字节,通过十六进制的方式一边放置两位十六进制数,便于直观分析。
2.3 几条汇编指令
mov ax,18 将18送入寄存器ax, 高级语言语法:ax=18
add ax,8 将寄存器ax中的数值加8 ax=ax+8
mov ax,bx 将寄存器bx中的数据送入寄存器ax中 ax=bx
add ax,bx 将ax和bx相加,送入ax中 ax=ax+bx
注意:cpu在执行运算时,如果ah和al分开写,那么cpu将会认为此时ah和al是两个不相关的寄存器。
2.5 16位结构的cpu
xx位结构,如16位结构的cpu代表着:1.运算器一次最多可以处理16位的数据;
2.寄存器的最大宽度为16位;
3.寄存器和运算器之间的通路为16位。
2.6 8086cpu给出物理地址的方法
相关部件提供两个16位的地址,段地址和偏移地址;
通过内部总线送入地址加法器,在其中合并成20位的物理地址;
通过内部总线将20位物理地址送入输入输出控制电路;
将20位物理地址送入地址总线;
最终被传输至存储器;
其中,采用物理地址=段地址*16+偏移地址的方法合并
= 2^16*2^4+偏移地址
十六进制下,四位十六进制变为五位十六进制,再和偏移地址相加。
更一般的说,这种寻址功能是 基础地址+偏移地址=物理地址。
结论:cpu可以用不同的段地址和偏移地址形成同一个物理地址。
只需要满足 段地址*16+偏移地址结果相同即可。
给定一个段地址,仅通过变化偏移地址来进行寻址,最多可定位2^16=64KB个内存单元(一个内存单元可以存储一个Byte)
2.10 CS和IP
CS和IP是8086中最关键的寄存器,指示了CPU当前要读取指令的地址。
CS是代码段寄存器,IP是指令指针寄存器。
设CS中的内容为M,IP中的内容为N,则CPU将会从内存M*16+N单元开始,读取一条指令并执行。
任意时刻CPU将CS:IP指向的内容当作指令执行。
IP=IP+所读取指令的长度,从而指向下一条指令
如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必定被CS:IP指向过。
*** 如何来改变CS、IP中的值?其它寄存器中的值?
mov指令也称传送指令,可以用mov来改变大部分8086寄存器的值,如AX、BX、CX;
但是,mov指令不能用于设置CS、IP中的值(8086不提供,为了将执行指令取数据和执行指令改变指令自身分离开)
能改变CS、IP的指令统称为转移指令,最简单的修改CS、IP的指令是:jmp指令。
形式:jmp 段地址:偏移地址
若仅想修改IP的内容,可用 jmp 某一合法寄存器 的指令来完成。(局部性原理?)
所以,jmp ax在含义上可以理解为 mov IP,ax