lea, load effective address,LEA指令的功能是取偏移地址, 指令形式是从存储器读数据到寄存器, 效果是将存储器的有效地址写入到目的操作数, 类似, C语言中的”&”.
它的指令形式是从存储器读数据到寄存器,但实际上它根本就没有引用存储器。 他只是取地址但是并没有取地址对应的值。address generation unit(AGU)
lea指令只有一个周期,某些编译器会使用lea来优化加法等操作。它是CPU地址生成单元参与运算的,而不是ALU参与运算的,是通过AGU单元产生的,所以在流水线上不会与上下文的算术逻辑指令产生流水相关。
mov是将数据从源操作传到目的操作数中
lea是将源操作数的地址传到目的操作数中
一个是数据,一个是地址
LEA指令的功能是取偏移地址,MOV指令的功能是传送数据
例如在32位环境下, 有内存位置标签l1, 则下面两行效果相同:
movl $l1, %edi
leal l1, %edi
lea传送的是寄存器里面的值,mov传送的是主存中以寄存器的值为地址里面的值。
例如。
leal 18(%eax),%ebx
movl 18(%eax) ,%ebx
这样,两条指令,传送的值是不一样的
leal 是传送 18+%eal(值)到 寄存器%ebx
movl 是传送的是在主存中以18+%eax为地址的存储序列里面存的值到%ebx。
leal指令用于加载有效地址(loadeffective address)。
leal指令的目的操作数必须是寄存器。实际上leal指令有时用于与加载地址无关的场景。
示例:
leal 6(%eax), %edx //把eax的值+6放入edx中。
leal (%eax, %ecx), %edx //把eax+ecx的值装入edx中。
leal (%eax, %ecx, 4), %edx //把eax + 4*ecx的值装入edx中。
leal 7(%eax, %eax, 8), %edx //把9*eax +7的值装入edx中。
leal 0xA(,%eax,4), %edx //把4*eax + 10的值装入edx中。
leal 9(%eax, %ecx, 2), %edx //把eax + 2*ecx+ 9的值装入edx中。
当源操作数很简单的情况下,完全可以用mov指令代替lea指令,如lea esi,Buffer,完全可以用指令mov esi,offset Buffer代替;但当源操作数稍微复杂一点的话,单用mov指令就代替不了了,至少要用到算术运算指令。指令集中提供lea指令,就是为了减少这些计算 上的麻烦.
lea对变量没有影响是取地址
LEA $1000H,%AX 作用是将内存单元[1000H]的偏移地址1000H送至AX;
MOV $1000H, %AX 作用是将内存单元[1000H]的内容1234H送给AX
LEA (%SI),%AX, 作用是将寄存器SI的内容4567H当做数据传送给AX;
MOV (%SI),%AX, 作用是将寄存器SI的内容4567H当做地址看待,将地址为4567H处的内容传送给AX;
LEA %SI,%AX, 作用是将寄存器SI的偏移地址1001H传送给AX;
MOV %SI,%AX, 作用是将寄存器SI的内容传送给AX;
几种等价:
1.LEA BX,TABLE 等价于 MOV BX,OFFSET TABLE
2.LEA (%SI),%AX, 等价于 MOV SI,AX
几种形式:
LEA BUFFER,%BX
LEA (%BX,%DI,X),%AX(基址加变址寻址)
LEA DATA(%BX,%SI),%DX (相对基址加变址寻址)
LES什么指令 lacll是什么指令
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章