汇编学习-寄存器

2.6 8086 CPU 给出物理地址的方法

  1. CPU 中的相关部件提供两个 16 位的地址,一个称为段地址,另一个称为偏移地址
  2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
  3. 地址加法器将两个 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 的工作过程:

  1. 从 CS:IP 指向内存单元读取指令,读取的指令进入指令缓冲器
  2. IP 指向下一条指令(比如一个指令需要占用三个内存单元,执行完毕后,IP 自动加三,移到下一条指令)
  3. 执行指令(转到步骤 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 会依次执行后面的指令

汇编学习-寄存器

 

原文链接: https://www.cnblogs.com/strive-sun/p/16462425.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    汇编学习-寄存器

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404469

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:35
下一篇 2023年4月25日 下午4:35

相关推荐