LEA
is the "load effective address" instruction on x86 processors.Despite the "L" in the name, this is solely an arithmetic instruction. Which means there are some nasty little games you can play with it. Like this one I got courtesy of Frank Kotler from:
http://groups.google.com/group/alt.lang.asm/msg/27d6ed6183448057?hl=en&
global _start
section .data
number_string db '123', 10
section .text
_start:
nop
push number_string
call atoi
add esp, byte 4
mov ebx, eax
mov eax, 1
int 80h
atoi:
mov edx, [esp + 4] ; pointer to string
xor eax, eax ; clear "result"
.top:
movzx ecx, byte [edx]
inc edx
cmp ecx, byte '0'
jb .done
cmp ecx, byte '9'
ja .done
; we have a valid character - multiply
; result-so-far by 10, subtract '0'
; from the character to convert it to
; a number, and add it to result.
lea eax, [eax + eax * 4]
lea eax, [eax * 2 + ecx - 48]
jmp short .top
.done
ret