`

lea指令——一个为了方便的多余指令

 
阅读更多

buf db 'loading ....'

lea bp,buf   

 会出现这样的错误:invalid combination of opcode and operands

 

Google一通,如下几个帖子有帮助:

1.官网的LEA解释:http://home.myfairpoint.net/fbkotler/nasmdocc.html#section-A.4.135

 简单地说,nasm中简化了很多masm中的很多指令,比如说获取有效地址:mov ax,offset buffer等价于nasm中的mov  ax,buffer,在nasm源程序中,几乎都是标号,标号就是地址;所以,在nasm中lea的正确语法为:lea ax,[buffer]

 

2. http://www.wming.com/a/articles/devlanguage/asm/2010/1229/74571.html

3.http://forum.nasm.us/index.php?topic=435.0

 

 

问题:

LEA指令不是取地址的吗?为什么最后ECX=0x30,可以用来存储立即数?

那这样为什么不直接用mov ecx,0x30呢?

这样用LEA指令有什么含义?

 

答案:

1. mov ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,以这个结果为地址找一个ecx长度的内存数赋给ecx

2. lea ecx,[eax+0x30]表示先运算eax+0x30得到一个结果,把这个结果(mov时地址)赋给ecx ,效果为ecx=eax+0x30  (这里eax参与了运算却没有改变值)

如果没有LEA指令,那么:

mov ecx,0x30

add ecx,eax

从指令长度和执行速度来看.lea ecx,[eax+0x30]要好.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics