寻址方式指指令中操作数的表示方式
//缩写对照
i: immediate
r/reg:register
m/ mem : memory
LA:LOGICAL ADDRESS
EA: EffectiveAddress
PA: physicaladdress
1、立即寻址
MOV AX,1023H
指令中给出操作数(整数或表达式,以字母开头的16进制数前必须以数字0作为前缀)
2、寄存器寻址
MOV AX,BX
MOV DS,AX
寄存器内操作,速度快
对应的位数要一致
两个操作数不能同为段寄存器
目的操作数不能是代码段寄存器
3、存储器寻址(MEMORY ADDRESSING)
//段的起始地址形式为xxxx0H,称为段基址。前16位为段基值,存放在段寄存器中。
寻址三步:求址、取值、赋值
直接寻址(Direct Addressing):[ i] ;如[2000H] ;
(默认在数据段DS,有的汇编要指定段,如:DS:[2000H])
寄存器间接寻址(Register Indirect Addressing):[ R ] ;
4种:[BX]、[BP]、[SI]、[DI] ([BP]没有,也不算错。寄存器中存放地址)
寄存器相对寻址(Register Relative Addressing):[R+i] ;
4种:[BX+i]、[BP+i]、[SI+i]、[DI+i]
基址变址寻址(Base Indexed Addressing):[R1+R2];
4种:[BX+SI]、[BX+DI]、[BP+SI]、[BP+DI]
基址变址相对寻址(Relative Based Indexed Addressing):[R1+R2+i] ;
4种:[BX+SI+i]、[BX+DI+i]、[BP+SI+i]、[BP+DI+i](EA是一个基址寄存器内容,一个变址寄存器内容和一个8位或16位的位移量Disp8或Disp16三部分之和。自由度最多,最灵活)
示例:
MOV AX, 2000H
MOV DS, AX //立即数赋值DS没有对应机械码
MOV AX,[0130H] //默认数据段PA=DSX10H+EA
取16位数,当前地址对应低八位,地址加1对应高八位
4、端口寻址
专用指令IN OUT
端口直接寻址;(0 ~ FFH)
外设端口的地址以8位立即数的形式直接出现在指令中
例:IN AL,36H ; 从36H端口输入一个八位数据到AL寄存器
端口间接寻址:
寄存器只能用DX
外设端口的地址先存入DX寄存器,然后再出现在指令中(端口地址超过8位必须间接寻址)
例:OUT DX,AL 将AL的内容送至DX给出的I/O口
5、其他寻址
隐含寻址:(隐含了操作数)
如:DAA;(隐含操作数:AL)
MOVSW;(隐含操作数:[SI],[DI])
转移寻址:(给出转移地址,如:JMP L,CALL m )
段内直接寻址:IP ←IP+i;(i补码)
段内间接寻址:IP←r 或I P←m ;(需2个字节)
段间直接寻址:CS:IP ←L;(L远标号)
段间间接寻址:CS:IP ←m;(需4个字节)