关于汇编LEA指令的问题

来源:百度知道 编辑:UC知道 时间:2024/06/20 22:51:19
下面一行代码:
lea ecx,[eax+0x30]
其中eax为0.

问题是:
LEA指令不是取地址的吗?为什么最后ECX=0x30,可以用来存储立即数?
那这样为什么不直接用mov ecx,0x30呢?
这样用LEA指令有什么含义?
是特例。是SHELLCODE里的一条指令,EAX是WSAStartup函数的返回值,成功则返回0.
那这条指令一般都有什么通用性呢?

mov ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,以这个结果为地址找一个ecx长度的内存数赋给ecx
lea ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,把这个结果(mov时地址)赋给ecx
效果为ecx=eax+0x30 (这里eax参与了运算却没有改变值)
如果不用这个那要用
mov ecx,0x30
add ecx,eax
从指令长度和执行速度来看.lea ecx,[eax+0x30]要好.

成功则返回0,错误那么就返回错误信息。这要看后面的指令是什么。我估计eax返回的值可能作为一种选择,不同的eax值打印出不同的错误信息。如果对这个问题敢兴趣,不如在动态跟踪的情况下,测试一下各种值的效果。

这个LEA在C++中经常当作优化指令的
举个例子吧
一下句子只要一个始终
lea eax ,[eax+ecx*4+ebx]

楼主你好。你说的其中eax为0,只是本题的特例,很有可能eax不等于0。这条指令是有通用性的,非一般初学者能够写得出来的。

补充回答:通用性就在于eax的变数。若WSAStartup函数返回的值不是0呢?