2010-09-23 17 views
8

estoy experimentando un accidente, y al investigar me encontré totalmente bloqueado por el siguiente código:problemas para comprender un preámbulo función x86-64

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) 

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

Específicamente, no entiendo la última instrucción. Parece escribir el valor del registro rdx en la memoria en alguna parte de la pila (muy, muy lejos), antes de que la función haya tocado ese registro. Para mí, esto no tiene ningún sentido.

Intenté leer las convenciones de llamadas, y mi mejor teoría ahora es que rdx se usa para un parámetro, por lo que el código básicamente "devuelve" el valor del parámetro directamente. Este no es el final de la función, por lo que en realidad no regresa, por supuesto.

+0

Tal vez podría ayudarle a Raymond: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/ 14/58579.aspx – ruslik

Respuesta

12

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

El marco de la pila es 1648 bytes (sub $0x648,%rsp reclamaciones 1608 bytes, más 5 registros de 64 bits se han presionado antes de eso), y 0xfffffffffffff998 es -1640.

Así que el código almacena el tercer parámetro cerca de la parte inferior del marco de la pila.

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

+0

Impresionante, gracias. Realmente debería tomarme un tiempo (5-10 años más o menos) y volver a la rutina con la programación de ensamblaje. – unwind

Cuestiones relacionadas