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

我的博客

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

[2010-08-02 10:16] 关于local伪指令

local伪指令在过程内声明一个或多个命名局部变量,并同时赋予变量相应的尺寸属性。 local必须紧跟在proc伪指令所在行之后。格式如下:
subproc    proc 
           local var-list
其中变量列表是一系列的变量定义,之间用逗号分开。每个变量定义的格式如下;
           标号:类型
标号可以是任意有效的标识符,类型可以是标准类型(word,dword,byte)
例如:
subproc   proc
          local temp1:word,temp2:byte array[10]:dword
其中,这个过程定义了一个字型变量temp1,一个字节型变量temp2,一个由10个元素构成的数组array。

通过查看汇编代码, 我们可以看到在使用local的时候masm生成的相应代码。如:
subproc    proc
           local tmp:dword
           mov eax,tmp
           ...
           ret
subproc    endp
汇编代码如下:
           push ebp
           mov ebp,esp
           add esp,0fffffffch ;esp+(-4)
           mov eax,[ebp-4]
           leave
           ret
堆栈框架结构为:
           ------------------
           |返回地址        |
           ------------------
           |      EBP       | <--EBP
           ------------------
   ESP-->  |      tmp       | [EBP-4]
           ------------------

如果在声明不同大小的局部变量时,local伪指令会根据变量的大小的不同, 为其分配的方法也不一样。对于8位变量(byte),在第一个可用的字节处为其分配空间;对于16位变量(word),在第一个可用的偶数地址处为其分配空间;对于32位变量(dword),在第一个可用的双子对齐边界处为其分配空间。例如:
subproc    proc
           local tmp1:dword,tmp2:byte
           ...
           ret
subproc    endp
masm生成代码如下:
           push ebp
           mov ebp,es
           add esp,0fffffff8h  ;esp加-8
           mov eax,[ebp-4]     ;双字变量tmp1
           mov bl,[ebp-5]      ;字变量tmp2
           leave
           ret
堆栈框架图:
--- ----------
    |        |
 E  ----------
    |        |
 B  ----------
    |        |
 P  ----------
    |        | <--EBP
--- ----------
    |        |
    ----------
    |        |
tmp1 ---------
    |        |
    ----------
    |        |[EBP-4]
--- ----------
tmp2|        |[EBP-5]
    ----------
    |  nu    |
    ----------
    |  nu    |
    ----------
esp |  nu    |[EBP-8]
    ----------

如果准备创建大于几百个字节的局部数组变量, 一定要在运行时栈上保留(分配)出足够的空间。如:
stack    segment
         4096 dup (0)  ;分配出4096自己的堆栈空间
stack    ends
评论次数(1)  |  浏览次数(1005)  |  类型(汇编语言笔记) |  收藏此文  | 

[  20090408   发表于  2010-09-09 21:03  ]

真不错,赞一个!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码