1:分类
-
只修改IP时,称为段内转移,比如jmp ax。
由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移。
短转移:-128-127
近转移:-32768-32767
-
同时修改CS和IP时,称为段间转移。
2:相关指令
-
offset操作符,取得标号的逻辑地址。
mov ax,offset s
-
段内短转移,转移范围为(-128-127)
jmp short 标号
注意,这个标号并不是目标代码段的逻辑地址,而是距离当前代码地址的偏移量。由8位位移组成,所以其范围是-128-127。jcxz 标号
所有条件转移指令都是短转移。当CX=0时,(IP)=(IP)+8。loop 标号
如果CX≠0,则跳转,否则,CX=CX-1
- 段内近转移,转移范围为(-32768-32767)
jmp near 标号
jmp 寄存器 ;只修改IP
jmp word ptr 内存单元地址
示例,这段程序执行后ip被修改为0123h
mov ax,0123h mov ds:[0],ax jmp word ptr ds:[0]
同上,不过这儿的偏移量是16位的标号,所其范围是-32768-32767
- 段间转移(CS:标号所在段的段地址 IP:标号在段中的偏移地址)
jmp far ptr 标号
jmp dword ptr 内存单元地址
示例,这段程序执行后CS=0,ip=1234h
mov ax,1234h mov ds:[0],ax mov ds:[2],0 jmp dword ptr ds:[0]
3:一个奇怪的程序
assume cs:codesg codesg segment mov ax,4c00h int 21h start: mov ax,0 s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:[si] mov cs:[di],ax s0: jmp short s s1: mov ax,0 int 21h mov ax,0 s2: jmp short s1 nop codesg ends end start