一:概论
80x86汇编程序都是分段程序设计结构,每个程序段都有一个开始地址:段基址。在保护模式下段基址要由16位的段选择子得到,这些段选
择子存放在六个段寄存器(CS,SS,DS,ES,FS,GS)中:
代码段总是由 CS 段寄存器来指示;
堆栈段总是由 SS 段寄存器来指示;
字符处理指令总是使用 ES 段寄存器作为目标操作数的段寄存器;
一般的数据段可用 DS、ES、FS、GS来指示,但 DS 作为数据段的默认段寄存器,用它来寻址比其它几个段寄存器的效率高,因此最好安排 DS 寻址最常引用的数据段,而 ES、FS、GS去寻址一些不常用的数据段。
段内偏移地址(某个字节相对段基址的偏移量)也被称为有效地址 EA(effective address),它由以下4个部分组成:
EA = 基址 + (变址 * 比例因子) + 位移量
基址、变址、位移量的值可正可负,比例因子只能为正。
1:基址
(32位寻址):
1):如果基址寄存器是 ESP或EBP,则段寄存器为 SS;
2):如果基址寄存器是其它通用寄存器,则段寄存器为 DS;
(16位寻址):
基址寄存器可以是 BX 或 BP
2:变址
(32位寻址):
变址寄存器可以为除 ESP 之外的32位通用寄存器
(16位寻址):
变址寄存器可以是 SI 或 DI
3:比例因子
一个常数,可取 1、2、4、8。
4:位移量
一个8位、16位、32位的常数。
二:详解
默认情况下,存储器寻址使用DS数据段