Assembly “是否在”中学习;lea eax,[eax*4]”等;加载值?

Assembly “是否在”中学习;lea eax,[eax*4]”等;加载值?,assembly,Assembly,发件人: leaeax[eax*4]==shl-eax,2;但不设置标志 因此,我认为lea在这里加载eax的值(而不是地址),并且lea执行以下操作: 访问存储在eax中的值 “lea eax,[eax*4]”中的lea是否加载该值 不,它没有: 我想让你困惑的是括号“[]” [1234]是“地址1234处的值”,其“有效地址”是1234(括号已删除) 因此leaeax,[4*EAX]加载[4*EAX]的有效地址,即4*EAX EAX的内容是(当然是读取的),而[4xEAX]的内存中的值不是

发件人:

leaeax[eax*4]==shl-eax,2;但不设置标志

因此,我认为
lea
在这里加载
eax
值(而不是地址),并且
lea
执行以下操作:

  • 访问存储在
    eax中的值
  • 
    “lea eax,[eax*4]”中的lea是否加载该值

    不,它没有:

    我想让你困惑的是括号“[]”

    [1234]
    是“地址1234处的值”,其“有效地址”是1234(括号已删除)


    因此
    leaeax,[4*EAX]
    加载
    [4*EAX]
    的有效地址,即
    4*EAX

    EAX
    的内容是(当然是读取的),而
    [4xEAX]
    的内存中的值不是


    事实上,
    LEA,[something]
    MOV,something
    非常相似,而
    LEA
    可以做一些基本的算术运算(x2,x4,x8,增加偏移量),而
    MOV
    不能

    参见:LEA,唯一一条执行内存寻址计算但实际上不寻址内存的指令。@Suma在提问之前,我已经阅读了这个QA。但是我不确定我能不能说“
    lea
    在我的问题中加载值(不是地址)”
    [eax*4]
    的“有效地址”是eax*4,如果用eax*4加载eax,这几乎是“乘以4”,这与
    shr-eax,2
    完全相同。(没有设置标志,但评论中已经说过)@Tommylee2k谢谢。但是IIUC,
    [eax*4]
    仍然需要存储在
    eax
    中的值来完成乘法,对吗?或者你的意思是,[eax*4]不属于
    lea
    lea
    只需要
    [eax*4]
    的最终有效地址?你可以用一个不是合法指针的值来尝试,看看它是否有故障,或者用一个不指向自身的位置来查看寄存器中的结果值
    lea
    是移位加ALU指令;它不涉及记忆。它使用内存操作数语法和机器编码,因为CPU已经可以对寻址模式进行解码。但是,如果不加载/访问
    eax
    的值,如何执行
    [eax*4]
    ?我认为
    [eax*4]
    中的
    eax
    是它的值,而不是它的地址。
    eax
    被访问。地址
    eax*4
    处的内存不可用(这是
    mov
    的功能)@陳 力 不要把“eax的值”(即eax,没有地址:)和“eax的值”@Tommylee2k好的,让我重新组织这个问题:但是如果不加载/访问eax的值(又称,
    [eax]
    ),怎么办?我认为
    [eax*4]
    中的eax是它的值(
    [eax]
    ),而不是它的地址(
    eax
    )。
    [eax]
    加括号表示地址
    eax
    处的内存内容。
    mov
    lea
    之间的区别在于没有访问内存,而不是寄存器的值(当然是)。您可以将
    []
    视为C中的
    *
    操作符,
    lea
    视为
    &
    操作符。