与转移地址有关的寻址方式
与转移地址有关的寻址方式是用来确定转移及调用指令(如跳转指令 JMP
或调用指令 CALL
)的目标地址的方式 ,这些指令的作用是使程序从当前位置跳转到另一个位置,或者调用一个函数或子程序,然后在执行完跳转或调用指令之后,程序的控制权就会转移到目标地址处
段内寻址
段内直接寻址
直接给出立即数或者符号地址
汇编格式:JMP SHORT QUEST
JMP NEAR PTR PROGIA
转向的有效地址 = (IP) + 位移量(8bit/16bit)
1060:000D EB04 JMP SHORT NEXT
IP当前值→ 1060:000F … …
1060:0011 … …
1060:0013 0207 NEXT: ADD AL,[BX]
CPU在执行JMP
指令时,IP
指向了下一条指令,其值为000F
,JMP SHORT NEXT
指令的机器语言为EB04
,EB
为操作码,04
为位移量,所以转向的有效地址应为:
000F + 0004 = 0013
0013正是标号NEXT
的地址。JMP
指令执行后,将IP
寄存器修改为0013,代码段寄存器CS
不变。紧接着CPU根据CS:IP
的指示,取出1060:0013中的ADD
指令开始执行,这样实现了程序的转移
例题
在 0624H 单元内有一条二字节指令JMP SHORT OBJ
,如其中位移量为 (1) 27H,(2)6BH,(3)0C6H 试问转向地址OBJ
的值是多少?
【解】此时IP寄存器中的值为:(IP) = 0626H
(1) (IP) = 0626H + 27H = 064DH
(2) (IP) = 0626H + 6BH = 0691H
(3) C6H为负数(-3AH),(IP) = 0626H - 3AH = 05ECH
【(3) 分析】在一个字节(8位)的情况下,对于有符号数,其范围是从-128到127(即从 80H 到 7FH),换言之,当一个字节的最高位为1时,这个字节所表示的数值是负数,C6H对应的的十进制数是198,最高位为1,表示的数值是负数,需要计算得其补码,需要进行取反操作,然后再加1,结果为 -3AH
段内间接寻址
转向的有效地址是一个寄存器或存储单元的内容
可以用除立即数以外的任何一种数据寻址方式
汇编格式:JMP BX
JMP WORD PTR TABLE[BX]
JMP WORD PTR [BX][SI]
因为程序的转移仍在同一段内进行,所以只需将IP
修改成新的转向地址,CS不变。段内转移指令中的NEAR PTR是可以缺省的
例题
给定 (IP) = 2BC0H,(CS)=0200H,位移量 D = 5119H ,(BX) = 1200H,(DS) = 212AH,(224A0) = 0600H,(275B9) = 098AH,试为以下的转移地址指令找出转移的偏移地址
(1)使用 BX 及寄存器间接寻址方式的段内间接寻址
(2)使用 BX 及寄存器相对寻址方式的段内间接寻址
【解】 (1) JMP WORD PTR [BX]
PA = 212AH × 16d + (BX) = 224A0H,(IP) = 0600H
(2) JMP WORD PTR D[BX]
PA = 212AH ×16d + (BX) + 5119H = 275B9H,(IP) = 098AH
段间寻址
段间直接寻址
用指令中提供的转向段地址和偏移地址取代 CS 和 IP 寄存器的值
因为是段间转移,CS和IP都要更新,这个新的段地址和偏移地址由指令操作码之后的连续两个字提供,所以只要将指令中提供的转向偏移地址装入IP,转向段地址装入CS,就完成了从一个段到另一个段转移的工作
汇编格式:JMP FAR PTR NEXT
段间间接寻址
用存储器中相继两个字的内容取代 CS 和 IP 寄存器的值
存储单元的地址可用存储器寻址方式得到
汇编格式:JMP DWORD PTR [SI]
JMP DWORD PTR [INTERS+BX]
例题
【例1】
【例2】
参考文章