【汇编语言】寄存器和地址
寄存器和地址
文章目录
一、寄存器
(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保存
- 段基地址:堆栈段寄存器SS指示
- 段基地址:数据段寄存器DS指示,有时也用ES、FS和GS指示
(3)物理地址与逻辑地址
-
物理地址
主存储器需要处理器通过总线进行访问,称为物理存储器。物理存储器的每个存储单元有一个唯一的地址,这个地址就是物理地址 (Physical Address) 。物理地址空间从 开始顺序编排,直到处理器支持的最大存储单元。
-
逻辑地址
存储器空间可以分段管理,采用逻辑地址指示
逻辑地址=段基地址∶偏移地址 ►段基地址=在主存中的起始地址 - ►偏移地址=距离段基地址的位移量
不论是何种存储模型,程序员都采用逻辑地址进行程序设计,逻辑地址由段基地址和偏移地址组成 段基地址(简称段地址)确定段在主存中的起始地址,以段基地址为起点,段内的位置可以用距离该起点的位移量表示,称为偏移 (Offset) 地址 。
(4)对存储器地址的理解
存储器地址在计算机硬件上的位置为物理地址,如果将物理地址暴露给程序,程序可以轻易访问每一个字节的空间,可能会破坏操作系统,导致程序崩溃。因此操作系统对内存进行新的抽象,操作系统为程序分配一个线性的空间,线性空间内的地址就是虚拟地址。在虚拟地址中的程序采取分段管理,想要确定存储器的位置,只需要知道存储器位于哪一段,在段的什么位置即可,因此编程使用的逻辑地址可以使用段基地址:偏移地址来表示。
- 关于汇编语言中的转移指令原理——转移地址在寄存器中的jmp
- [汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令
- 汇编语言之标志寄存器
- 汇编语言之寄存器使用(bx,si,di,bp)
- 汇编语言(王爽) 第3章寄存器(内存访问)
- [汇编语言学习笔记][第二章寄存器]
- [汇编语言]debug中用r命令修改cs、ip,并不能影响a命令的代码起始写入地址?
- 汇编语言 寄存器内存访问原理解析
- 关于汇编语言中的转移指令原理——转移地址在内存中的jmp指令
- 寄存器(CPU工作原理)04 - 零基础入门学习汇编语言09
- 寄存器(内存访问)06 - 零基础入门学习汇编语言18
- 汇编语言学习笔记 第一节:寄存器
- 汇编语言--寄存器(cpu工作原理)
- 汇编语言 Part 2——寄存器
- 汇编语言学习笔记之物理地址
- 汇编语言之寄存器总结
- 汇编语言学习第三章-寄存器(内存访问)
- 汇编语言--寄存器(内存访问)
- 汇编语言用:通用寄存器-专用寄存器-段寄存器
- 汇编语言中的各种寄存器介绍