3.1.1 说明操作数所在地址的寻址方式
1.立即寻址这种寻址方式所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中,如图3.1所示 例:MOV AX,im立即数im可以是8位的,也可以是16位的。若是16位的,则imL在低地址字节,imH在高地址字节。
2.直接寻址
操作数地址的16位段内偏移地址直接包含在指令中,它与操作码一起存放 在代码段区域.操作数一般在数据段区域中,它的地址为数据段寄存器DS
加上 这16位的段内偏移地址,如图3.2所示。 内偏移地址,如图3.2所示。
MOVAX,DS:[200H]指令中的16位段内偏移地址的低字节在前,高字节在后。这种寻址方法以数据段的段地址为基础,故可在多 达64KB的范围内寻找操作数。 本例中,取数的物理地址就是:DS的内容×16(即左移4位), 变为20位,再在其低端16位上加上偏移地址2000H。偏移地址2000H是由指令直接给出的。 3.寄存器寻址 操作数包含在CPU的内部寄存器中,例如AX、BX、CX、DX等,如图3.3所示。
例:MOV DS,AX
虽然操作数可存放在CPU内部任意一个通用寄存器中,而且它们都能参与算术或逻辑运算并存放运算结果,但是,AX是累加器,若将结果存放在AX中的话,通 常指令执
行时间要短一些。 4.寄存器间接寻址 在这种寻址方式中,操作数存放在存贮器中,操作数的16位段内偏移地址却放在以下4个寄存器SI、DI、BP、BX中之一。由于上述4
个寄存器所默认的段寄存器不同, 这样又可以分成两种情况: ①若以SI、DI、BX进行间接寻址,则操作数通常存放在现行数据段中。此时数据段寄存器内容加上SI、
DI、BX中的16位段内偏移地址,即得操作数的地址,如图3.4所示。 例:MOV AX,[SI]
②若以寄存器BP间接寻址,则操作数存放在堆栈段区域中。此时堆栈 段寄存器内容加上BP中的16位段内偏移地址,即得操作数的地址,如图3.5所示。 例:MOV AX, [BP]
5.寄存器相对寻址
在这种寻址方式中,操作数存放在存贮器中。操作数的地址是由段寄存 器内容加上SI、DI、BX、BP之一的内容,再加上由指令中所指出的8位或16 位相对地址偏移量而
得到的,如图3.6所示。 在一般情况下,若用SI、DI或BX进行相对寻址时,以数据段寄存器DS作为地址基 准,而用BP寻址时,则以堆栈段寄存器作为地址基准。
例:MOV AX,DISP[SI]
6. 基址、变址寻址 在8088中,通常把BX和BP作为基址寄存器,而把SI、DI作为变址寄存器。这两种寄存器联合起来进行的寻址就称为基址、变址寻址。这时,操作数的 地址应该是段寄存器内容加上基址寄存器内容(BX或BP内容),再加上变址寄存器内容(SI或DI内容)而得到的,如图3.7所示。 同理,若用BX作为基地址,则操作数应放在数据段DS区域中;若用BP作为基地址,则操作数应放在堆栈段SS区域中。 例:MOV AX,[BX][SI]
7. 基址、变址、相对寻址 这种方式实际上是第6种寻址方式的扩充。即操作数的地址是由基址、变址方式得到的地址再加上由指令指明的8位或16位的相对偏移地址而得到的, 如图3.8所示。 例:MOV AX,DISP [BX] [SI] 8. 隐含寻址 在有些指令的指令码中,不仅包含有操作码信息,而且还隐含了操作数地址的信息。例如乘法指令MUL的指令码中只需指明一个乘数的地址, 另一个乘数和积的地址是隐含固定的。这种将操作数的地址隐含在指令操作码中的寻址方式就称为隐含寻址。
3.1.2 说明转移地址的寻址方式 1. 段内相对寻址 在这种寻址方式中,指令应指明一个8位或16位的相对地址位移量DISP(它有正负符号,用补码表示)。此时,转移地址应该是代码段寄 存器CS内容加上指令指针IP内容,再加上相对地址位移量DISP,如图3.9所示。 例:JMP DISP1 图3.9中,1000H是CPU读取这条指令的位移量50H后IP的内容。所以,该指令使CPU转向21050H去执行。
2. 段内间接寻址 在这种寻址方式中,转移地址的段内偏移地址要么存放在一个16位的寄存器中;要么存放在存贮器的两个相邻单元中。存放偏移地址的 寄存器和存贮器的地址将按指令码中规定的寻址方式给出。此时,寻址所得到的不是操作数,而是转移地址,如图3.10所示。 例:JMP CX JMP WORDPTR [BX] 3. 段间直接寻址 在这种寻址方式中,指令码中将直接给出16位的段地址和16位的段内偏移地址。 例:JMP FAR PTR ADD1 在执行这条段间直接寻址指令时,指令操作码后的第二个字将赋予代码段寄存器CS,第一个字将赋予指令指针寄存器IP。 最后CS内容和IP内容相加则得转移地址,如图3.11所示。 4. 段间间接寻址 这种寻址方式和段内间接寻址相似。但是,由于确定转移地址需要32位信息,因此只适用于存贮器寻址方式。用这种寻址方式 可计算出存放转移地址的存贮单元的首地址,与此相邻的4个单元中,前两个单元存放16位的段内偏移地址;而后两单元存放的 是16位的段地址,如图3.12所示。 例:JMP DWORD PTR[BP][DI]