汇编寻址方式总结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、直接寻址方式
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式 。 在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址 直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。 例3.1 假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指 令执行后,BX的值是什么? 解:根据直接寻址方式的寻址规则,把该指令的具体执行过程用图3.2来表示。 从图3.2中,可看出执行该指令要分三部分: 图3.2 直接寻址方式的存储和执行示意图 3.1、由于1234H是一个直接地址,它紧跟在指令的操作码之后, 随取指令而被读出; 3.2、访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加, 得存储单元的物理地址:21234H; 3.3、取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。 所以,在执行该指令后,BX的值就为5213H。 由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据, 可在指令中用段前缀的方式显式地书写出来。 下面指令的目标操作数就是带有段前缀的直接寻址方式。
MOV ES:[1000H], AX 直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进 行寻址。 注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序 中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。 试比较下列指令中源操作数的寻址方式(VARW是内存字变量): MOV AX, 1234H MOV AX, [1234H] ;前者是立即寻址,后者是直接寻址 MOV AX, VARW MOV AX, [VARW] ;两者是等效的,均为直接寻址
2、寄存器寻址方式
指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使 用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:
2.1、8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等; 2.2、16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等; 2.3、32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式
如:ADD VARD, EAX ADD VARW, AX
MOV VARB, BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。在第4章将会学到如何定 义它们。
2、目的操作数是寄存器寻址方式
在指令中,指定操作数或操作数存放位置的方法称为寻址方式。操作数的各种寻址方式是用 汇编语言进行程序设计的基础,也是本课程学习的重点之一。
微机系统有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器 间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式等。 其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实 现对数组元素的访问。
4、寄存器间接寻址方式
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这 种寻址方式为寄存器间接寻址方式。该寻址方式物理地址的计算方法如下:
寄存器间接寻址方式读取存储单元的原理如图3.3所示。 图3.3 读取操作数过程的示意图 在不使用段超越前缀的情况下,有下列规定: 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。 例3.2 假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元 12345H的内容是4354H。问执行指令后,BX的值是什么? 解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是 操作数的地址。该操作数的物理地址应由DS和DI的值形成,即: PA=(DS)*16+DI=1000H*16+2345H=12345H。 所以,该指令的执行效果是: 把从物理地址为12345H开始的一个字的值传送给BX。 其执行过程如右图3.4所示。
如:ADD BH, 78h
ADD AX, 1234h
MOV EBX, 12345678H等。
3、源和目的操作数都是寄存器寻址方式
如:MOV EAX, EBX
MOV AX, BX
MOV DH, BL等。
由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过 程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速 度。通常情况下,我们提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也 不要把它绝对化。
操作数的寻址方式
操作数是指令或程序的主要处理对象。如果某条指令或某个程序不处理任何操作数,那么, 该指令或程序不可能有数据处理功能。在CPU的指令系统中,除NOP(空操作指令)、HLT(停 机指令)等少数指令之外,大量的指令在执行过程中都会涉及到操作数。所以,在指令中如何 表达操作数或操作数所在位置就是正确运用汇编指令的一个重要因素。
其中:内存单元B1、W1和D1分别是字节ห้องสมุดไป่ตู้字和双字单元。
以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二 操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。
立即数寻址方式通常用于对通用寄存器或内存单元赋初值。图3.1是指令“MOV AX, 4576H” 存储形式和执行示意图。
另外,在32位微机系统中,为了扩大对存储单元的寻址能力,增加了一种新的寻址方式—— 32位地址的寻址方式。 为了表达方便,我们用符号“(X)”表示X的值,如:(AX)表示寄存器AX的值。
1、立即寻址方式
操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称 为立即数寻址方式。
立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那 么,它将按“高高低低”的原则进行存储。例如:
MOV AH, 80H MOV B1, 12H
ADD AX, 1234H MOV W1, 3456H
MOV ECX, 123456H ADD D1, 32123456H