¿Cuál es el propósito del registro RBP en el ensamblador x86_64?

4 minutos de lectura

Así que estoy tratando de aprender un poco de ensamblaje, porque lo necesito para la clase de Arquitectura de Computadoras. Escribí algunos programas, como imprimir la secuencia de Fibonacci.

Reconocí que cada vez que escribo una función uso esas 3 líneas (como aprendí al comparar el código ensamblador generado a partir de gcc a su C equivalente):

pushq   %rbp
movq    %rsp, %rbp
subq    $16, %rsp

Tengo 2 preguntas al respecto:

  1. En primer lugar, ¿por qué necesito usar %rbp? ¿No es más fácil de usar? %rspya que su contenido se traslada a %rbp en la 2da linea?
  2. ¿Por qué tengo que restar algo de %rsp? Quiero decir que no siempre 16cuando yo era printfing como 7 u 8 variables, luego restaría 24 o 28.

Uso Manjaro de 64 bits en una máquina virtual (4 GB de RAM), procesador Intel de 64 bits

  • Olvidaste habilitar la optimización. En cuanto a la cantidad a restar, eso depende de los requisitos de alineación y si puede usar la zona roja.

    – bufón

    28 de enero de 2017 a las 17:44

  • @Jester Habilitar la optimización no significa necesariamente que la omisión del puntero de cuadro también se habilitará

    –Govind Parmar

    28 de enero de 2017 a las 17:49

  • Posible duplicado de ¿Qué es exactamente el puntero base y el puntero de pila? ¿A qué apuntan?. IOW es lo mismo que en el código x86_32.

    – Jongware

    28/01/2017 a las 17:50


  • @GovindParmar depende del compilador, pero usted mismo adivinó gcc, dónde lo hace. Además, restar de rsp sin motivo (que OP insinúa) también dice que no hay optimización.

    – bufón

    28 de enero de 2017 a las 17:53

  • Posible duplicado de ¿Cuál es el propósito del registro de puntero de cuadro EBP?

    – phuclv

    11 de junio de 2018 a las 9:39

  • Exacto, se usa %rsp!. Pero es cuando yo movl primera constante, fe movl $10 lo mueve a 4(%rsp). Por qué no -4? Y por cierto, ¿por qué todavía resta algo de valor de %rsp? no lo entendí por los comentarios

    usuario6827707

    28 de enero de 2017 a las 18:43

  • @FrynioS Compiler asigna algo de espacio para los valores locales al ingresar la función. Es por eso que resta valor de %rsp al ingresar. Esto no depende de si se usa %rbp como puntero de cuadro. Después de eso, este lugar se usa con compensaciones positivas sobre %rsp. Además, si esta función llama a otra, %rsp se alineará en un límite de 16 bytes para cada llamada, por lo que, en ese caso, el compilador restará 8 de %rsp en cada entrada.

    – Red

    29 de enero de 2017 a las 5:52

  • @FrynioS nota que también hay un espacio de 128 bytes (“zona roja”) antes de %rsp que mantiene su contenido entre las llamadas a funciones pero que el sistema operativo conserva durante las interrupciones. Por lo tanto, se pueden usar valores muy temporales (entre llamadas a funciones) con compensaciones negativas para %rsp. No todos los compiladores utilizan esto.

    – Red

    29 de enero de 2017 a las 5:55

  • Wow, amigo, ¡eso me ayudó mucho! Gracias por la respuesta (lástima que marque otra respuesta como aceptada :D)

    usuario6827707

    28/01/2017 a las 20:42

  • @FrynioS: ¡No te preocupes, todo está bien! Consideré esto más como “información de fondo que algunos podrían encontrar útil”, o cosas que probablemente quieras saber si te estás preguntando sobre estas cosasmientras que Govind Parmar hizo las preguntas que usted indicó.

    – Animal nominal

    28 de enero de 2017 a las 21:04

  • @NominalAnimal corrige el error tipográfico: la opción correcta es -fomit-frame-pointer.

    – Red

    29 de enero de 2017 a las 5:58

  • @Netch: D’Oh! Buena atrapada; Gracias por el aviso. Arreglado ahora.

    – Animal nominal

    29 de enero de 2017 a las 13:12

  • Si bien es cierto que eh_frame hace punteros de cuadro innecesario no es cierto decir eso eh_frame no usa punteros de cuadro: si el compilador usa un puntero de cuadro para una función eh_frame y debug_frame definitivamente los usaré. De hecho, es un consejo común si desea reducir el tamaño binario para agregar -fno-omit-frame-pointer: un cierto costo en el tamaño/rendimiento del código puede reducir drásticamente eh_frame secciones ya que un puntero de marco es la forma más sencilla de encontrar un marco de pila y, por lo tanto, la representación DWARF es muy sucinta.

    – BeeOnRope

    3 de enero de 2018 a las 19:01


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad