一. 概述
x86 汇编程序都是分段程序设计结构,每个程序段都有一个开始地址:段基址。
在保护模式下段基址要由16位的段选择子得到,这些段选择子存放在六个段寄存器(CS,SS,DS,ES,FS,GS)中:
段选择子一直都只有16位,它表示的是段描述符表中内容的下标,目前16 位已经够用了,其它的原因也就不可而知了。
代码段CS 段寄存器来指示;
堆栈段SS 段寄存器来指示;
附加数据段 ES 段寄存器作为目标操作数的段寄存器;
一般的数据段可用 DS、ES、FS、GS来指示,但 DS 作为数据段的默认段寄存器,用它来寻址比其它几个段寄存器的效率高,因此最好安排 DS 寻址最常引用的数据段,而 ES、FS、GS去寻址一些不常用的数据段。
基址、变址、位移量的值可正可负,比例因子只能为正。
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数据段,可以使用段寄存器来显式指出选择的段。
1:立即寻址
对多字节立即数,高字节放在寄存器高位,低字节放在寄存器低位。
例: