leal 指令

来源:互联网 发布:gitlab windows server 编辑:程序博客网 时间:2024/05/22 03:37
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 (相对基址加变址寻址) 
原创粉丝点击