汇编语言寄存器和地址

Posted BkbK-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言寄存器和地址相关的知识,希望对你有一定的参考价值。

寄存器和地址

文章目录

一、寄存器

(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位通用寄存器
    寄存器名称英文中文作用
    EAXAccumulator累加器使用频度最高,用千算术运算逻辑运算以及与外设传送信息等
    EBXBase Address基址寄存器常用来存放存储器地址,以方便指向变批或数组中的元素
    ECXCounter计数器常作为循环操作等指令中的计数器
    EDXData数据寄存器可用来存放数据,其中低 16 DX 常用来存放外设端口地址
    ESISource Index源变址寄存器用于指向字符串或数组的源操作数
    EDIDestination Index目的变址寄存器用于指向字符串或数组的目的操作数
    EBPBase Pointer基址指针默认情况下指向程序堆栈区域的数据,主要用于在子程序中访问通过堆栈传递的参数和局部变批
    ESPStack Pointer堆栈指针专用于指向程序堆栈区域顶部的数据,在涉及堆栈操作的指令中会自动增加或减少

2.专用寄存器

  • 标志寄存器FLAG

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

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

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

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

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

  • 段寄存器

    段寄存器表明某个段在主存中的位置
    6个16位段寄存器:CS DS SS ES FS GS

    寄存器
    代码段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)物理地址与逻辑地址

1.物理地址

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

2.逻辑地址

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

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

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

3.逻辑地址与物理地址的转换

  • 实地址方式的地址转换

    通电或复位后, IA-32 处理器处千实地址方式 (Real- address Mode , 简称实方式) 它实现了8086 相同的程序设计环境,但有所扩展

    • 主存空间1MB:00000H~FFFFFH
    • 程序设计时分段管理,但有两个限制:
      • 每个段最大为64KB
      • 段只能开始于低4位地址全为0的物理地址处
    • 逻辑地址=段地址∶ 偏移地址
      • 16位段寄存器保存20位段起始地址的高16位
      • 偏移地址也用16位数据表示
    • 物理地址=段地址×16(左移二进制4位)+偏移地址
  • 保护方式的地址转换

    保护方式 (Protected Mode) IA-32 处理器固有的工作状态 在保护方式下, IA-32 处理器能够发挥其全部功能,可以充分利用其强大的段页式存储管理以及特权与保护能力 保护方式下, IA-32 处理器可以使用全部 32 条地址总线,可寻址 4GB 物理存储器

    • 16位段寄存器保存16位段选择器
    • 段选择器指向64位段描述符(Descriptor)
    • 段描述符包括段基地址
      • 平展存储模型:指向地址0位置
      • 段式存储模型:指向线性地址空间不同的段
      • 实地址存储模型:保存段基地址的高16位

(4)操作数寻址过程

1.段选择器

  • 保护方式的16位段寄存器被定义为段选择器
  • 包含3个域,指向一个段描述符
    • 索引域
      记录段描述符在“描述符表”内的位置
    • 表指示位TI
      指示要寻址的描述符表
    • 请求特权层RPL
      反映请求本次存取的特权级别

2.段描述符

描述符是保护方式引入的数据结构,8个字节64位,段描述符:“描述”段的属性

  • 段界限(segment limit):用于存储空间保护
  • 基地址(base address):用于形成物理地址
  • 访问权字节(access rights byte):段访问权限:该段当前是否驻留主存、该段所具有的特权层和段类型,用于特权保护

3.操作数寻址过程举例

  • (1)段选择器的TI域指明描述符表,获得描述符表基地址
  • (2)利用索引值指向该段的段描述符
  • (3)从段描述符中取出段基地址,从逻辑地址中取出段内偏移地址
  • (4)基地址与偏移地址相加,得到操作数的线性地址

以上是关于汇编语言寄存器和地址的主要内容,如果未能解决你的问题,请参考以下文章

C指针原理-AT&T汇编

4.1系统寄存器和系统指令

汇编语言程序设计中,段寄存器的内容和偏移量合起来是内存地址,

atpcs中规定使用哪个寄存器存放堆栈基地址

函数栈帧的创建和销毁

函数栈帧的创建和销毁