1 寄存器:
1)数据寄存器:AX,BX,CX,DX
2)段寄存器 DS CS SS ES FS GS
DS 数据段(BX,SI,DI)
CS 代码段(IP)
SS 堆栈段(SP)
ES,FS,GS 附加段
3) 变址(指示)寄存器:SI(源变址寄存器 ),DI (目标变址寄存器 )
4) 指针寄存器 SP,BP(用在堆栈段)
BP为栈基址,用它可直接存取堆栈中的数据
SP为栈顶指针
5) 指令寄存器 IP
6) 标志寄存器 Flags 含运算结果标志位6个和状态控制位3个
常用偏移寄存器:BX,SI,DI,SP,存的就是地址,
段内偏移(offset) equals 有效地址 EA
基址寄存器: BX,BP
可见BX是比较特殊的寄存器。BP主要用在子过程调用时,用以不同子过程在同一堆栈中的堆栈基址,在BP基础上使用SP(yeah?)
2、寻址方式
1) 立即寻址:直接将操作数mov给寄存器
eg:MOV AX,2000h
2) 直接寻址:不通过偏移寄存器,直接找到常量或者[number]在RAM中的地址
eg:MOV AX,[20100]; (AX)=((DS)*16d+20100);
MOV AX,VALUE; (AX)=((DS)*16d+(VALUE));
MOV AX,[VALUE]; (AX)=((DS)*16d+(VALUE));
MOV AX,ES:[VALUE]; (AX)=((ES)*16d+(VALUE)); 跨段操作
为什么MOV AX,VALUE 与 MOV AX, [VALUE]一致呢,因为VALUE始终得到的是64k范围内,无法表示
32位存取器,故必须加上段基址,ok?
3) 寄存器间接址:在2的基础上,将number或value换成寄存器(BX,SI,DI):DS,SP:SS,主要用来得到段对应的存储器的基址。
eg:MOV AX,[BX]; (AX)=((DS)*16d+(BX));
MOV AX,[SI]; (AX)=((DS)*16d+(SI));
MOV AX,[SP]; (AX)=((SS)*16d+(SP));
MOV AX,ES:[BX]; (AX)=((ES)*16d+(BX)); 用于表格操作,简单的将ES++即可进行下一列操作,行改BX即可
4) 寄存器相对寻址:在3的基础上加了一个8或16位的位移量,在存储器基址的基础上加上偏移。
eg:MOV AX,COUNT[BX]; (AX)=((DS)*16d+(COUNT)+(BX));
MOV AX,[COUNT+BX]; (AX)=((DS)*16d+(COUNT)+(BX));
MOV AX,ES:[COUNT+BX](AX)=((ES)*16d+(COUNT)*(BX));
5) 基址变址寻址: 基址:(DS)BX,(SS)BP 变址:SI,DI,前面几种都是作为segment+ea+相对地址COUNT方式
eg:MOV AX,[BX][SI/DI];(AX)=((DS)*16d+(BX)+(SI/DI));
MOV AX,[BP][SI/DI]; (AX)=((SS)*16D+(BP)+(SI/DI));
注意:变址,而不是偏移址,对BP,尤其注意不是SP,SP不是变址
6) 相对基址变址寻址 在5的基础上添加了MASK位移量,形如4在3基础上多一个COUNT
eg:MOV AX,MASK[BX][SI/DI]; (AX)=((DS)*16d+(BX)+(SI/DI)+(MASK));
MOV AX,MASK[BP][SI/DI]; (AX)=((SS)*16d+(BP)+(SI/DI)+(MASK));
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lllzwei/archive/2007/12/12/1931600.aspx