汇编(三)

来源:互联网 发布:json带括号解析不出来 编辑:程序博客网 时间:2024/05/21 05:06

8086的寻址方式

  • cpu访问内存单元时,要给出内存单元的地址,所有的内存单元都有唯一的地址,叫做物理地址
  • 8086有20位地址总线,课一传送20位的地址,1M的寻址能力
  • 但它又是16位结构的CPU,它内部能够一次性处理、传输、暂时存储的地址为16位。如果将地址从内部简单地出发,那么它只能送出16位的地址,表现出来的寻址能力只有64KB
    8086采用一种在内部用2个16位地址合成的方法来生成1个20位的物理地址
    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

内存分段管理

  • 8086是用“基础地址(段地址 ✖️ 16) + 偏移地址 = 物理地址”的方式给出物理地址
  • 为了开发方便,我们可以采取分段的方法来管理内存,比如:

这里写图片描述

  • 地址10000H ~ 100FFH 的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H
  • 地址10000H~1007FH、10080H~100FFH的内存单元组成2个段,它们的起始地址(基础地址)为:10000H10080H,段地址为1000H1008H,大小都为80H
  • 在编程时可以根据需要,将若干连续地址的内存单元看做一个段,用段地址X16定为段的起始地址(基础地址),用便宜地址定位段中的内存单元
    • 段地址X16必然是16的倍数,所以一个段的起始地址(基础地址)也一定是16的倍数
    • 偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB

      这里写图片描述

段寄存器

  • 8086在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址
  • 是什么部件提供段地址?段地址在8086的段寄存器中存放
  • 8086有4个段寄存器:CS、DS、SS、ES,当CPU需要访问内存时由这4个段寄存器提供内存单元的段地址
    • CS(Code Segment):代码段寄存器
    • DS (Data Segment): 数据段寄存器
    • SS(Stack Segment): 堆栈寄存器
    • ES(Extra Segment):附加段寄存器

CS和IP

  • cs为代码段寄存器,IP为指令指针寄存器,它们指示了CPU当前要读取指令的地址
  • 任意时刻,8086CPU都会将CS:IP指向的指令作为下一条需要取出执行的指令

    这里写图片描述

    这里写图片描述

指令的执行过程

这里写图片描述

12

这里写图片描述

13

这里写图片描述

14

这里写图片描述

15

这里写图片描述

16

这里写图片描述

17

这里写图片描述
18
这里写图片描述

19

这里写图片描述

21

这里写图片描述

22

这里写图片描述

23

这里写图片描述

24

这里写图片描述

25

这里写图片描述

26

这里写图片描述

总结

指令和数据

  • 在内存或者磁盘上,指令和数据没有任何区别,都是二进制信息
  • CPU在工作的时候把有的信息看做指令,有的信息看做数据,为同样的信息赋予了不同的意义

    这里写图片描述
  • CPU根据什么将内存中的信息看做指令?
    • CPU将CS:IP指向的内存单元的内容看做指令
    • 如果内存中的某段内容曾被CPU执行过,那么少它所在的内存单元必然被CS:IP指向过

JMP指令

  • CPU从何处执行指令是由CS、IP中的内容决定的,我们可以通过改变CS、IP的内容来控制CPU执行目标指令
  • 8086提供了一个mov指令(传送指令),可以用来修改大部分寄存器的值,比如
    • mov ax,10、mov bx, 20、mov cx,30、mov dx, 40
  • 但是,mov指令不能用于设置CS、IP的值,8086没有提供这样的功能
  • 8086提供了另外的指令来修改CS、IP的值,这些指令统称为转移指令,最简单的是jmp只指令
    这里写图片描述

    这里写图片描述

代码段

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

原创粉丝点击