转移指令
- 转移指令:可以控制CPU执行内存中某处的代码的指令。
8086CPU的转移行为分为:
¥. 只修改IP时,称为段内转移,如:jmp ax。
*短转移:IP的修改范围-128——127
*近转移:IP的修改范围-32768——32767
¥.同时修改CS和IP 时,称为段间转移,如:jmp 1000:0。
8086CPU的转移指令分为:
-
无条件转移指令(如:jmp)
-
条件转移指令
-
循环指令(如:LOOP)
-
过程
-
中断
- offset操作符,在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
Mov ax,offset start ;取得标号start的偏移地址,送ax
- 依据位移进行转移的JMP指令
Jmp short 标号 (转到标号处执行指令)
实现的是段内转移,它向前转移时可以最多超过128个字节,向后转移可以最多越过127个字节。
“标号”是代码段中的标号,指明了指令要转移的目的地,转移指令结束后,CS:IP应该指向标号处的指令。
- 指令“jmp short 标号”的功能为:(IP)=(IP)+8位位移
(1)8位位移=“标号”处的地址-jmp指令后的第一个字节的地址;
(2)short指明此处的位移为8位位移;
(3)8位位移的范围为-128——127,用补码表示;
(4)8位位移由编译程序在编译时算出。
- 指令“jmp near ptr 标号”功能:(IP)=(IP)+16位位移
(1)16位位移=“标号”处的地址-jmp指令后的第一个字节的地址;
(2)near ptr指明此处的位移为16位位移,进行的是段内近转移;
(3)16位位移的范围为-32768——32767,用补码表示;
(4)16位位移由编译程序在编译时算出。
-
转移的目的地址在指令中的JMP指令
指令“jmp far ptr 标号”实现段间转移,又称为远转移。功能:
(CS)=标号所在段的段地址;
(IP)=标号在段中的偏移地址。
-
转移地址在寄存器中的JMP指令
指令格式:jmp 16位寄存器
功能:(IP)=( 16位寄存器)
-
转移地址在内存中的JMP指令
(1)jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址开始存放着一个字,是转移的目的偏移地址,内存单元地址可用寻址方式的任一格式给出 ``` 如:Jmp word ptr ds:[0] Jmp word ptr [bx] ```
(2)jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。 (CS)=(内存单元地址+2) (IP)=(内存单元地址)内存单元地址可用寻址方式的任一格式给出。 ``` 如:mov ax,0123h Mov [bx],ax Mov word ptr [bx+2],0 Jmp dword ptr [bx] 执行后,(CS)=0,(IP)=0123H,CS:IP指向0000:0123。 ```
-
loop指令 循环指令
所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都是:-128——127.
指令格式:loop 标号((cx)=(cx)-1,如果(cx)≠0,转移到标号处执行。)
操作:1.(cx)=(cx)-1;
2. 如果(cx)≠0,(IP)=(IP)+8位位移。
如果(cx)=0,什么也不做(程序向下执行)
相当于:(cx)- -;
If((cx) ≠0)jmp short 标号;