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( 即:堆栈段 ) 。
例: 假设有指令: movbx,[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