汇编寄存器和寻址方式简介
2007-12-12 16:05
441 查看
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?)
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));
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?)
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));
相关文章推荐
- 汇编寄存器和寻址方式简介
- 16位汇编寄存器和寻址方式总结
- 汇编语言基础之一 - CPU架构和寄存器种类简介
- 汇编学习笔记--更灵活的寻址方式
- 8086汇编笔记:寄存器和寻址
- 四 ARM汇编--寻址方式
- (32位汇编 六)内存读写及寻址方式
- 王爽 汇编语言 第二版 实验七 寻址方式在结构化数据访问中的使用 源码
- X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编
- 【逆向知识】逆向知识笔记-寄存器、栈的存储方式、反汇编指令、跳转
- 汇编-ARM寻址方式
- 2: 心法筑基--ARM汇编指令之寻址方式
- 一步步学汇编(六)内存寻址方式
- 汇编 寻址方式总结
- 8086汇编寻址方式总结
- [汇编语言]-第七章 不同的寻址方式的灵活应用
- ARM 汇编之寻址方式
- 汇编语言基础之二 - 各种寻址和过程进出简介