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?