菜鸟学汇编003 代码段寄存器 CS 和 指令指针寄存器 IP

1. 8086CPU有20位地址总线,可以传送20位的地址,达到1MB寻址能力。

    而 8086CPU 是16位结构,在内部一次性处理、传输、暂时存储的地址都是16位,

    从内部结构看,寻址能力只有64KB。

 

    怎么办呢? 在8086CPU内部使用2个16位的地址来合成一个20位的物理地址。

 

2. 段寄存器有4个:CS、DS、SS、ES。 我们先来看学习 代码段寄存器CS

 

3. 段地址(16位) + 偏移地址(16位) ---->送到 “地址加法器”, 传出来后就是 20位的物理地址。

 

    物理地址 = 段地址 X 16 + 偏移地址

 

    例如 8086CPU要访问 123C8H的内存单元。

 

    段地址为1230H, 偏移地址为 00C8H。

    地址加法器 先把 段地址X16,段地址变成了12300H

    再进行小学学过的加法运算。

    12300H

                   +

      00C8H

-----------------

    123C8H

 

4. 段地址X16,可以理解为 左移4位, 一个X进制的数据左移一位,想当于原数据乘以X。

 

5. 段地址X16 + 偏移地址 = 物理地址 的本质含义

    CPU在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

 

6. CPU 可以用不同的段地址和偏移地址形成同一个物理地址。

 

7. 如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位64KB个内存单元。

 

8. 在8086PC机中,存储单元的地址用2个元素来描述,段地址和偏移地址

 

9. 段寄存器(CS、DS、SS、ES)中的CS段寄存器

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

    CS为代码段寄存器 (Code Segment Register) IP为指令指针寄存器 (Instruction Pointer Register)


    在8086PC机中,任意时刻,设CS中的内容为M, IP中的内容为N,

    8086CPU将从内存 M X 16 + N 单元开始,读取一条指令并执行。

 

10.  修改CS、IP的指令。

 

      大部分8086CPU寄存器的值,都可以使用mov指令来改变,mov指令被称为 传送指令

     

      mov指令不能修改CS、IP中的值,因为8086CPU没有提供这样的功能。

 

      能够改变CS、IP寄存器内容的指令称为 转移指令

 

     一个最简单的可以修改CS、IP寄存器中值的指令:jmp 指令. 

 

     (1) 如果仅想修改IP寄存器的内容,语法如下:

     jmp 某一合法寄存器 ----> 用(某一合法)寄存器中的内容修改IP寄存器中的值。

 

     例子: 假设现在 ax = 1000H, CS = 2000H, IP = 0003H

     执行 jmp ax 后, ax = 1000H, CS = 2000H, IP = 1000H

 

     (2) 如果想同时修改CS:IP寄存器的值。可以使用语法: jmp 段地址:偏移地址

 

     如:jmp 2AE3:3 执行后, CS = 2AE3H, IP = 0003H。CPU 将从2AE33H处读取指令。

 

11. 代码段:我们可以将长度为N(N <= 64KB)的一组代码,存在一组地址连续、起始地址为16倍数的内存单元中,

      我们可以认为,这段内存是用来存放代码的,从而定义了一个代码段。

 

      如果想让CPU执行到代码段中的指令,必须要将CS:IP指向所定义代码段中第一条指令的首地址。

 

      例如:以下代码段(长度为10个字节)

      mov ax, 0000H    (B8 00 00)

      add ax, 0123H    (05 23 01)

      mov bx, ax          (8B D8)

      jmp bx                (FF E3)

 

      如果把上面的代码段存放在 123B0H~123B9H内存单元中,将其定义为代码段,

      如果想让这段代码得到执行,可设CS=123BH,IP=0000H。

 

12. 8086CPU的工作过程:

      

      (1) 从CS:IP指令的内存单元读取指令,读取的指令进入指令缓冲器。

      (2) IP指向下一条指令

      (3) 执行指令 [然后重复步骤(1), 重复这个过程]

 

你可能感兴趣的:(c,工作,汇编,存储)