汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-08-01 10:17] 关于局部变量

在单个子程序/过程/函数中创建、使用和注销的变量称之为局部变量。局部变量与过程之外的全局变量相比有明显有点:
o:只有在局部变量所在过程之内的语句才能看到和修改局部变量。这个特点有助于避免程序源码多处修改一个变量导致的bug。
o:局部变量使用的存贮空间在过程结束后立即释放
o:一个过程内的局部变量的名字可以和其他过程中的局部变量的名字相同。不会发生名字冲突。
o:对递归过程已经可能由多个线程同时执行的过程而言,局部变量是必须的。

局部变量在运行时栈上创建的。 在内存中其位置通常在基址指针EBP之下,尽管在汇编时不能给定默认值,但是可以在运行时初始化。例如:
subproc    proc
           push ebp                  ;保存基址指针
           mov ebp,esp               ;堆栈框架基址
           sub esp,8                 ;创建局部变量
           mov dword ptr [ebp-4],10  ;变量1
           mov dword ptr [ebp-8],20  ;变量2
           mov esp,ebp               ;删除局部变量
           pop ebp                   ;恢复基址指针
           ret                       ;返回调用
subproc    endp

在过程返回之前,子程序通过把EBP的值赋值给ESP恢复了堆栈指针的值。在效果上相当于从堆栈上释放了局部变量
mov esp,ebp
如果没有这句,pop ebp指令将会导致处理器发生异常。

为了使代码便于阅读, 可以给每个变量的引用地址都定义一个符号并在代码中使用,例如:
X  equ dword ptr [ebp-4]
Y  equ dword ptr [ebp-8]
subproc   proc
          push ebp
          mov ebp,esp
          sub esp,8
          mov X,10
          mov Y,20
          mov esp,ebp
          pop ebp
          ret
subproc   endp

子例程通常通过使用相对基址寻址方式访问引用参数。这是由于每个引用参数都是一个地址指针,实际上引用参数是要被装入到寄存器中作为间接操作数使用的。
评论次数(0)  |  浏览次数(314)  |  类型(汇编语言笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码