汇编学习-寄存器
2.6 8086 CPU 给出物理地址的方法
- CPU 中的相关部件提供两个 16 位的地址,一个称为段地址,另一个称为偏移地址
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
- 地址加法器将两个 16 位地址合并成一个 20 位的地址
地址加法器合成物理地址的方法:物理地址 = 段地址 * 16 + 偏移地址
一个数据的十六进制形式左移 1 位,相当于乘以 16(16 是十进制,下同)
一个数据的十进制形式左移 1 位,相当于乘以 10
一个数据的 X 进制形式左移 1 位,相当于乘以 X
在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址 * 16 定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
需要注意两点:
- 段地址 * 16 必然是 16 的倍数,所以一个段的起始地址也一定是 16 的倍数
- 偏移地址为 16 位,16 位地址的寻址能力为 64K(0000H ~ FFFFH),所以一个段的长度最大为 64K(内存单元)
小结:
- CPU 访问内存单元时,必须向内存提供内存单元的物理地址
- 8086 CPU 在内部用段地址和偏移地址移位相加的方法形成最终物理地址
- CPU 可以用不同的段地址和偏移地址形成同一个物理地址
段寄存器就是提供段地址的
8086 CPU 有 4 个段寄存器:CS DS SS ES
当 8086 CPU 要访问内存时,由这 4 个段寄存器提供内存单元的段地址
2.10 CS 和 IP
CS 和 IP 是 8086 CPU 中最关键的寄存器,它们指示了 CPU 当前要读取指令的地址。
CS 为代码段寄存器,存放指令的段地址
IP 为指令指针寄存器,存放指令的偏移地址
8086 机中,任意时刻,CPU 将 CS:IP 指向的内容当作指令执行
8086 CPU 的工作过程:
- 从 CS:IP 指向内存单元读取指令,读取的指令进入指令缓冲器
- IP 指向下一条指令(比如一个指令需要占用三个内存单元,执行完毕后,IP 自动加三,移到下一条指令)
- 执行指令(转到步骤 1,重复这个过程)
例题:
下面的3条指令执行后,CPU几次修改IP? 都是在什么时候?最后IP中的值是什么? mov ax, bx sub ax, ax jmp ax
解释:
一共修改了4次。 第1次:从存储器中读取 mov ax, bx 指令之后,IP 立即改变,指向下一条指令(sub ax, ax)的地址。 第2次:从存储器读取 sub ax, ax 之后(在此之前,会先执行 mov ax, bx 指令),IP 立即改变,指向下一条指令(jmp ax)的地址。 第3次:从存储器读取 jmp ax 指令之后(在此之前,会先执行完 sub ax, ax 指令),IP 立即改变,指向下一条指令的地址,这里由于下一条指令没有标明,所以不知道,反正此时IP的值是紧挨 jmp ax 之后的地址。 第4次:执行 jmp ax 指令后。jmp 指令是通过修改 IP 的值来达到使程序执行跳转的目的的,因此执行 jmp 之后,IP的值变为 ax(此时值为 0)的值,所以修改为了 0。 如果程序继续执行,那么IP的值是存储器中0位置指令的下一条指令的地址。 (上面的解释是在没有考虑指令预取、多条流水等情况下成立的!)
第三次的和第四次的 IP 改变是因为在执行 jmp 时,IP 会立即改变,也就是说不管这条指令是否是 jmp,都会改变 IP,然后因为 jmp 指令是跳转地址的,所以 IP 再次改变
如果没有 jmp 指令,CPU 会依次执行后面的指令


浙公网安备 33010602011771号