汇编 CALL和RET指令
有勇气的牛排
1205
网络、逆向、汇编
2021-07-11 15:19:47
1 ret 和 retf
call 和 ret 指令都是转移指令,他们都修改ip,或同时修改cs和ip,他们经常被共同用来实现子程序的设计。
-
ret
:该指令用栈中的数据,修改ip
的内容,从而实现近转移
。
CPU执行ret指令时,进行下面两步操作
(1) (IP)=((ss)*16+(sp))
(2) (sp)=(sp)+2
相当于:
pop IP
-
retf
:该指令用栈中的数据,修改cs
和ip
的内容,从而实现远转移
。
CPU执行retf指令时,进行下面4步操作:
(1) (IP)=((ss)*16+(sp))
(2) (sp)=(sp)+2
(3) (cs)=((ss)*16+(sp))
(4) (sp)=(sp)+2
相当于:
pop IP
pop CS
2 call 指令
call 标号(将当前的IP压栈后,转到标号处指令指令)
CPU 执行此种格式的call时,进行如下操作
(1) (sp)=(sp)-2
((ss)*16+(sp))=(IP)
(2) (IP)=(IP)+16位位移
“call 标号”时 相当于:
push IP
jmp near ptr 标号
<h2><a id="1_ret__retf_1"></a>1 ret 和 retf</h2>
<p>call 和 ret 指令都是转移指令,他们都修改ip,或同时修改cs和ip,他们经常被共同用来实现子程序的设计。</p>
<ol>
<li>
<p><code>ret</code>:该指令用栈中的数据,修改<code>ip</code>的内容,从而实现<code>近转移</code>。</p>
<pre><div class="hljs"><code class="lang-c">CPU执行ret指令时,进行下面两步操作
(<span class="hljs-number">1</span>) (IP)=((ss)*<span class="hljs-number">16</span>+(sp))
(<span class="hljs-number">2</span>) (sp)=(sp)+<span class="hljs-number">2</span>
相当于:
pop IP
</code></div></pre>
</li>
<li>
<p><code>retf</code>:该指令用栈中的数据,修改<code>cs</code>和<code>ip</code>的内容,从而实现<code>远转移</code>。</p>
<pre><div class="hljs"><code class="lang-c">CPU执行retf指令时,进行下面<span class="hljs-number">4</span>步操作:
(<span class="hljs-number">1</span>) (IP)=((ss)*<span class="hljs-number">16</span>+(sp))
(<span class="hljs-number">2</span>) (sp)=(sp)+<span class="hljs-number">2</span>
(<span class="hljs-number">3</span>) (cs)=((ss)*<span class="hljs-number">16</span>+(sp))
(<span class="hljs-number">4</span>) (sp)=(sp)+<span class="hljs-number">2</span>
相当于:
pop IP
pop CS
</code></div></pre>
</li>
</ol>
<h2><a id="2_call__25"></a>2 call 指令</h2>
<p>call 标号(将当前的IP压栈后,转到标号处指令指令)</p>
<pre><div class="hljs"><code class="lang-c">CPU 执行此种格式的call时,进行如下操作
(<span class="hljs-number">1</span>) (sp)=(sp)<span class="hljs-number">-2</span>
((ss)*<span class="hljs-number">16</span>+(sp))=(IP)
(<span class="hljs-number">2</span>) (IP)=(IP)+<span class="hljs-number">16</span>位位移
“call 标号”时 相当于:
push IP
jmp near ptr 标号
</code></div></pre>
留言