﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-一个人的战争</title><link>http://www.cppblog.com/401074567/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 20:22:25 GMT</lastBuildDate><pubDate>Tue, 09 Jun 2026 20:22:25 GMT</pubDate><ttl>60</ttl><item><title>enter指令分析</title><link>http://www.cppblog.com/401074567/archive/2011/05/22/146899.html</link><dc:creator>凝霜</dc:creator><author>凝霜</author><pubDate>Sun, 22 May 2011 01:58:00 GMT</pubDate><guid>http://www.cppblog.com/401074567/archive/2011/05/22/146899.html</guid><wfw:comment>http://www.cppblog.com/401074567/comments/146899.html</wfw:comment><comments>http://www.cppblog.com/401074567/archive/2011/05/22/146899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/401074567/comments/commentRss/146899.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/401074567/services/trackbacks/146899.html</trackback:ping><description><![CDATA[<div><span style="font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">enter指令是为了支持高级语言中的变量作用于而加入的，它不是一个伪指令，但是却由于效率原因被各大编译器所摒弃，取而代之的是用多条指令去模拟来提升效率，确实是很悲哀的一个指令。。。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">格式 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ENTER reservedVarSize, level</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">reservedVarSize &nbsp; &nbsp; &nbsp; 局部变量占用内存的大小</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">level &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 嵌套的级别</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">当level = 0时，例如 enter x, 0</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">相当于</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 21px; ">push ebp</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 21px; ">mov &nbsp;ebp, esp</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 21px; ">add &nbsp;esp, -x</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">而level != 0时，这个就是要说的关键</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">我们压到栈中的内容应该要保证能访问到访问级别更高的变量，那么我们就需要保存指向这些内容的栈帧的指针</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">例如</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">enter 10, 3</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">相当于</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="line-height: 21px; ">push ebp<br />mov &nbsp;ebp, esp<br />sub &nbsp;esp, (3 - 1) * 4<br />push ebp<br />sub &nbsp;esp, 10</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">第一步push ebp是上一嵌套级别的ebp，用来供leave指令返回到上一嵌套层</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">sub &nbsp;esp, (3 - 1) * 4这条指令是用来保存可访问的栈帧的指针，能访问几层就有几个</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">下面那条push &nbsp;ebp是保存当前栈帧的</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">最后sub掉esp，保存局部变量</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">看英特尔的文档纠结了很久，最后得出的结论就是intel文档上有一个图片画错了。。。这个很纠结。。。</p></span></div><img src ="http://www.cppblog.com/401074567/aggbug/146899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/401074567/" target="_blank">凝霜</a> 2011-05-22 09:58 <a href="http://www.cppblog.com/401074567/archive/2011/05/22/146899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>