LEA 的重点是什么?

问题描述

如果我有

lea     eax,[ebp-20]
push    eax

我能不能把它写成:

mov     eax,ebp-20
push    eax

为什么第一个比第二个更受欢迎?

解决方法

有 2 种语言 - 汇编语言和机器代码。

没有理由不能发明自己的汇编语言来生成相同的机器代码;其中支持纯文本 "mov eax,ebp - 20"(并转换为与 lea eax,[ebp-20] 在其他汇编器中生成的相同的机器代码)。

汇编器不这样做的原因有两个:

a) 约定。如果所有汇编程序对相同的事情使用相同的助记符,并且这些助记符被 CPU 手册使用,那就太好了;因为这样可以更轻松地学习汇编语言,并且更容易从一种汇编程序切换到另一种。

b) 解析。汇编程序最终不得不解析像 "mov eax,[ebp-20]" 这样的文本,而且更容易回收相同的解析代码来处理 "lea eax,[ebp-20]",避免使用不同的代码来解析额外的操作数格式。

注意:希望汇编程序执行此操作也有合理的原因。 lea 通常用于与有效地址计算无关的整数运算;并支持替代的 mov 语法将为程序员提供一种添加上下文和提高代码可读性的方法(例如,当它是地址时使用 lea,而不是地址时使用 mov,这样更容易说明什么是/不打算作为地址)。