lea & movzx & 取值
lea指令用来取得一个内容的内存地址,跟mov类似,但lea只取地址而不碰值 用法:
section .data data: dq "abcdefgh"
section .text.start: lea rsi, datalea的[]比较特殊,并不是取得内存地址的内容,是有效地址计算(Effective Address)
格式是 [Base + Index * Scale + Displacement]
此外lea甚至可以做任何高效的计算只要符合格式
base: 寄存器index: 寄存器scale: 立即数 1, 2, 4, 8disp: 立即数像是
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
```asmsection .data data: dw "ab"
section .text.start: movzx esi, WORD [data]将0x6261填充成0x00006261再移动到esi