Punteros en Asamblea

Estoy teniendo problemas con un problema de práctica de mi libro de texto. Tengo que completar las partes faltantes del código C que se muestra a continuación:

int switch3(int *p1, int *p2, int action)
{
    int result = 0;
    switch(action) {
    case 1:
     // Fill in
    case 2:
     // Fill in
    default:
     // Fill in
}
     return result;
}

La razón por la que estoy teniendo problemas es por el uso de punteros. Estoy bastante seguro de que sé cómo funcionan, pero déjame explicarte. El libro nos da la siguiente asamblea de IA32 con mis anotaciones en comentarios.

Arguments: p1 at %ebp+8, p2 at %ebp+12, action at %ebp+16
 Registers: result in %edx (initialized to -1) The jump targets:

.L13 // case(1)
  movl  8(%ebp), %eax // eax = p1
  movl  (%eax), %edx  // result = *p1
  movl  12(%ebp), %ecx // ecx = p2
  movl  (%ecx), %eax   // eax = *p2
  movl 8(%ebp), %ecx  // ecx = p1 
  movl %eax, (%ecx)   // *p1 = *p2

Así que al final, es resultado = * p1 y * p1 = * p2. Creo que esto es correcto, pero lo siguiente es lo que me confunde.

.L14 //case(2)
   movl  12(%ebp), %edx // result = p2  which is not possible because p2 is a pointer and result is an int
   movl  (%edx), %eax  
  movl   %eax, %edx
  movl    8(%ebp), %ecx
  addl (%ecx), %edx
  movl  12(%ebp), %eax
  movl  %edx, (%eax)
  jmp  .L19

 .L19 // default
    movl %edx, %eax

¿Podría alguien aclararme esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta