汇编语言寄存器和地址
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位通用寄存器
寄存器名称 英文 中文 作用 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 就加上该指令的字节数,指向下一条指令
-
段寄存器
段寄存器表明某个段在主存中的位置
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)基地址与偏移地址相加,得到操作数的线性地址
以上是关于汇编语言寄存器和地址的主要内容,如果未能解决你的问题,请参考以下文章