【汇编语言】寄存器和地址

寄存器和地址

在这里插入图片描述

一、寄存器

(1)透明寄存器

透明寄存器对应用人员来说不可见,不能直接控制

(2)可编程寄存器

具有引用名称、供编程使用

1.通用寄存器

处理器最常使用的整数通用寄存器,可用于保存整数数据、地址等

32位IA-32处理器具有8个32位通用寄存器
EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP
它们源自16位8086处理器的8个16位通用寄存器 AX,BX,CX,DX,SI,DI,BP,SP
前4个寄存器还可分成高低字节,形成8个8位通用寄存器 AH,AL,BH,BL,CH,CL,DH,DL
在这里插入图片描述

  • 32位通用寄存器
    寄存器名称 英文 中文 作用
    EAX Accumulator 累加器 使用频度最高,用千算术运算逻辑运算以及与外设传送信息等
    EBX Base Address 基址寄存器 常用来存放存储器地址,以方便指向变批或数组中的元素
    ECX Counter 计数器 常作为循环操作等指令中的计数器
    EDX Data 数据寄存器 可用来存放数据,其中低 16 DX 常用来存放外设端口地址
    ESI Source Index 源变址寄存器 用于指向字符串或数组的源操作数
    EDI Destination Index 目的变址寄存器 用于指向字符串或数组的目的操作数
    EBP Base Pointer 基址指针 默认情况下指向程序堆栈区域的数据,主要用于在子程序中访问通过堆栈传递的参数和局部变批
    ESP Stack Pointer 堆栈指针 专用于指向程序堆栈区域顶部的数据,在涉及堆栈操作的指令中会自动增加或减少

2.专用寄存器

  • 标志寄存器FLAG

    标志体现了某种工作形态,反映指令执行结果或控制指令执行形式。

    标志寄存器包含 组状态标志 、一 个控制标志和 组系统标志,其初始状态为000000002 H:

    • ►状态标志:记录指令执行结果的辅助信息
      状态标志有 6个 从低位到高位依次是:
    中文 缩写 全称
    进位标志 CF Carry Flag
    奇偶标志 PF Parity Flag
    调整标志 AF Adjust Flag
    零标志 ZF Zero Flag
    符号标志 SF Sign Flag
    溢出标志 OF Overflow Flag
    • ►控制标志:方向标志DF,仅用于用于串操作指令中,控制地址的变化方向
    • ►系统标志:控制操作系统或核心管理程序的操作方式
  • 指令指针寄存器EIP

    保存将要执行的指令在主存的存储器地址

    EIP 具有自动增量的能力 处理器执行完一条指令, EIP 就加上该指令的字节数,指向下一条指令

  • 段寄存器

    段寄存器表明某个段在主存中的位置

    寄存器
    代码段 CS(Code Segment)
    堆栈段 SS(Stack Segment)
    数据段 DS(Data Segment)ES (Extra Segment)FS GS

二、地址

(1)存储模型

  • 平展存储模型(Flat Memory Model)

    存储器是一个连续的4GB线性地址空间

    平展存储模型 (Flat Memory Model) 下,对程序来说存储器是一个连续的地址空间,称为线性地址空间。程序需要的代码、数据和堆栈都包含在这个地址空间中。线性地址空间也以字节为基本存储单位,即每个存储单元保存一个字节且具有一个地址,这个地址称为线性地址 (Linear Address) IA-32 处理器支持的线性地址空间是 0 ~ 2 32 2^{32} 232 - 1 (4GB 容量)。

  • 段式存储模型(Segmented Memory Model)

    存储器由一组独立的地址空间组成:段(Segment) 每个段都可以达到4GB

    段式存储模型 (Segmented Memory Model) 下,对程序来说存储器由一组独立的地址空间组成,这个地址空间称为段 (Segment) 。通常,代码、数据和堆栈位千分开的段中。程序利用逻辑地址 (Logical Address) 寻址段中的每个字节单元,每个段都可以达到 4GB。
    在处理器内部,所有的段都被映射到线性地址空间 程序访问一个存储单元时,处理器会将逻辑地址转换成线性地址 使用段式存储模型的主要目的是增加程序的可靠性。在这里插入图片描述

  • 实地址存储模型(Real-address Memory Model)

    实地址存储模型 (Real address Mode Memory Model) 8086 处理器的存储模型 IA-32 处理器之所以支持这种存储模型,是为了兼容原来为 8086 处理器编写的程序 实地址存储模型是段式存储模型的特例,其线性地址空间最大为 1MB 容量,由最大为 64KB 的多个段组成。

(2)存储空间分段管理

  • 代码段(Code Segment):存放程序的可执行代码(处理器指令)
    • 段基地址:代码段寄存器CS指示
    • 偏移地址:指令指针寄存器EIP保存
  • 数据段(Data Segment):存放程序所用的数据,例如全局变量
    • 段基地址:堆栈段寄存器SS指示
    • 偏移地址:堆栈指针寄存器ESP保存
  • 堆栈段(Stack Segment):程序需要的特殊区域,存放返回地址、临时变量等
    • 段基地址:数据段寄存器DS指示,有时也用ES、FS和GS指示
    • 偏移地址:存储器寻址方式计算出,有效地址EA指示

(3)物理地址与逻辑地址

  • 物理地址

    主存储器需要处理器通过总线进行访问,称为物理存储器。物理存储器的每个存储单元有一个唯一的地址,这个地址就是物理地址 (Physical Address) 。物理地址空间从 开始顺序编排,直到处理器支持的最大存储单元。

  • 逻辑地址

    存储器空间可以分段管理,采用逻辑地址指示

    • 逻辑地址=段基地址∶偏移地址
      • ►段基地址=在主存中的起始地址
      • ►偏移地址=距离段基地址的位移量
    • 处理器内部以及程序员编程时采用逻辑地址

    不论是何种存储模型,程序员都采用逻辑地址进行程序设计,逻辑地址由段基地址和偏移地址组成 段基地址(简称段地址)确定段在主存中的起始地址,以段基地址为起点,段内的位置可以用距离该起点的位移量表示,称为偏移 (Offset) 地址 。

(4)对存储器地址的理解

存储器地址在计算机硬件上的位置为物理地址,如果将物理地址暴露给程序,程序可以轻易访问每一个字节的空间,可能会破坏操作系统,导致程序崩溃。因此操作系统对内存进行新的抽象,操作系统为程序分配一个线性的空间,线性空间内的地址就是虚拟地址。在虚拟地址中的程序采取分段管理,想要确定存储器的位置,只需要知道存储器位于哪一段,在段的什么位置即可,因此编程使用的逻辑地址可以使用段基地址:偏移地址来表示。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/BlacKingZ/article/details/114375129
今日推荐