zoukankan      html  css  js  c++  java
  • mov 与 lea 区别

    转自:https://blog.csdn.net/fengyuanye/article/details/85715565

    https://my.oschina.net/guonaihong/blog/508907

    mov默认对寄存器值或变量值进行操作,可以从寄存器到寄存器,从立即数到寄存器,从存储单元到寄存器,从立即数到存储单元,从寄存器到存储单元,【从寄存器或存储单元到段寄存器(除CS寄存器),立即数不能值接送段寄存器】

    但是注意 
    (1) MOV指令中的源操作数绝对不能是立即数和代码段CS寄存器; 
    (2) MOV指令中绝对不允许在两个存储单元之间直接传送数据; 
    (3) MOV指令中绝对不允许在两个段寄存器之间直接传送数据; 
    (4) MOV指令不会影响标志位

    对于变量,加不加[]都表示取值;

    对于寄存器而言,无[]表示取值,有[]表示取地址。

    lea是load effective address 的缩写,是取源操作数的偏移地址,并将其传送到目的操作数单元。类似于C语言的取地址符&。

    对于变量,其后面的有无[]皆可,都表示取变量地址,相当于指针。

    对于寄存器而言,无[]表示取地址,有[]表示取值。

    lea指令变种(按大小分类):

    leaw #2个字节
    leal #4个字节
    leaq #8个字节

    lea的用法:

    leaq a(b, c, d), %rax

    首先lea指令是mov指令的变种,据说,lea指令是x86体系结构中,是一条最古老但是从某个方面来讲又是最神奇的指令。

    表面上看,它做的事情非常简单,根据括号里的源操作数来计算地址,然后把地址加载到目标寄存器中。

    例如:leaq a(b, c, d), %rax 先计算地址a + b + c * d,然后把最终地址载到寄存器rax中。

    lea base_address(offset_address, index, size), %rax
    根据括号里的源操作数来计算地址,然后把地址加载到目标寄存器中。

    计算地址base_address+offset_address+index*size,然后把最终地址载到寄存器rax中。
    lea不引用源操作数里的寄存器,只是单纯的计算。

    可把它当作乘法指令使用

  • 相关阅读:
    Win7 华硕电脑自带摄像头无法打开 方法思路介绍
    P3520 [POI2011]SMI-Garbage
    二分图的最大匹配(模板)
    #数列分块入门 2
    数列分块入门#1
    线段树(标记下传乘法和加法)
    最小费用最大流
    最大流算法(模板)
    编译器出现/mingw32/bin/ld.exe:Permission denied 错误
    1298 圆与三角形
  • 原文地址:https://www.cnblogs.com/tongongV/p/12058191.html
Copyright © 2011-2022 走看看