堆栈种分配的局部变量所谓的“标号”,你以为是什么?(都是那些该死的宏惹的祸,大家要都是老老实实写代码,就不会有这些疑问了)。   
   比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子:   
   push    ebp   
   mov    esp,    ebp   
   sub    esp,    4   
   现在栈上就有了4各字节的空间,这就是你的局部变量。   
   接下来,你执行mov    LocalVar,    4,那么实际的指令又是什么?是这样:   
   mov    dword    ptr    [ebp-4],    4   
   于是,这个局部变量的“地址”就是ebp-4——显然,它不是一个固定的地址。现在需要将它的“地址”作为参数传给某个函数,你这样写:   
   invoke/call    SomeFunc,    addr    LocalVar   
   实际生成的指令是:   
   lea    eax,    [ebp-4]   
   push    eax   
   call    SomeFunc   
   当然,你也可以写成:   
   mov    eax,    ebp   
   sub    eax,    4   
   push    eax   
   call    SomeFunc   
   看到了,这里多了一条指令。这就是lea的好处。

于是,lea又多了一个非常美妙的用途:作简单的算术计算,特别是有了32位指令的增强寻址方式,更是“如虎添翼”:   
   比如你要算EAX*4+EBX+3,结果放入EDX,怎么办?   
   mov    edx,    eax   
   shl    edx,    2   
   add    edx,    ebx   
   add    edx,    3   
   现在用lea一条指令搞定:   
   lea    edx,    [ebx+eax*4+3]

//------------------------------------

关于局部变量我还是举个例子吧:   
   比如以下的C/C++函数(c调用方式):   
   void    abc(void){   
         int    a=0x1234;   
         efg(&a);   
   }   
   翻译成对等的ASM代码:   
   _abc    proc    near   
             push    ebp   
             mov      ebp,esp   
             sub      esp,4h   
             ;   
             lea      eax,[ebp-4h]   
             mov      [eax],1234h   
             push    eax   
             call    _efg   
             add      esp,4h   
             ;   
             mov      esp,ebp   
             pop      ebp   
             ret   
   _abc    endp   
   这时栈的情况如下:   
   ----------    <----esp   
   a   
   ----------    <----ebp   
   old    ebp   
   ----------   
   ret    address   
   ----------   
   这时要取得a的地址,那只能用"lea      eax,[ebp-4h]"而不能用“mov    offset...”了。

http://blog.csdn.net/yiruirui0507/article/details/6193140

关于LEA指令(单周期就可以做简单的算术计算)的更多相关文章

  1. Lea指令计算地址(用于四则混合运算),附上一个函数调用例子及其反汇编代码,很清楚

    比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子:     push   ebp     mov   esp,   ebp     sub ...

  2. 使用logisim搭建单周期CPU与添加指令

    使用logisim搭建单周期CPU与添加指令 搭建 总设计 借用高老板的图,我们只需要分别做出PC.NPC.IM.RF.EXT.ALU.DM.Controller模块即可,再按图连线,最后进行控制信号 ...

  3. Vivado实战—单周期CPU指令分析

    引言   不知道你是否和我有过同样的感受,<计算机组成原理>这门学科学起来如此的艰难:一节课下来,教室黑板上留下了满满的 "足迹",看上去也挺简单的,不就是 0 和 1 ...

  4. 单周期CPU设计

    终于有点时间了,恰好多周期的设计也已经完成,其实只想写写多周期的,无奈单周期补上才好,哈哈哈~ —————+—————黄金分割线—————+————— 首先要理解什么叫单周期CPU(与后面多周期CPU ...

  5. P4-verilog实现mips单周期CPU

    最近对学习的掌控可能出现了问题,左支右绌,p2挂了,p2.p3.p4.p5每周在计组花的连续时间少了很多,学习到的东西也少了很多,流水线都还没真正开始写,和别人比落后了一大截,随笔自然就荒废了,我得尽 ...

  6. 使用Verilog搭建一个单周期CPU

    使用Verilog搭建一个单周期CPU 搭建篇 总体结构 其实跟使用logisim搭建CPU基本一致,甚至更简单,因为完全可以照着logisim的电路图来写,各个模块和模块间的连接在logisim中非 ...

  7. 使用jmeter做简单的场景设计

    使用jmeter做简单的场景设计 Jmeter: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试.我之所以选择它,最重要的一点就是----开源 个人 ...

  8. 单周期cpu设计代码解读

    目录 写在前面 单周期cpu设计代码讲解 概念回顾 Verilog代码讲解 写在前面 欢迎转载,转载请说明出处. 单周期cpu设计代码讲解 概念回顾 一.电子计算机的部件 分为:中央处理器(cpu). ...

  9. 为什么现在使用多周期CPU,而单周期CPU被弃用?

    最初设计的CPU结构简单,内部不复杂.之所以制造它是为了让机器自动跑程序,算数. 早期CPU都是单周期的,人们没考虑那么多,性能啥的.就让CPU每个时钟周期跑一个指令,这些时钟周期等长.这样下来,有的 ...

随机推荐

  1. 《Java 并发编程实战》读书笔记之二:图文讲述同步的另一个重要功能:内存可见性

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另 ...

  2. 在Ubuntu上下载、编译和安装Android最新源码

    看完了前面说的几本书之后,对Linux Kernel和Android有一定的认识了,是不是心里蠢蠢欲动,想小试牛刀自己编译一把Android源码了呢?一直习惯使用Windows系统,而Android源 ...

  3. [Javascript] Log Levels and Semantic Methods

    Go beyond console.log by learning about log levels, filtering log output and structuring your output ...

  4. Linux cpuinfo 详解

     在Linux系统中,如何详细了解CPU的信息呢? 当然是通过cat /proc/cpuinfo来检查了,但是比如几个物理CPU/几核/几线程,这些问题怎么确定呢? 经过查看,我的开发机器是1个物理C ...

  5. [转] 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

    为了提高性能,几乎所有互联网应用都有缓存机制,其中Memcache是使用非常广泛的一个分布式缓存系统.众所周知,LAMP是非常经典的Web架构方式,但是随着Nginx的 成熟,越来越多的系统开始转型为 ...

  6. 这10篇 iOS 热文,你别错过哦

    <移动开发必读书单> 某一领域的技术人,在他的职业生涯中,一定有一些绕不过去的技术和非技术的知识.有的时候,靠自己摸索.到处偷师,倒也能掌握.但是,这些别人早就趟过去的坎,大多已经有了非常 ...

  7. MediaCodec文档翻译

    MediaCodec|文档翻译 classoverView mediacodec类可以用来调用系统底层的编码/解码软件. mediacodec一般是这么用的: MediaCodec codec = M ...

  8. 什么是AAC音频格式 AAC-LC 和 AAC-HE的区别是什么

    Advanced Audio Coding(高级音频解码),是一种由MPEG-4标准定义的有损音频压缩格式,由Fraunhofer发展,Dolby, Sony和AT&T是主要的贡献者. 在使用 ...

  9. CentOS6.6x86_64 部署 Nginx1.62+MySQL5.6.20+PHP5.6.4

    准备工作 切换到管理员身份 su - 安装编译扩展 yum install -y gcc-c++ 创建数据库目录.代码目录 mkdir /mnt/data /mnt/www 安装Nginx 1.6.2 ...

  10. My.Ioc 代码示例——注册项的注销和更新

    当您需要从 Ioc 容器中注销/删除一个注册项的时候,您会怎么做呢? 有人曾经在 stackoverflow 上提问“如何从 Unity 中注销一个注册项”.对于这个问题,有人的回答是“有趣.你为什么 ...