前言
CPU的寻址方式是指CPU在访问内存或寄存器中的数据时所采用的方法。以下是几种常见的寻址方式:
立即寻址
- 定义:操作数直接包含在指令中,紧跟在操作码之后。
- 举例:在指令“MOV AX, 1234H”中,“1234H”就是立即数,它直接被赋给寄存器AX。这种寻址方式的优点是速度快,因为不需要额外的内存访问来获取操作数。
寄存器寻址
- 定义:操作数存放在CPU的寄存器中,指令中直接指定寄存器的名称。
- 举例:“MOV BX, CX”指令,就是将寄存器CX中的值传送到寄存器BX中。由于寄存器位于CPU内部,访问速度非常快,所以寄存器寻址方式能提高指令的执行效率。
直接寻址
- 定义:指令中直接给出操作数的内存地址。
- 举例:假设指令“MOV AX, [1000H]”,它表示将内存地址1000H处的字数据传送到AX寄存器中。这种寻址方式可以直接访问内存中的特定位置,但地址是固定的,灵活性相对较差。
间接寻址
- 定义:指令中给出的是一个寄存器或内存单元的地址,而操作数的实际地址则存放在这个寄存器或内存单元中。
- 举例:常见的间接寻址有寄存器间接寻址和存储器间接寻址。在寄存器间接寻址中,如“MOV AX, [BX]”,BX寄存器中存放的是操作数的内存地址,CPU先从BX中取出地址,再根据该地址到内存中读取数据送入AX。存储器间接寻址与之类似,只是间接地址是存放在内存中的某个单元。
变址寻址
- 定义:将一个基址寄存器(如BX、BP)的值与一个变址寄存器(如SI、DI)的值相加,再加上指令中给出的偏移量,得到操作数的有效地址。
- 举例:“MOV AX, [BX + SI + 10H]”,就是将BX与SI的值相加,再加上10H,得到的地址所对应的内存单元中的数据传送给AX。变址寻址常用于访问数组等数据结构,通过改变变址寄存器的值,可以方便地访问数组中的不同元素。
相对寻址
- 定义:以程序计数器(PC)的值为基地址,加上指令中给出的偏移量来确定操作数的地址。
- 举例:在一些跳转指令中经常使用相对寻址。例如,“JMP SHORT LABEL”,其中“SHORT”表示短跳转,指令会根据当前PC的值加上一个8位的偏移量,跳转到指定的“LABEL”处执行。相对寻址的优点是程序在内存中可以灵活地浮动,因为地址是相对PC的,而不是绝对地址。
基址加变址寻址
- 定义:将基址寄存器的值与变址寄存器的值相加,再加上指令中给出的偏移量,得到操作数的有效地址。这是变址寻址的一种扩展,使用两个寄存器来更灵活地确定操作数地址。
- 举例:“MOV AX, [BX + DI + 20H]”,先将BX和DI的值相加,再加上20H,得到的地址就是操作数的地址,然后将该地址处的数据传送给AX。这种寻址方式在复杂的数据结构访问中非常有用,可以通过基址寄存器和变址寄存器的不同组合来访问不同的数据元素。
例题
cpu要执行的指令是 MOV R1, #45
,(即讲数值45传送到寄存器R1中)在这个过程中用到了哪两种寻址方式?
MOV R1, #45
通常仅使用了立即寻址方式,但如果非要认为它用到了两种寻址方式,可从广义角度理解为包含立即寻址和寄存器寻址,以下为你详细解释:
立即寻址
- 原理:立即寻址是指操作数直接包含在指令中,指令执行时,CPU直接从指令中获取操作数,无需额外的内存访问操作。
- 结合指令分析:在指令
MOV R1, #45
里,#45
明确表示这是一个立即数,也就是操作数直接在指令中给出。CPU在执行这条指令时,能够直接从指令中读取到45
这个值,不需要再到内存或者其他地方去查找,所以体现了立即寻址的特点。
寄存器寻址
- 原理:寄存器寻址是指操作数存放在CPU的寄存器中,指令中直接指定寄存器的名称,通过访问该寄存器来获取或存放操作数。
- 结合指令分析:指令中的
R1
是一个寄存器,该指令的目的是把立即数45
传送到寄存器R1
中。这意味着操作的目标是一个寄存器,在指令执行过程中,CPU需要访问寄存器R1
来完成数据的传送操作,所以从目标操作数的角度来看,它涉及到了寄存器寻址。
综上所述,从源操作数(立即数 45
)角度体现了立即寻址,从目标操作数(寄存器 R1
)角度体现了寄存器寻址。不过在实际的指令分类中,一般还是将 MOV R1, #45
归类为立即寻址指令。