汇编微机中的主要寻址方式
寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。
在汇编语言中,主要用到的有7种寻址方式:
立即寻址:所提供的操作数直接包含在指令中,紧跟在操作码之后,它作为指令的一部分。
立即数可以是8位的,也可以是16位的,也可以是带单引号的字符。
eg:
MOV BL,80H
MOV AX,1000H
MOV AL,‘A’
寄存器寻址:寄存器寻址方式的操作数存放在指令规定的寄存器中,寄存器的名字在指令中指出。
对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP或BP。
对于8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH或DL。
寄存器寻址不需要访问存储器来取得存储数,所以有较高的运行速度。
eg:
MOV CL,DL
MOV AX,BX
存储器寻址:存储器寻址方式的操作数存放在存储单元中。
● 位移量(Displacement):它是存放在指令中的一个8位或16位的数,但它不是立即数,而是一个地址。
● 基址(Base Address):它是存放在基址寄存器BX或BP中的内容。
● 变址(Index Addess):它是存放在变址寄存器SI或DI中的内容。
1. 直接寻址:参与操作的数据的偏移地址写在指令中,而操作数在内存中,EA=位移量
eg:
MOV AX,[1234H]
MOV AX,TABLE (TABLE是变量)
MOV AX,[TABLE]
这三条指令都是直接寻址,后两条都是把TABLE指示的地址单元的值送入AX中
2. 寄存器间接寻址:把参与操作数的数据的偏移地址写在寄存器中,而操作数在内存中。
偏移地址通过操作数间接给出,可用的寄存器只能为BX、BP、SI、DI
eg:
MOV AX,[SI]
MOV [BX],AL
如果(DS)]=3000H,(SI)=2000H,(BX)=1000H,(AL)=64H,则上述两条指令的执行情况如图所示。执行结果为:(AX)=4050H,(31000H)=64H。
3. 寄存器相对寻址把参与操作数的偏移地址写在寄存器和一个相对位移量中,而操作数在内存中。
允许段超越(选择一个地址需要用段地址加偏移量来选择,如果偏移量超过了这个段,到了别的段里了,这时就叫段超越。)
eg:
MOV AL,TABLE[SI]
MOV [SI+10H],AX
MOV CX,[BX+COUNT]
如果(DS)=3000H,(SI)=2000H,(BX)=1000H,COUNT=1050H,(AX)=4050H,则后两条指令执行情况如图所示。执行结果为:(32010H)=4050H,(CX)=4030H
4. 基址变址寻址:用一个基址寄存器(BX和BP)和一个变址寄存器(DI和SI)的值相加,计算结果作为操作数的偏移地址。
允许段超越。
[BX+BP]和[DI+SI]是非法搭配。
根据基址寄存器确定段寄存器,BP对应SS,BX 对应DS。
eg:
MOV [BX+DI],AX
MOV AH,[BP][SI]
设当前(DS)=3000H,(SS)=4000H,(BX)=1000H,(DI)=1100H,(AX)=0050H,(BP)=2000H,(SI)=1200H,则指令的执行情况如所示。执行结果为:(32100H)=0050H,(AH)=56H
5.相对基址变址寻址:用一个基址寄存器(BX和BP)和一个变址寄存器(DI和SI)的值相加,再加一个相对量,将计算结果作为操作数的偏移地址。
允许段超越
[BX+BP]和[SI+DI]是非法搭配
BP对应SS,BX对应DS
eg:
MOV AH,[BX+DI+1234H]
MOV [BP+SI+DATA],CX
若(DS)=4000H,(SS)=5000H,(BX)=1000H,(DI)=1500H,(BP)=2000H,(SI)=1050H,(CX)=2050H,DATA=10H,则指令执行情况如图4.8所示。执行结果为:(AH)=64H,(53060H)=2050H
基址变址相对寻址方式也可以表示成下列几种方式:
MOV AX,[BX+SI+COUNT]
MOV AX,[BX][SI +COUNT]
MOV AX,[BX+SI]COUNT
MOV AX,[BX][SI]COUNT
MOV AX,COUNT[BX][SI]
但是在8086/8088指令系统中的寻址方式中,除上述外,还包括:
I/O端口寻址方式:
(1) 端口直接寻址方式:对这种寻址方式,端口地址用8位立即数(0~255)表示。
eg:
IN AL,11H
(2)端口间接寻址方式:当I/O端口地址大于FFH时,必须事先将端口地址存放在DX寄存器中。
eg:
MOV DX,120H
OUT DX,AX
地址寻址方式:就是找出程序转移的地址。
(1)段内直接寻址方式:(相对寻址方式)
转移的地址=(IP)+位移量(8或16)。
这种寻址方式适用于无条件或条件转移类指令。
条件转移指令只能使用段内直接寻址的8位位移量
格式:
JMP NEAR PTR PROGIA
JMP SHORT QUEST
(2)段内间接寻址方式:
格式:
JMP CX
JMP WORD PTR [BP+TABLE]
其中WORD PTR为操作符,用以指出其后的寻址方式所取得的目标地址是一个字的有效地址。
(3)段间直接寻址方式
这种寻址方式是在指令中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP的内容。
格式:
JMP LABEL_NAME`
其中,LABEL_NAME是一个在另外的代码段内已定义的远标号。指令的操作是用标号的偏移地址取代指令指针寄存器IP的内容,同时用标号所在段的段地址取代当前代码段寄存器CS的内容,结果使程序转移到另一代码段内指定的标号处。
(4)段间间接寻址方式
由指令中给出的存储器寻址方式求出存放转移地址的四个连续存储单元的地址。指令的操作是将存储器的前两个单元的内容送给IP,后两个单元的内容送给CS,以实现到另一个段的转移。
eg:
JMP VAR_DOUBLEWORD
JMP DWORD PTR[BP][DI]
上面第一条指令中,VAR_DOUBLEWORD应是一个已定义为32位的存储器变量;
第二条指令中,利用运算符PTR将存储器操作数的类型定义为DWORD(双字)。