汇编学习-寄存器
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,重复这个过程)
例题:
1 2 3 4 5 | 下面的3条指令执行后,CPU几次修改IP? 都是在什么时候?最后IP中的值是什么? mov ax, bx sub ax, ax jmp ax |
解释:
1 2 3 4 5 6 7 8 | 一共修改了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 会依次执行后面的指令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix