关于汇编中 lea / move
1.
lea eax, pb 只是将pb的地址取出放到eax中,
lea ebx,[eax+2*1+1] 可以计算[]中的表达式 如果表达式比较复杂,mov基本不可代替。(有没有[]无所谓)
例子:
#include <iostream>
using namespace std;
int main()
{
int a[10]={4,20};
int* p=&(a[0]);
int b=10;
int *pb=&b;
int couta=4;
int coutb=0;
_asm
{
push eax
push ebx
push ecx
push edi
xor eax, eax
xor ebx, ebx
mov eax, pb
mov couta, eax
// mov ebx, offset p
lea ebx, [b+2]//[eax+4]
mov coutb, ebx
pop edi
pop ecx
pop ebx
pop eax
emms
}
cout << "couta=" << hex << couta << dec << pb << endl;
cout << "coutb=" << hex << coutb << dec << &b << endl;
cin >> couta;
return 0;
}
输出:
couta=12ff200012ff20
coutb=12ff220012ff20
lea可以说是计算单个地址+立即数/寄存器
如果有两个地址相加(当然没有任何意义,只是单纯相加),那就一个个取,借助寄存器来赋值。不能直接lea eax, [a+b]或者lea eax,a+b
2.mov eax, offset xxx 没有实现。