我还是对LEA指令充满了不解和困惑……:)
我最大的疑问就是,lea是不是没用?
书上说:lea是用来把指定地址处的操作数的偏移,输送到指定的寄存器
可是,我们在“指定地址”的时候,不就已经得到了偏移吗??
既然如此,只要把这个偏移mov到该寄存器就可以了呀?
假设ppp是一个存储器操作数,偏移为3000H
例如:
lea bx,ppp
实际上替换成
lea bx,[3000H]
机器码是
8D1E0030
等效的mov指令
mov bx,offset ppp
实际上替换为
mov bx,3000H
BB0030
可以节省一个字节
诸如偏移这种东西,都是编译器在编译期就已经算好的,既然如此,可以把它们看成
“立即数”了,要把一个立即数送到一个寄存器,有现成的mov可以用呀
记得有个朋友说过局部变量应该用lea,可是我想,局部变量的地址难道不是在编译期算好的吗?既然算好的那不是立即数吗?既然要把立即数送到寄存器那难道不可以用mov吗?
而且,我的另一个疑问是:lea到底干了什么?
从DEBUG的反汇编可以看出明显的区别
lea bx,[3000]
mov bx, 3000
一个是直接寻址,一个是立即寻址
我想,难不成LEA是访问了一遍存储器,然后计算出它的偏移,然后再把偏移储存到寄存器的?
可是,这个偏移是个编译期常数呀,用得着“计算”吗??
而且,运行的时候,又怎么能确定它在哪个段呢??段是可以重叠的
我十分不解,请帮忙,谢谢!:)