跳转到内容

lea & movzx & 取值

lea指令用来取得一个内容的内存地址,跟mov类似,但lea只取地址而不碰值 用法:

section .data
data: dq "abcdefgh"
section .text
.start:
lea rsi, data

lea的[]比较特殊,并不是取得内存地址的内容,是有效地址计算(Effective Address)
格式是 [Base + Index * Scale + Displacement]
此外lea甚至可以做任何高效的计算只要符合格式

base: 寄存器
index: 寄存器
scale: 立即数 1, 2, 4, 8
disp: 立即数

像是

lea rax, [rbx+rcx*4+1]

特色是lea是AGU(地址生成单元)处理的,而不是ALU,如果ALU忙的话是个好选择,反之代码附近正在读取内存的话AGU就不是好选择。此外lea不会改变任何标志。

section .data
data: dw "ab"
section .text
.start:
mov si, WORD [data]

[]是取值,从内存地址取得内容,可以加上指定的大小,并且mov需要两边相同长度
将data的地址取一个WORD大小的值放入相同大小的si寄存器,lea是例外

将来源以零填充到与目标相同长度再做mov

```asm
section .data
data: dw "ab"
section .text
.start:
movzx esi, WORD [data]

将0x6261填充成0x00006261再移动到esi