JMP指令
<h2>JMP指令:跳转指令</h2>
<h4>功能等同于 <code>MOV EIP</code></h4>
<h3>用法:</h3>
<p>```c++
jmp short 标号
jmp near ptr 标号
jmp far ptr 标号
jmp 16位reg
jmp word ptr 内存单元地址
jmp dword ptr 内存单元地址</p>
<pre><code>--------------------
---
### jmp short 标号
段内短转移
对IP的修改范围是-128~127
向前 移动时可以最多越过128个字节,向后 移动可以最多越过127个字节
依据位移进行转移,转移指令结束后,CS:IP指向标号处的指令
(IP)=(IP)+8位位移
```c
8位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址
8位位移的范围是:-128~127
8位位移使用 补码 形式表示</code></pre>
<h3>依据位移进行转移,跳转到标号s处开始执行指令</h3>
<pre><code class="language-c">assume cs:codesg
codesg segment
start: mov ax,0
mov bx,0
jmp short s
add ax,1
s: inc ax
codesg ends
end start </code></pre>
<hr />
<hr />
<h3>jmp near ptr 标号</h3>
<pre><code>段内近转移
(IP)=(IP)+16位位移</code></pre>
<pre><code class="language-c">(CS) = 标号所在段的段地址
(IP) = 标号在段中的偏移地址</code></pre>
<pre><code>依据段地址和偏移地址进行转移</code></pre>
<pre><code class="language-c">assume cs:codesg
codesg segment
start: mov ax,0
mov bx,0
jmp far ptr s
db 256 dup (0)
s: add ax,1
inc ax
codesg ends
end start</code></pre>
<h4>读出目的段地址和目的偏移地址</h4>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/087e3b334b23c148f1045e6e031fd2f8" alt="" /></p>
<pre><code class="language-c">0B016A07
0B
01
-----
010B 目的偏移地址
6A
07
----
076A 目的段地址
CS:IP 指向 076A:010B</code></pre>
<hr />
<hr />
<p>jmp 16位reg</p>
<pre><code>jmp 某一合法寄存器 : 用寄存器中的值修改IP寄存器中的值</code></pre>
<pre><code class="language-c">jmp ax
指令执行前 ax=1000H CS=2000H IP=0003H
指令执行后 ax=1000H CS=2000H IP=1000H
IP寄存器中的值被修改成和ax一样的了</code></pre>