汇编语言---操作数寻址方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言---操作数寻址方式
ASM 2009-07-13 19:37:23 阅读16 评论0 字号:大中小订阅
操作数是指令或程序的主要处理对象.汇编语言指令的操作数的个数可以是0、1、2;即:汇编指令可以没有操作数,可以只有一个操作数,也可以有两个操作数;在CPU的指令系统中,除了NOP(空操作指令)、HLT(停机指令)等少数指令之外,大量的指令在执行的过程中都会涉及到操作数;所以,在指令中如何表达操作数或操作数所在位置是正确运用汇编指令的重要因素之一;
在指令中,指定操作数或操作数存放位置的方法称为寻址方式;操作数的各种寻址方式是使用汇编语言进行程序设计的基础;
一、16位地址的寻址方式
CPU中有7中基本的寻址方式:立即数寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式;其中,直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式,这5种寻址方式是确定存储单元有效地址的5种不同的计算方法,用它们可以方便地实现对数组元素的访问;由于总线接口单元BIU能根据需要自动引用段寄存器得到段值,所以这5种方式也就是确定存放操作数的存储单元的有效地址的方法;有效地址EA 就是段内偏移地址,是一个16位的无符号整数,在利用者5种方法计算有效地址时,所得到的结果也被认为是一个16位的无符号整数; 除了这些基本的寻址方式外,还有固定寻址和IO端口寻址,等等;另外,在32位CPU中,为了扩大对存储单元的寻址能力,增加了一种新的寻
址方式---32位地址的寻址方式;
1、立即数寻址方式:
操作数作为指令的一个组成部分而直接写在指令中,这种操作数称为立即数,这种寻址方式称为立即数寻址方式;立即数,可以理解为常数;
如:123、"abc"、false、true,等等;这种数跟在操作码后面,与指令一起存放在代码段中;
立即数可以是8位、16位.如果立即数是16位的,那么将按照"高高低低"的顺序原则存放,即:高字节存放在高地址存储单元中,低字节存放
在低地址存储单元中;例如:
MOV AH,08H ADD AX,1234H MOV ECX,123456H
MOV B1,12H MOV W1,3456H ADD D1,32123456H
其中,B1、W1、D1分别是字节、字、双字存储单元;指令中,逗号前面的操作数称为第一操作数,逗号后面的字面数值称为是第二操作数,在这里,这些第二操作数就是立即数(常数).在汇编语言中,规定:立即数不能作为指令中的第一操作数.该规定与高级语言中"赋值语句的左
边不能是常量"的规定一致;立即数常用于对寄存器或存储单元赋初值;
立即数寻址方式的图示:
2、寄存器寻址方式:
指令所需要的操作数已经存储在寄存器中,或者把目标操作数存入寄存器中,而在指令中仅仅指出所使用的寄存器既可;这种在指令中指出
所使用寄存器的寻址方式称为寄存器寻址方式;
指令中可以引用的寄存器机器符号名称如下:
8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL,等等;
16位寄存器:AX、BX、CX、DX、SI、DI、BP、SP、CS、DS、ES、SS、FS、GS等等;
32位寄存器:EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP等等;
寄存器寻址方式是一种简单快捷的寻址方式,源操作数和目的操作数都可以是寄存器;
A.源操作数是寄存器的寻址方式,如:
ADD VARD,EAX ADD VARW,AX ADD VARB,BH
其中,VARD、VARW、VARB分别是双字变量、字变量、字节变量;
B.目的操作数是寄存器的寻址方式,如:
ADD BH,78H ADD AX,1234H MOV EBX,12345678H
C.源操作数和目的操作数都是寄存器的寻址方式,如:
MOV EAX,EBX MOV AX,BX MOV DH,BL
由于指令所需要的操作数都已经存储在寄存器中,或者操作的结果都被存入到寄存器中,这样,在指令执行过程中,就不会再去读写存储器单元,会减少读写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度.
3、直接寻址方式:
操作数存放在存储单元中,该存储单元的有效地址作为指令的一个组成部分;这种寻址方式称为直接寻址方式;即:指令所需要的数据存放在一个存储器单元中,而指令中直接包含该存储器单元的有效地址EA(也就是该操作数的有效地址);通常情况下,操作数一般存放在数据段中,所以,操作数的物理地址将由数据段寄存器DS的值加上指令中给出的16位有效地址EA得出,但是,如果使用段超越前缀,那么,操作数
则可以存放在其他段中;
由于数据段的段寄存器默认为DS,所以,如果要指定访问其它段内的数据,则可在指令中使用段超越前缀的方式显示地书写出来;下面指令
的目的操作数就是带段超越前缀的直接寻址方式:
MOV ES:[1000H],AX ;"ES:"就是段超越前缀的标识,表示访问的是附加段寄存器中的存储器单元;
直接寻址方式常用于处理存储器单元的数据,其操作数是内存变量,该寻址方式可在64K字节的段内进行寻址;直接寻址方式的操作数通常
是程序使用的变量;
注意:直接寻址方式与立即数寻址方式的书写格式不同,直接寻址的有效地址要写在方括号"[]"中,而立即数寻址方式则直接写出立即数;
在程序中,直接地址通常用内存变量名来表示;例如,指令"MOV BX,VARW"中的VARW就是内存变量名,它表示一个直接地址;
比较一下指令汇总原操作数的寻址方式(VARW是内存变量):
MOV AX,1234H MOV AX,[1234H] ;前者是立即数寻址,后者是直接寻址;
MOV AX,VARW MOV AX,[VARW] ;两者等效,均为直接寻址;内存变量名就表示直接地址;
直接寻址方式的图示:
4、寄存器间接寻址方式:
操作数在存储器单元中,操作数的有效地址EA存放在SI、DI、BX、BP这四个寄存器中的一个寄存器中;称这种寻址方式为寄存器间接寻址方式;一般情况下(即:不使用段超越前缀明确指定段寄存器时),如果操作数的有效地址EA存放在SI、DI、BX中,则以数据段寄存器DS的值作为操作数的段地址;如果操作数的有效地址EA存放在BP中,则以堆栈段SS的值为段地址;
寄存器间接寻址方式下,操作数的物理地址的计算方法如下:
PA = ([DS]/[SS]/[ES])×16 + ([SI]/[DI]/[BX]/[BP]);
寄存器间接寻址方式存取存储器单元的PA的计算方法如图所示:
寄存器间接寻址方式存取存储器单元的原理如图所示: