【计算机系统】汇编指令 lea 和 mov 的区别 |
您所在的位置:网站首页 › evldd汇编指令 › 【计算机系统】汇编指令 lea 和 mov 的区别 |
引言
在学习计算机系统这门课程时,很多同学可能会把 lea 和 mov 指令弄混,误认为这两条指令是一个意思。并且,卡耐基梅隆大学的这本《深入理解计算机系统》黑皮书上也讲的比较模糊。其实,单从表面上理解汇编代码意思的话,这两条指令确实非常相像。但是实际上这两者有很大的差别,需要仔细区分和体会。 比如以下这道题,为湖南大学2022年计算机系统期中考试原题,如果不彻底弄清楚二者区别的话,非常容易混淆: 请诸君继续阅读,答案解析在后面揭晓... 一、lea 和 mov 的定义可以先来看一下 lea 和 mov 指令的定义: 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 中。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |