说明:1)指针寄存器(SP,ESP,BP,EBP)
SP,ESP为堆栈指针寄存器,存放当前堆栈段栈顶的偏移地址,
是根据指令自动移动的,要想随机读取
堆栈段中的数据,必须通过BP或EBP基址指针寄存器来读取。
2)控制寄存器(IP,EIP,FLAGS,EFLAGS)
IP,EIP为指令指针寄存器,用于存放当前正在执行的指令的
下一条指令的偏移地址,该寄存器所指的为代码段的偏移地址。
FLAGS为标识寄存器,表示程序运行时的状态和一些特殊控制
3)段寄存器
代码和数据是分开存放,代码存放在代码段,数据存放在数据段
10、内存组织结构
1)内存的地址
在存储器中内存单元的基本单位是*字节*,每个字节都有一个唯一的地址
2)存储单元的内容
一个存储单元存放的信息为存储单元的内容
分为:字节单元、字节单元、双字单元
双字:需要两个16位寄存器,通常为DX:AX,DX高位,AX低位
3)堆栈
堆栈是内存中一块特定的区域,其中数据按照*先进后出*原则
作用:暂存数据、子程序调用与返回、调用中断处理程序、从中断处理程序返回
位置:堆栈段地址存放于SS寄存器中,偏移地址存放在堆栈指针寄存器(SP(16位)/ESP(32位)),
他们永远指向栈顶
初始化:堆栈的初始化时通过设置SS及SP/ESP值来完成的,可以由编译系统自动完成,也可以在程序
中通过伪指令显示地定义
11、实模式
1)介绍
只有8086/8088工作在实模式下;
80286以上的微处理器工作在实模式和保护模式下;
在实模式下微处理器只能寻址1MB的存储空间;
80286以上系统的微处理器在加点或复位时都以实模式方式开始工作
2)内存地址的分段
*为什么要分段?*
8086/8088地址总线为20根,可访问的地址为:2^20=1048576=1M
8086/8088内部寄存器都是16位的,可以直接处理16位长度的存储地址,16位地址的寻址2^16=64K
为了把寻址范围扩大到1MB,实模式存储器地址均采用存储空间的分段技术来解决寻址1MB的存储空间
提出了段地址和偏移地址合成20位物理地址的概念
*分段方法?*
16位段地址 16位段内地址--->20位物理地址
地址的组合:物理地址=段地址*16D(或10H) 偏移地址,(段地址*16D--二进制段地址左移4位)
存放段地址:16位段地址寄存器(CS、DS、SS、ES)
存放偏移地址:16位指针寄存器(IP、SP)
在1MB存储器中可以有64K个段,每个段最多64KB,最小为16KB
*物理地址、段地址、段内地址、逻辑地址的区别?*
物理地址:与内存单元一一对应的20位二进制数,1MB=00000H~FFFFFH
每个物理地址代表一个唯一的内存单元
段地址:将1MB的内存空间分为长64KB的程序区和数据区称为段
每个段用1个16位二进制地址表示
段地址存放在段寄存器中
代码段:用于存放源程序的二进制程序代码,该段的段地址放在CS中
数据段:存放操作数据的,该段的段地址放在DS中
堆栈段:堆栈用的存储区,该段的段地址放在SS中
附加段:该段的段地址放在ES中
段内地址:16位二进制段内地址为偏移地址
(偏移地址)不同段内的偏移地址存放在不同的寄存器中,段寄存器与装偏移地址的寄存器按一定要求组合
逻辑地址:用段地址和偏移地址来表示内存单元的地址为逻辑地址,例如,段地址:偏移地址
*逻辑地址与物理地址的换算关系?*
物理地址 = 段地址*16D(10H) 偏移地址
逻辑地址 = 段地址:偏移地址
例子:逻辑地址,1111H:2222H
物理地址,1111H*10H 2222H = 13332H
假设1111H为代码段地址,2222H在指针寄存器IP中,示意图如下: