文档介绍:第3章 80X86指令系统和汇编语言(2)
控制转移指令
在8086程序中,指令执行的顺序是由CS和IP确定的。为了使程序转移到新的地址去执行,可采用改变CS和IP,或者仅改变IP的方法来实现。前者为段间转移(远转移),属性为FAR;后者称为段内转移(近转移或短转移),属性为NEAR或SHORT。无论是段内转移还是段间转移,都有直接转移和间接转移之分。直接转移是转移的目的地址由IP加上指令中的一个8位或16位的位移量形成;间接转移则是转移目的地址间接存储在某一寄存器或内存单元中。
计算转移地址有两种方法:
一种是当前的IP值加一个8位或16位以补码表示的位移量,也就是以当前指令为中心往前或往后转移,称为相对转移;
另一种是以新的值完全代替当前的IP值或CS和IP的值,称为绝对转移。
8086中所有段内直接转移都是相对转移,所有段内和段间的间接转移都是绝对转移。
1. 无条件转移指令
1) 段内直接短转移
格式:JMP SHORT OPR
功能:IP←(IP)+8位位移量,其中8位位移量是CS段内目的地址OPR与JMP指令的下一条指令地址之差,为一个有符号数,只允许在-128~+127字节范围内转移,为相对转移指令。
例如:
…
JMP SHORT HELLO
…
…
HELLO: …
在此程序段中,若JMP指令的当前地址是CS段内0100H,目的地址是010AH,因为该指令的机器代码是E908H,所以8位位移量为010AH-0102H=08H(其中0102H是JMP指令的下一条指令的地址)。
2) 段内直接近转移
格式:JMP NEAR PTR OPR
功能:IP←(IP)+16位位移量。它也是一种相对转移指令。
汇编格式中的OPR可使用符号地址,地址属性NEAR可省略。由于位移量为16位,所以可转移到段内的任何位置。
例如:
…
JMP NEXT ;可省略NEAR属性说明
…
…
NEXT: …
在此程序段中,若JMP指令的当前地址是CS段内0100H,目的地址是1000H,因为该指令的机器代码是EBFD0EH,所以其中16位位移量为1000H-0103H=0EFDH(0103H是JMP指令的下一条指令的地址)。
3) 段内间接转移
格式:JMP WORD PTR OPR
功能:IP←(EA),其中EA的值由OPR的寻址方式确定,它可以使用除立即数寻址以外的任何一种寻址方式。如果指定的是16位寄存器,则把寄存器的内容送到IP中;如果指定的是存储器单元地址,则将该地址单元开始的一个字的内容送到IP中去。
例如:
JMP BX
JMP WORD PTR [BX+25H]
在上面的指令中,若(DS)=2000H,(BX)=0100H,(20100H)=00H,(20101H=01H),(20125H)=34H,(20126H)=12H,
则第一条指令执行的结果是(IP)=0100H,
而第二条指令执行的结果是(IP)=1234H。
4) 段间直接转移
格式:JMP FAR PTR OPR
功能:IP←OPR的段内偏移地址
CS←OPR所在段的段地址
其中OPR在汇编格式中可使用符号地址,如果用数值表达式则要指定转移目标的偏移地址和段地址。这也是一种绝对转移指令。