Lo que nosotros hacemos complicado se hace facil con lea:
http://en.wikibooks.org/wiki/X86_Assembly/Data_Transfer#Load_Effective_Address
lea es como un mov que como op1 tiene una dirección de memoria ("D(Rb,Ri,S)")
pero que en lugar de mover lo contenido por la dirección de memoria a op2
mueve la dirección de memoria (D+Rb+Ri*S) a op2.
8<---
 subl $4, %ebx
 pushl %ebx # puntero a -4(%ebp)
 movl %ebp, %ebx
 addl $8, %ebx
 pushl %ebx # puntero a 8(%ebp)
 call swap
--->8
8<---
  c1:	8d 45 f4             	leal   -0xc(%ebp),%eax
  c4:	89 44 24 04          	movl   %eax,0x4(%esp)
  c8:	8d 45 08             	leal   0x8(%ebp),%eax
  cb:	89 04 24             	movl   %eax,(%esp)
  ce:	e8 fc ff ff ff       	calll  cf <func+0x35>
--->8

$gcc -c t7_complex_swap.c
$objdump -S -M suffix t7_complex_swap.o 

t7_complex_swap.o:     tiedostomuoto elf32-i386


Lohkon .text disassemblointi:

00000000 <swap>:
   0:	55                   	pushl  %ebp
   1:	89 e5                	movl   %esp,%ebp
   3:	83 ec 38             	subl   $0x38,%esp
   6:	8b 45 0c             	movl   0xc(%ebp),%eax
   9:	8b 10                	movl   (%eax),%edx
   b:	8b 45 08             	movl   0x8(%ebp),%eax
   e:	8b 00                	movl   (%eax),%eax
  10:	89 54 24 10          	movl   %edx,0x10(%esp)
  14:	8b 55 0c             	movl   0xc(%ebp),%edx
  17:	89 54 24 0c          	movl   %edx,0xc(%esp)
  1b:	89 44 24 08          	movl   %eax,0x8(%esp)
  1f:	8b 45 08             	movl   0x8(%ebp),%eax
  22:	89 44 24 04          	movl   %eax,0x4(%esp)
  26:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)
  2d:	e8 fc ff ff ff       	calll  2e <swap+0x2e>
  32:	8b 45 08             	movl   0x8(%ebp),%eax
  35:	8b 00                	movl   (%eax),%eax
  37:	89 45 f0             	movl   %eax,-0x10(%ebp)
  3a:	8b 45 0c             	movl   0xc(%ebp),%eax
  3d:	8b 00                	movl   (%eax),%eax
  3f:	89 45 f4             	movl   %eax,-0xc(%ebp)
  42:	8b 45 0c             	movl   0xc(%ebp),%eax
  45:	8b 55 f0             	movl   -0x10(%ebp),%edx
  48:	89 10                	movl   %edx,(%eax)
  4a:	8b 45 08             	movl   0x8(%ebp),%eax
  4d:	8b 55 f4             	movl   -0xc(%ebp),%edx
  50:	89 10                	movl   %edx,(%eax)
  52:	8b 45 f4             	movl   -0xc(%ebp),%eax
  55:	89 44 24 08          	movl   %eax,0x8(%esp)
  59:	8b 45 f0             	movl   -0x10(%ebp),%eax
  5c:	89 44 24 04          	movl   %eax,0x4(%esp)
  60:	c7 04 24 1d 00 00 00 	movl   $0x1d,(%esp)
  67:	e8 fc ff ff ff       	calll  68 <swap+0x68>
  6c:	8b 45 0c             	movl   0xc(%ebp),%eax
  6f:	8b 10                	movl   (%eax),%edx
  71:	8b 45 08             	movl   0x8(%ebp),%eax
  74:	8b 00                	movl   (%eax),%eax
  76:	89 54 24 10          	movl   %edx,0x10(%esp)
  7a:	8b 55 0c             	movl   0xc(%ebp),%edx
  7d:	89 54 24 0c          	movl   %edx,0xc(%esp)
  81:	89 44 24 08          	movl   %eax,0x8(%esp)
  85:	8b 45 08             	movl   0x8(%ebp),%eax
  88:	89 44 24 04          	movl   %eax,0x4(%esp)
  8c:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)
  93:	e8 fc ff ff ff       	calll  94 <swap+0x94>
  98:	c9                   	leavel 
  99:	c3                   	retl   

0000009a <func>:
  9a:	55                   	pushl  %ebp
  9b:	89 e5                	movl   %esp,%ebp
  9d:	83 ec 28             	subl   $0x28,%esp
  a0:	c7 45 f4 f9 ff ff ff 	movl   $0xfffffff9,-0xc(%ebp)
  a7:	8b 55 f4             	movl   -0xc(%ebp),%edx
  aa:	8b 45 08             	movl   0x8(%ebp),%eax
  ad:	89 54 24 08          	movl   %edx,0x8(%esp)
  b1:	89 44 24 04          	movl   %eax,0x4(%esp)
  b5:	c7 04 24 36 00 00 00 	movl   $0x36,(%esp)
  bc:	e8 fc ff ff ff       	calll  bd <func+0x23>
  c1:	8d 45 f4             	leal   -0xc(%ebp),%eax
  c4:	89 44 24 04          	movl   %eax,0x4(%esp)
  c8:	8d 45 08             	leal   0x8(%ebp),%eax
  cb:	89 04 24             	movl   %eax,(%esp)
  ce:	e8 fc ff ff ff       	calll  cf <func+0x35>
  d3:	8b 55 f4             	movl   -0xc(%ebp),%edx
  d6:	8b 45 08             	movl   0x8(%ebp),%eax
  d9:	89 54 24 08          	movl   %edx,0x8(%esp)
  dd:	89 44 24 04          	movl   %eax,0x4(%esp)
  e1:	c7 04 24 36 00 00 00 	movl   $0x36,(%esp)
  e8:	e8 fc ff ff ff       	calll  e9 <func+0x4f>
  ed:	c9                   	leavel 
  ee:	c3                   	retl   

000000ef <main>:
  ef:	55                   	pushl  %ebp
  f0:	89 e5                	movl   %esp,%ebp
  f2:	83 e4 f0             	andl   $0xfffffff0,%esp
  f5:	83 ec 10             	subl   $0x10,%esp
  f8:	c7 04 24 07 00 00 00 	movl   $0x7,(%esp)
  ff:	e8 fc ff ff ff       	calll  100 <main+0x11>
 104:	c9                   	leavel 
 105:	c3                   	retl   
$
