3-机器结构与程序运行.ppt
文本预览下载声明
1. 数据的存储格式 D7 D0 字节 D15 D0 字 D31 D0 双字 D7 D0 00006H 78H 00005H 56H 00004H 12H 00003H 34H 00002H 00001H 00000H 低地址 存储单元及其存储内容 每个存储单元都有一个编号;被称为存储器地址 每个存储单元存放一个字节的内容 0002H单元存放有一个数据34H 表达为 [0002H]=34H 图示 多字节数据存放方式 多字节数据在存储器中占连续的多个存储单元: 存放时,低字节存入低地址,高字节存入高地址; 表达时,用它的低地址表示多字节数据占据的地址空间。 图1.7中2号“字”单元的内容为: [0002H] = 1234H 2号“双字”单元的内容为: [0002H] = 80x86处理器采用“低对低、高对高”的存储形式,被称为“小端方式Little Endian”。 相对应还存在“大端方式Big Endian”。 图示 数据的地址对齐 同一个存储器地址可以是字节单元地址、字单元地址、双字单元地址等等 字单元安排在偶地址(xxx0B)、双字单元安排在模4地址(xx00B)等,被称为“地址对齐(Align)” 对于不对齐地址的数据,处理器访问时,需要额外的访问存储器时间 应该将数据的地址对齐,以取得较高的存取速度 视具体情况来确定 2. 存储器的分段管理 8086CPU有20条地址线 最大可寻址空间为220=1MB 物理地址范围从00000H~FFFFFH 8086CPU将1MB空间分成许多逻辑段(Segment) 每个段最大限制为64KB 段地址的低4位为0000B 这样,一个存储单元除具有一个唯一的物理地址外,还具有多个逻辑地址 物理地址和逻辑地址 对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H~FFFFFH。 分段后在用户编程时,采用逻辑地址,形式为 段基地址 : 段内偏移地址 分隔符 逻辑地址 段地址说明逻辑段在主存中的起始位置 8086规定段地址必须是模16地址:xxxx0H 省略低4位0000B,段地址就可以用16位数据表示,就能用16位段寄存器表达段地址 偏移地址说明主存单元距离段起始位置的偏移量 每段不超过64KB,偏移地址也可用16位数据表示 物理地址和逻辑地址的转换 将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址 一个物理地址可以有多个逻辑地址 逻辑地址 1460:100、1380:F00 物理地址 14700H 14700H 14600H + 100H 14700H 13800H + F00H 14700H 段地址左移4位 加上偏移地址 得到物理地址 3. 段寄存器 8086有4个16位段寄存器 CS(代码段)指明代码段的起始地址 SS(堆栈段)指明堆栈段的起始地址 DS(数据段)指明数据段的起始地址 ES(附加段)指明附加段的起始地址 每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途 段值的确定 一个执行文件.exe在电击执行时,首先由操作系统分析本程序的段占用情况:包括多少段、各段长度、代码段第一条指令的偏移 然后在当前内存中寻找合适区域,并分配CS、DS、SS、ES等各段 把.exe执行文件中的数据调入内存DS段,代码调入内存CS段…….. 然后把CPU的CS变为当前分配的代码段值,IP为第一条指令的偏移,从而开始程序的执行 在汇编程序时,通过交叉文件可以看出各段大小。 代码段(Code Segment) 代码段用来存放程序的指令序列 代码段寄存器CS存放代码段的段地址 指令指针寄存器IP指示下条指令的偏移地址 处理器利用CS:IP取得下一条要执行的指令 堆栈段(Stack Segment) 堆栈段确定堆栈所在的主存区域 堆栈段寄存器SS存放堆栈段的段地址 堆栈指针寄存器SP指示堆栈栈顶的偏移地址 处理器利用SS:SP操作堆栈顶的数据 数据段(Data Segment) 数据段存放运行程序所用的数据 数据段寄存器DS存放数据段的段地址 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址 处理器利用DS:EA存取数据段中的数据 附加段(Extra Segment) 附加段是附加的数据段,也用于数据的保存: 附加段寄存器ES存放附加段的段地址 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址 处理器利用ES:EA存取附加段中的数据 串操作指令将附加段作为其目的操作数的存放区域 如何分配各个逻辑段 程序的指令序列必须安排在代码段 程序使用的堆栈一定在堆栈段 程序中的数据默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段 数据的存放比较灵活,实际上可以存放在任何一种逻辑段
显示全部