您的位置:首页 > 其它

汇编寄存器和寻址方式简介

2009-06-11 12:52 746 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: