Pregunta

Estoy experimentando un accidente, y al investigar me encontré totalmente bloqueado por el siguiente código:

0000000000000a00 <_IO_vfprintf>:
a00:       55                      push   %rbp
a01:       48 89 e5                mov    %rsp,%rbp
a04:       41 57                   push   %r15
a06:       41 56                   push   %r14
a08:       41 55                   push   %r13
a0a:       41 54                   push   %r12
a0c:       53                      push   %rbx
a0d:       48 81 ec 48 06 00 00    sub    $0x648,%rsp
a14:       48 89 95 98 f9 ff ff    mov    %rdx,0xfffffffffffff998(%rbp)

Esta se genera mediante la ejecución de objdump --disassemble /usr/lib64/libc.a en un sistema x86 Linux de 64 bits y, a continuación buscar a través de la salida. Esta es de AT & T sintaxis , por lo que los destinos están a la derecha.

En concreto, no entiendo la última instrucción. Parece estar escribiendo el valor del registro rdx en algún lugar de la memoria en la pila (muy, muy lejos), antes de la función ha tocado ese registro. Para mí, esto no tiene ningún sentido.

Me trató de leer en las convenciones de llamada, y mi mejor teoría actual es que rdx se utiliza para un parámetro, por lo que el código es básicamente "regresando" el valor del parámetro directamente. Este no es el final de la función, así que no es realmente volver, por supuesto.

¿Fue útil?

Solución

Sí, es un parámetro. El ABI utilizado por cesionarios Linux hasta 6 "INTEGER" (<= 64- número entero de bits, o puntero) parámetros de tipo a registros, en el obvio y fácil de recordar %rdi orden, %rsi, %rdx, %rcx, %r8, %r9.

El marco de pila es 1648 bytes (reclamos sub $0x648,%rsp 1608 bytes, más 5 registros de 64 bits han sido empujados antes de eso), y 0xfffffffffffff998 es -1,640.

Así que el código es el almacenamiento de la tercera parámetro cerca de la parte inferior del marco de pila.

(Nota:. Windows de 64 bits ABI es diferente a la de Linux)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top