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
视为&
操作符。