0%

汇编语言学习笔记(二)

2.9 段寄存器

段地址存储在段寄存器

8086CPU有4个段寄存器

CS、DS、SS、ES

当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址

2.10 CS和IP

CS和IP是8086CPU中最关键的寄存器,他们指示当前要读取指令的地址。

CS:代码段寄存器

IP:指令指针寄存器

  1. 从CS:IP指向内存单元读取指令,读取的指令进入指令缓存器;
  2. IP = IP + 所读取指令的长度,从而指向下一条指令;
  3. 执行指令。转到步骤1,重复这个过程。

8086PC工作过程的简要描述

  • 在8086CPU加电或复位后(CPU刚开始工作时)CP和IP被设置为CS=FFFFH,IP=0000H。
  • 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。
  • FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。
  • 在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,再执行。
  • 如果说,内存中的一段信息曾被CPU执行过,那么它所在的内存单元必然被CS:IP指向过。

2.11 修改CS、IP的指令

  • 在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
  • CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

如何修改AX中的值?

mov指令可以改变8086CPU大部分寄存器的值:传送指令

  • mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能
  • jmp段地址:偏移地址

    同时修改CS、IP的内容

    功能:用指令中给出的段地址修改CS,偏移地址修改IP。

    jmp 2AE3:3 >> 2AE33H

    jmp 3:0B16 >> 0B46H

  • 仅修改IP的内容

    jmp某一合法寄存器

    jmp ax (类似于mov IP, ax)

    功能:用寄存器中的值修改IP

问题分析:CPU运行的流程

(初始:CS=2000H,IP=0000H)

截屏2021-06-02 下午11.08.40

  1. mov ax, 6622H ;ax=6622H
  2. jmp 1000:3 ;CS=1000,IP=3
  3. mov ax,0000 ;ax=0000H
  4. mov bx,ax ;bx=0000H
  5. jum bx ;IP=0000H
  6. mov ax,0123H ;ax=0123H
  7. 转到第三步执行(死循环 )

2.12 代码段

对于8086PC机,可以将长度为N(N<=64kb)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元,这段内存是用来存放代码的,从而定义了一个代码段。

例如:

这段长度为10字节的字节的指令,存在从123B0H123B9H的一组内存单元中,我们就可以认为,123B0H123B9H这段内存单元是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10字节。

截屏2021-06-02 下午11.24.18

检测点2.3:

下面的3条指令执行后,CPU几次修改IP?都是什么时候?最后IP中的值是多少?

mov ax,bx

sub ax, ax

jmp ax

4次(第三次:读取jmp ax之后;第四次:执行jmp ax修改IP), ax=0000H,IP=ax;