2.8 ~ 2.12

2020-03-04
2020-03-04
4 min read
Hits

  《汇编语言(第3版)》2.8 ~ 2.12、《零基础入门学习汇编语言》P9、10

2.8 段的概念

  错误认识:内存被划分成了一个一个的段,每一个段有一个段地址。

  其实:内存并没有分段,段的划分来自于 CPU,由于 8086 CPU 用“(段地址×16)+ 偏移地址 = 物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。

  段地址×16 必然是 16 的倍数,所以一个段的起始地址也一定是 16 的倍数;

  偏移地址为 16 位,16 位地址的寻址能力为 64K,所以一个段的长度最大为 64K。

  CPU 访问内存单元时,必须向内存提供内存单元的物理地址。

  8086 CPU 在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。

物理地址段地址偏移地址
21F60H2000H1F60H
2100H0F60H
21F0H0F60H
21F6H0000H
1F00H2F60H

  上表可得:CPU 可以用不同的段地址和偏移地址形成同一个物理地址。

  给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位 64K 个内存单元(偏移地址 16 位,变化范围为 0 ~ FFFFH),比如:给定段地址 1000H,用偏移地址寻址,CPU 的寻址范围为:10000H ~ 1FFFFH。

2.8 小结

  1. 在 8086 PC 机中,存储单元的地址用两个元素来描述。即段地址和偏移地址。
  2. “数据在 21F60H 内存单元中。”对于 8086 PC 机的两种描述
    1. 数据存在内存 2000:1F60 单元中;
    2. 数据存在内存的 2000 段中的 1F60H 单元中。
  3. 可根据需要,将地址连续、起始地址为 16 的倍数的一组内存单元定义为一个段。

2.9 段寄存器

  段寄存器就是提供段地址的。

  8086 CPU 有 4 个段寄存器

  1. CS(Code Segment)代码段寄存器
  2. DS(Data Segment)数据段寄存器
  3. SS(Stack Segment)堆栈段寄存器
  4. ES(Extra Segment)附加段寄存器

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

2.10 CS 和 IP

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

  CS 为代码段寄存器,IP 为指令指针寄存器。

  8086 PC 工作过程的简要描述

  工作流程

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

  在 8086 CPU 加电启动或复位后(即 CPU 刚开始工作时)CS 和 IP 被设置为 CS=FFFFH,IP=0000H。即在 8086 PC 机刚启动时,CPU 从内存 FFFF0H 单元中读取指令执行。FFFF0H 单元中的指令是 8086 PC 机开启后执行的第一条指令。

  在任何时候,CPU 将 CS、IP 中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

  如果说,内存中的一段信息曾被 CPU 执行过的话,那么,它所在的内存单元必然被 CS:IP 指向过。

  在 CPU 中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对 CPU 的控制。

  CPU 从何处执行指令是由 CS、IP 中的内容决定的,程序员可以通过改变 CS、IP 中的内容来控制 CPU 执行目标指令。

2.11 修改 CS、IP 的指令

  如:mov ax,123,mov 指令可以改变 8086 CPU 大部分寄存器的值,被称为传送指令。

mov 指令(传送指令)不能用于设置 CS、IP 的值

  同时修改 CS、IP 的内容:jmp 段地址:偏移地址,功能:用指令中给出的段地址修改 CS,偏移地址修改 IP。

转移指令物理地址
jmp 2AE3:32AE33H
jmp 3:0B1600B46H(=0003×10+0B16)

  仅修改 IP 的内容:jmp 某一合法寄存器,如:jmp ax(类似于 mov IP,ax),功能:用寄存器中的值修改 IP。

2.12 代码段

  对于 8086 PC 机,在编程时,可以根据需要,将一组内存单元定义为一个段。

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

  将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义的代码段中的指令当作指令来执行。

CPU 只认被 CS:IP 指向的内存单元中的内容为指令。

  所以要将 CS:IP 指向所定义的代码段中的第一条指令的首地址。

2.12 小结

  1. 段地址在 8086 CPU 的寄存器中存放。当 8086 CPU 要访问内存时,由段寄存器提供内存单元的段地址。8086 CPU 有 4 个段寄存器,其中 CS 用来存放指令的段地址。
  2. CS 存放指令的段地址,IP 存放指令的偏移地址。
  3. 8086 机中,任意时刻,CPU 将 CS:IP 指向的内容当作指令执行。
  4. 8086 CPU 的工作过程
    1. 从 CS:IP 指向内存单元读取指令,读取的指令进入指令缓冲器;
    2. IP 指向下一条指令;
    3. 执行指令。(转到步骤 1,重复这个过程。)
  5. 8086 CPU 提供转移指令修改 CS、IP 的内容。

DEBUG

  R 命令查看、改变 CPU 寄存器的内容;

  D 命令查看内存中的内容;

  E 命令改写内存中的内容;

  U 命令将内存中的机器指令翻译成汇编指令;

  T 命令执行一条机器指令;

  A 命令以汇编指令的格式在内存中写入一条机器指令。

Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.
Previous 3.1 ~ 3.5