En la programación de ensamblaje (todos los tipos), ¿es útil / necesaria la instrucción de salto a desplazamiento (PC + x) si ya hay una instrucción de salto que apunta a un registro o valor absoluto? Estoy pidiendo una PC que estoy diseñando actualmente.

Hay dos motivaciones principales para el direccionamiento relativo a la PC (ramas o de otro tipo):

  • Codificación compacta Puede hacer referencia a etiquetas “cercanas” en un número menor de bits.
  • Código independiente de posición (PIC). La misma biblioteca de código se puede cargar en diferentes direcciones y seguir funcionando correctamente.

De hecho, las bibliotecas ELF modernas en sistemas Linux están construidas como PIC para permitir que se compartan las mismas páginas de códigos en diferentes tareas, en diferentes direcciones virtuales.

Notarás que dije “sucursales o no”. Por “lo contrario”, quiero decir accesos a datos más generales. x86–64 agregó direccionamiento relativo a RIP como parte de las extensiones de 64 bits para hacer que el PIC sea más barato. (RIP es cómo x86–64 deletrea PC).

Puede emular un PC relativo con un registro relativo o un registro absoluto, si tiene una forma económica de obtener el valor de la PC en un registro de propósito general. Sin embargo, los ciclos realmente pueden sumar en una biblioteca compartida.

Los saltos relativos son muy útiles, pero no son estrictamente necesarios en un conjunto de instrucciones de la CPU. Aunque puede escapar sin ellos, existen en muchas arquitecturas y son útiles porque:

  • Una instrucción de salto relativa generalmente requiere menos bits para codificar que un salto absoluto, porque el rango de desplazamiento es típicamente más limitado que una dirección absoluta, y por lo tanto requiere menos bits. Debido a que los saltos de corto alcance son más comunes en la mayoría de los códigos que los saltos de largo alcance, una instrucción de salto relativo más pequeña tiene las siguientes ventajas:
  • Tamaño de código general más pequeño . Para cantidades triviales de código, la diferencia es insignificante, pero para grandes cantidades de código, la diferencia puede ser significativa.
  • Esto puede conducir a tiempos de carga más rápidos.
  • Una huella ejecutable más pequeña puede ejercer menos presión sobre los recursos de memoria, lo cual es muy importante en los sistemas con memoria limitada (p. Ej., Sistemas integrados).
  • Una huella ejecutable más pequeña puede reducir la actividad de paginación en los sistemas de memoria virtual al mismo tiempo que maneja muchas aplicaciones cargadas, controladores, servicios, DLL, etc.
  • Mejor localidad espacial . Debido a que las instrucciones son más cortas, existe una mayor probabilidad de que quepan más instrucciones en la memoria caché, lo que puede generar menos errores de memoria caché y, por lo tanto, un mejor rendimiento.
  • Un salto relativo no tiene que ser reubicado (también conocido como “arreglado”) por el vinculador en el momento del enlace o por el cargador en el momento de la carga.
    • Cuando la reubicación se lleva a cabo en el momento del enlace , hay un costo único para las reparaciones de saltos absolutos. Para proyectos muy grandes, este costo puede ser una parte importante del tiempo de construcción.
    • Cuando la reubicación se realiza en el momento de la carga (utilizando un cargador de reubicación), el costo de reubicación se incurre cada vez que se carga el programa. Para proyectos muy grandes, este costo puede ser una parte importante del tiempo de carga.

    Es importante tener instrucciones de salto que usan un registro (o registro y desplazamiento, o registro e índice), y pueden requerir menos bits para codificar que un salto a una dirección codificada. Pero si puede salirse con una instrucción de salto relativa, no tiene que grabar un registro para el salto.

    En arquitecturas RISC que generalmente tienen instrucciones de tamaño fijo, su kilometraje variará.

    Agregar una distancia constante JMP con respecto a la PC es conveniente para el código reubicable.
    También es bastante útil para proporcionar instrucciones jmp muy cortas que aumentan la densidad del código; eso probablemente no importa mucho en las máquinas modernas donde la memoria es enorme porque es barata.

    Si no tiene eso, el programador siempre puede escribir:

    X: mov reg, = X
    agregar reg, K
    jmp reg

    como una forma torpe de implementar ramas relativas. Pero si va a hacer esto, también podría usar una dirección de jmp a absoluto. Puede que no parezca “reubicable”, pero la maquinaria que carga el código en la memoria puede diseñarse para parchear las direcciones para que funcione de todos modos.

    Las máquinas modernas tienen ramificaciones relativas debido a la conveniencia y las cortas longitudes de instrucción.

    Se requiere una instrucción de salto absoluta y / o relativa. Como otros han señalado, el modelo relativo tiene algunos beneficios, incluida la densidad; Elegí este enfoque para el conjunto de instrucciones Ecstasy, ya que usa codificación de longitud variable (instrucciones de longitud variable). Para arquitecturas más simples (a menudo más rápidas), el modelo absoluto requiere un cálculo menos, y si está grabando un cierto número de bytes en una instrucción de tamaño fijo, entonces hay poco o ningún beneficio de direccionamiento relativo (quizás el código es ligeramente más reubicable )

    Un salto a la dirección especificada en la instrucción de registro es ciertamente útil, particularmente para implementar un comportamiento dinámico. Sin embargo, también es peligroso y es probable que provoque bloqueos masivos en una CPU.

    PC +: se usan direcciones relativas, donde usan pocos bits para direccionar en la instrucción. Si usa el contenido de un registro para el direccionamiento, esto también puede ser bueno (hay ejemplos). Además, si utiliza la dirección como valor absoluto en una variable de memoria, también puede ser buena (llaman a este direccionamiento indirecto) En el pasado, el “Contador de programa” de Data General Nova se convirtió en 0 en caso de interrupción. La dirección 0 contenía una instrucción Jump en indirecta 1. La dirección 1 contenía la dirección de la rutina de manejo de interrupciones. Simple y brillante También puede poner la dirección de salto en la pila. Así que cree en ti fantasía.

    Mi opinión es no, siempre que haya un ensamblador o compilador disponible.

    Es difícil calcular manualmente los saltos relativos para bucles pequeños y ajustarlos cada vez que cambia la ubicación del código.

    Esto hace que una PC más un salto de desplazamiento sea útil para la codificación manual.

    Pero un ensamblador lo hará sin esfuerzo, así que no hay problema

    Probablemente hace que la administración de memoria y el código recargable sean más fáciles, pero tendrías que hablar con los redactores del compilador y los desarrolladores de O / S para obtener una lectura más definitiva. En los días de las arquitecturas RISC, había un montón de estudios sobre la frecuencia con la que realmente se usaban diferentes instrucciones.