【计算机系统】汇编指令 lea 和 mov 的区别

引言

在学习计算机系统这门课程时,很多同学可能会把 leamov 指令弄混,误认为这两条指令是一个意思。并且,卡耐基梅隆大学的这本《深入理解计算机系统》黑皮书上也讲的比较模糊。其实,单从表面上理解汇编代码意思的话,这两条指令确实非常相像。但是实际上这两者有很大的差别,需要仔细区分和体会。

比如以下这道题,为湖南大学2022年计算机系统期中考试原题,如果不彻底弄清楚二者区别的话,非常容易混淆:

 请诸君继续阅读,答案解析在后面揭晓...

一、lea 和 mov 的定义

可以先来看一下 leamov 指令的定义:

1.MOV指令(数据传送指令)

MOV 指令主要用于在寄存器或内存之间传输数据。它可以将源操作数(source operand)的值复制到目标操作数(destination operand)。例如,MOV AX, [BX] 这条指令将会把内存地址 [BX] 处的值加载到 AX 寄存器中。

MOV 指令不会改变源操作数的值,它只是复制这个值到目标操作数。

2.LEA指令(加载有效地址)

LEA 指令用于加载有效地址(Effective Address)到目标寄存器中。有效地址通常是由一个或多个寄存器或内存地址组成的复杂表达式的结果。LEA 指令计算这个表达式的值,并将结果(即有效地址)存储到目标寄存器中,而不会去访问或修改该地址处的内存内容。

例如,LEA AX, [BX+SI] 这条指令将会计算 BX 和 SI 寄存器之和,并将结果(有效地址)加载到 AX 寄存器中,而不会读取该地址处的内存值。

区别

  • MOV 指令用于在寄存器或内存之间传输数据值。
  • LEA 指令用于计算有效地址,并将结果加载到寄存器中,但不访问该地址处的内存内容。

二、举例

在黑皮书上翻找了很久,并且借鉴了一些其他博主的博客后,找到了一个很有对比参考意义的例子(《深入理解计算机系统》(第三版) P181),如下图所示:

在这段代码中,

第三行,leaq 表示的是加载有效地址;而(%rsi,%rdi,4)表示的是将%rsi寄存器中的值,加上4倍的%rdi的值,得到X(A)+4n*i ,再将其作为内存地址,在内存中找到相应的值。但是,这里操作符为 leaq,leaq是取地址操作,所以就是将取出来的值的地址放入%rax寄存器中,而取出来的值的地址刚好就是%rsi+%rdi×4,也就是X(A)+4n*i,相当于还原了上一步操作。

第四行,movl表示的是数据传送(%rax,%rcx,4)得到X(A)+4n*i+4j这个内存地址的值,即M[i][j],放入%eax寄存器中,得到最终结果

总的来说,mov 是对值进行操作,而 lea 则是对值所对应的地址进行操作,相当于C语言中的“&”符号。

回到最初的那个例子,

这题正确答案是C选项。

mov(%ecx,%edx,4),%eax 计算的是将a[n]放入%eax寄存器中,而 leal(%ecx,%edx,4),%eax 则是把 a+4*n这个内存地址(也就是数组的偏移量)放入 %eax 中。

相关推荐

  1. 汇编指令retnretn x区别

    2024-04-10 04:44:01       49 阅读
  2. LetVar区别

    2024-04-10 04:44:01       55 阅读
  3. LDAPDA区别

    2024-04-10 04:44:01       34 阅读
  4. 汇编指令系统寻址方式

    2024-04-10 04:44:01       39 阅读
  5. js let var 区别

    2024-04-10 04:44:01       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 04:44:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 04:44:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 04:44:01       82 阅读
  4. Python语言-面向对象

    2024-04-10 04:44:01       91 阅读

热门阅读

  1. [C++/Linux] UDP编程

    2024-04-10 04:44:01       34 阅读
  2. 【LeetCode热题100】【二叉树】二叉树的层序遍历

    2024-04-10 04:44:01       42 阅读
  3. 经典面试排序题(快排堆排)

    2024-04-10 04:44:01       33 阅读
  4. SVN(Subversion)代码版本管理

    2024-04-10 04:44:01       34 阅读
  5. linux查看用户登录情况

    2024-04-10 04:44:01       30 阅读
  6. python | ttkbootstrap,一个神奇的 Python 库!

    2024-04-10 04:44:01       34 阅读
  7. Macbook M1版安装安卓模拟器

    2024-04-10 04:44:01       34 阅读
  8. PDF格式解析:Contents stream绘制指令解析

    2024-04-10 04:44:01       37 阅读
  9. 达梦数据库如何开启数据库审计

    2024-04-10 04:44:01       24 阅读