文章目录[隐藏]
jmp指令为无条件转移指令,可以只修改IP,也可以同时修改CS和IP
jmp指令要给出两种信息:
(1)转移的目的地址。
(2)转移的距离(段间转移、段内短转移,段内近转移)
不同的给出目的地址的方法,和不同的转移位置,对应有不同格式的」mp指令。下面的几节内容中,我们以给出目的地址的不同方法为主线,讲解」mp指令的主要应用格式和CPU执行转移指令的基本原理。
依据位移进行转移的jmp指令
jmp short 标号(转到标号处执行指令)
这种格式的jmp指令实现的段内短转移,它对IP的修改范围为-128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。jmp指令中的“short”符号,说明指令进行的是短转移。jmp指令中的“标号”是代码段中的标号,指明了指令要转移的目的地,转移指令结束后,CS:IP应该指向标号处的指令。如:
assume cs:codesg codesg segment start:mov ax,0 jmp short s add ax,1 s: inc ax codesg ends end start
上面的程序执行后,ax中的值为1,因为执行jmp short s后,越过了add ax,l,IP指向了标号s处的inc ax。也就是说,程序只进行了一次ax加1操作。
汇编指令jmp short s对应的机器指令应该是什么样的呢?我们先看一下别的汇编指令和其相对应的机器指令。
(1)jmp short 标号 (IP)=(IP)+8位位移
这种格式的jmp指令实现的是段内短转移。对ip的修改范围限定为-128~127之间,可以看出正好是一个字节能够表示的范围。
(2)jmp near ptr 标号 (IP)=(IP)+16位位移
于jmp short功能相同,只不过他实现的是段内近转移。简单来说就是转移的距离拉长(虽然仍然是在段内)
注意
可以看到jmp short与jmp near ptr(段内转移)并没有直接将转移的目的地址直接写入机器指令中。而是将一个相对偏移地址写入了机器指令。(但是debug在对应的汇编指令中会看到偏移地址)
具体来说就是将标号地址相对于jmp指令的下一条指令的地址写入了机器指令。
也就是说,cpu在执行jmp指令的时候并不需要转移的目标地址。
实际上," jmp short标号”的功能为:(IP)=(IP)十8位位移。
(1) 8位位移一标号处的地址jmp指令后的第一个字节的地址;
(2) short指明此处的位移为8位位移;
(3) 8位位移的范围为一128127,用补码表示(如果你对补码还不了解,请阅读附
注2);
(4) 8位位移由编译程序在编译时算出。
还有一种和“jmp short标号”功能相近的指令格式,jmp near ptr标号,它实现的是段内近转移。
"jmp near ptr标号”的功能为:(IP)=(IP)+ 16位位移。
(1) 16位位移=标号处的地址jmp指令后的第一个字节的地址;
(2) near ptr指明此处的位移为16位位移,进行的是段内近转移;
(3) 16位位移的范围为一32768^32767,用补码表示;
(4) 16位位移由编译程序在编译时算出。