1、立即寻址 立即寻址 也叫 立即 数 寻址 ,这是一种特殊的 寻址 方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数, 立即寻址方式中,指令操作码和操作数都在存储器代码段中;立即数可以是用 8 位或 16 位二进制补码表示的有符号数。 功能:常用于给寄存器赋初值,只能用于源操作数字段,且源操作数与目的操作数长度应一致。 【例】 MOV AX , 10 执行后( AX ) = ? 该例中源操作数为立即寻址方式,立即数为 10 ,存放在指令的下一单元。 执行: 10 → AX 执行后:( AX ) =000AH 2、寄存器寻址 一般计算机都设置有一定数目的通用寄存器,用以存放操作数,操作数的地址或中间结果。若指令地址码部分给出某一通用寄存器的地址(即寄存器名),而且所需要的操作数就在这一寄存器中,则称为寄存器寻址。 寄存器寻址方式的操作数在指令指明的寄存器中。 【例】下列程序执行后,( AX ) = ?,( BX ) = ? MOV AX , 1234H MOV BX , 5678H ADD AX , BX 该程序中 MOV 指令为数据传送指令操作符, ADD 指令为加法指令操作符,三条指令皆为双操作数指令。第一、二条指令 AX 、 BX 皆为目的操作数地址,为寄存器寻址方式。第三条指令中, AX 为目的操作数地址, BX 为源操作数地址。源地址和目的地址皆为寄存器寻址方式。 执行: 1234H → AX 5678H → BX ( AX ) + ( BX )→ AX 执行后:( AX ) =68ACH ,( BX ) =5678H 3、直接寻址 指令的地址码部分直接给出的不是操作数,而是操作数的存储器地址,这种方式称为直接寻址方式。根据指令地址码部分给出的直接地址 A 就可以从存储器中读出所需要的操作数。这种寻址方式简单,直观,也便于硬件实现,但是随着计算机的存储器容量不断扩大,所需要的地址码越来越长,势必造成指令的一部分,不能修改,故只能用来访问固定存储器单元。 汇编格式:①含有变量的地址表达式。 ②段寄存器名: [EA] 。 功能:指令下一字单元的内容是操作数的有效(偏移)地址 EA 。 【例】寄存器和存储器内容为:( AX ) =1212H , BUF 为数据段定义的变量,其偏移地址是 2000H ,( DS ) =3000H ,( 32000H ) =4545H 。 执行指令: MOV AX , BUF ( MOV AX , [2000H] ) 执行后:( AX ) =? 执行:( 32000H )→ AX 执行后:( AX ) =4545H 4、寄存器间接寻址 寄存器间接寻址方式中,寄存器的内容为操作数的偏移地址 EA,操作数在存储器中,操作数在存储器中,操作数的有效地址用 SI 、 DI 、 BX 和 BP 等四个寄存器之一来指定。 汇编格式: [R] 功能:操作数存放在存储器,寄存器 R 存放操作数的偏移地址 EA 。 在不使用段超越前缀的情况下,有下列规定: 若有效地址用 SI 、 DI 和 BX 等之一来指定,则其缺省的段寄存器为 DS ; 若有效地址用 BP 来指定,则其缺省的段寄存器为 SS( 即:堆栈段 ) 。 例: 假设有指令: MOV BX,[DI] ,在执行时, (DS)=1000H , (DI)=2345H ,存储单元 12345H 的内容是 4354H 。问执行指令后, BX 的值是什么? 解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器 DI 的值不是操作数,而是操作数的地址。该操作数的物理地址应由 DS 和 DI 的值形成,即: PA=(DS)*16+DI=1000H*16+2345H=12345H 。 偏移地址 EA 计算方法如下: EA=[SI] SI 作间址寄存器。 EA=[DI] DI 作间址寄存器。 EA=[BX] BX 作间址寄存器。 EA=[BP] BP 作间址寄存器。 执行指令: MOV AX , [BP] 执行后:( AX ) =? 执行:( 20030H )→ AX 执行后:( AX ) =1234H 【例】寄存器和存储器内容分别为:( AX ) =0 ,( BP ) =0030H ,( SS ) =2000H ,( 20030H ) =1234H |