二、立即寻址
在立即寻址方式中,立即操作数可以是8位或16位,并且是指令的一部分。立即数据总是紧跟在指令操作码之后并和操作码一起存放在代码段中,因而立即数据总是和操作码一起被放入BIU中的指令队列里,在指令执行时不需再存取存储器。
汇编格式:n (n为立即操作数)
功能:指令下一单元的内容为操作数n。
立即寻址的寻址方式如图所示: <br>
对立即寻址方式,我们可和寄存器寻址比较学习。首先这两种寻址方式都不需要访问内存,这是它们之间的共同点,其次,立即寻址的操作数就在代码段里的操作码之后,是指令的一部分,而寄存器寻址的操作数则放在指令规定的寄存器中。
例:?2003年4月考题
根据下面定义的数据段:
DSEG SEGMENT
DAT1 DB ‘1234‘
DAT2 DW 5678H
ADDR EQU DAT2-DAT1
DSEG ENDS
执行MOV AX,ADDR指令后,AX寄存器中的内容是:
(A)5678H (B)7856H
(C)4444H (D)0004H
答案:D
内存分配示意图: <br>
分析:首先根据题目定义的数据段画出内存分配示意图,画图时要注意字符在内存中是以ASCII码的形式存放,同时标出每个存储单元的偏移地址(EA),在相应的存储单元标出变量名。从内存分配示意图,我们可知DAT1和DAT2的EA分别为0和4,因此表达式DAT2-DAT1的值为4。指令EQU是符号定义伪指令,则ADDR为一个符号常量,代表4。MOV AX,ADDR指令中的源操作数ADDR是立即寻址,执行后就是把4的传给AX。所以答案选D。
立即寻址方式主要用来给寄存器或存储器赋初值,也可以与寄存器操作数或存储器操作数进行算术逻辑运算。采用立即寻址方式不仅能简化数据的存取,而且可使指令的书写直观、清晰。在程序设计中,立即寻址方式使用得相当多。
三、直接寻址
在直接寻址方式中,操作数的偏移地址(EA)是指令的一部分,它与操作码一起存放在代码段中,而操作数可以存放在数据段,也可以存放在其他段。操作数的物理地址(PA)由其所在段的段寄存器内容左移4位与指令中给出的偏移地址(EA)相加形成。
汇编格式:含有变量的地址表达式或段寄存器名:[EA]
功能:指令下一字单元的内容是操作数的偏移地址EA。
PA=(段寄存器)×10H+EA
直接寻址的寻址方式如图所示:
这种寻址方式和前两种的最大的区别就是:指令执行时需要再存取存储器,也就是存取操作数时需要访问内存,而前两种寻址方式存取操作数时不需要访问内存。
例:?2003.4三级PC考题?
若有BUF DW 1、2、3、4,则可将数据02H取到AL寄存器中的指令是
(A)MOV AL, BYTE PTR[BUF+1]
(B)MOV AL, BYTE PTR[BUF+2]
(C)MOV AL, BYTE PTR [BUF+3]
(D)MOV AL,BUF[2]
答案:B
分析:根据数据定义伪指令BUF DW 1、2、3、4画出内存分配示意图,在存储单元相应位置标出变量名和EA。答案D中目的操作数AL的类型为字节,而源操作数BUF[2]前无BYTEPTR,则BUF[2]类型为字,两个操作数的类型不一致,指令是错误的,因此答案D可排除。变量BUF的EA为0,数据02H在内存中的EA为2。答案ABC中指令的源操作数都是直接寻址,而只有[BUF+2]的EA为2,所以选B。
分配示意图:
分析:根据数据定义伪指令BUF DW 1、2、3、4画出内存分配示意图,在存储单元相应位置标出变量名和EA。答案D中目的操作数AL的类型为字节,而源操作数BUF[2]前无BYTEPTR,则BUF[2]类型为字,两个操作数的类型不一致,指令是错误的,因此答案D可排除。变量BUF的EA为0,数据02H在内存中的EA为2。答案ABC中指令的源操作数都是直接寻址,而只有[BUF+2]的EA为2,所以选B。
到目前为止,我们已经复习了寄存器寻址、立即寻址、直接寻址这三种寻址方式。前面三种寻址方式相对来说容易理解和掌握,而后四种寻址方式的操作数都存放在内存储器中,而且其汇编格式有相似之处,容易混淆。
四种寻址方式中操作数都存放在内存储器中这一特点,而要访问内存储器存放操作数的存储单元,则需要知道存放操作数的存储单元在内存储器中的偏移地址(EA)。寻址方式的重要区别就是得到EA的方式不同。只要掌握如何计算通过这四种寻址方式得到的内存操作数的偏移地址,问题就迎刃而解了。
4.寄存器间接寻址
寄存器间接寻址得到的操作数存放在内存储器中,而操作数的偏移地址EA在指令指明的寄存器中,即寄存器的内容为操作数的偏移地址EA。
汇编格式:[R] R(Register 寄存器的简写,只能是SI,DI,BX,BP其中之一) <br>
功能:R的内容为操作数的偏移地址EA。即操作数的有效地EA存放在基址寄存器(BX或BP)或变址寄存器(DI或SI)中:
EA= [R] 用R作间接寻址寄存器时。
寄存器间接寻址的寻址方式如图所示:
若用寄存器SI,DI,BX间接寻址,则操作数在当前数据段中。
PA=(DS)×10H+EA
若用寄存器BP间接寻址,则操作数在当前堆栈段中。
PA=(SS)×10H+EA
寄存器间接寻址和寄存器寻址在汇编格式上相比较多了个中括号,也就是因为这样,他们的寻址方式截然不同,寄存器寻址不需访问内存,操作数就在指令指定的寄存器中,而寄存器间接寻址需要访问内存,操作数的偏移地址EA就是寄存器的内容。
例:?2002.8三级PC考题?