LEA:取地址,也可以叫计算表达式
LEA有两个操作数,左边必须是寄存器,右边必须写成 宽度 PTR ds:[ 要计算的表达式]
例如,我们要取栈顶后面4位的地址,宽度为4字节,并存到EAX里
LEA EAX , DWORD PTR DS: [ESP + 4] 计算内容
可以看成右边是计算 然后存入LEA,所以取地址叫法也不标准
MOV:复制
复制指定的数据到另一块地址 一边必须是寄存器,不能内存到内存
例如:
复制esp的地址到eax
mov eax,esp
复制ESP的指向的数据到EAX
mov eax ,dword ptr ds: [esp]
MOVS :复制ESI指向的内存到EDI指向的内存,并ESI EDI加所复制的宽度(方向取决于DF标志寄存器)简写形式(MOVSB,MOVSW,MOVSD)
mov esi,0x18FFA0 设置要复制内存的起始地址
mov edi,0x18FF78 //设置要复制 到哪里的内存地址
std //将DF标志寄存器设置为1,那么下面复制就会像低内存连续复制,也就是复制完毕ESI EDI会减宽度
movs dword ptr es:[edi],dword ptr ds:[esi] //复制4字节数据到edi指向的内存 想要连续复制多少次 可以根据REP指定
REP: 循环
REP 后面跟要循环的语句 一般用于连续复制内存(MOVS)和填充某块内存(STOS)
循环次数取决于ECX(计数器寄存器)
例如
MOV ECX,4 //设置计数器复制4次,这里是16进制
REP movs dword ptr es:[edi],dword ptr ds:[esi] //根据计数器循环复制4次,复制完毕向低位还是高位内存 取决于DF标志寄存器
STOS :将EAX 的数据复制到EDI指定的内存 简写形式(STOSB,STOSD,STODW)
例如EAX存的是0x11223344
将EAX复制到ESP指定的内存区别
STOS DWORD PTR DS: [ESP],EAX
循环复制也可以用REP