lo que será el modo de direccionamiento en código ensamblador generado por el compilador aquí?

StackOverflow https://stackoverflow.com/questions/3430848

Pregunta

Supongamos que tenemos dos variables enteras y caracteres:

int adad=12345;
char character;

Si se asume que estamos hablando de una plataforma en la cual, la duración de una variable entera es mayor o igual a tres bytes, quiero acceso tercer byte de este entero y lo puse en la variable de carácter, con esto dicho que había escribirlo así:

character=*((char *)(&adad)+2);

Teniendo en cuenta que la línea de código y el hecho de que no soy un compilador o ensamblaje experto, sé un poco acerca de los modos de direccionamiento en el montaje y me pregunto en el dirección del tercer byte ( o supongo que es mejor decir desplazamiento del tercer byte ) aquí estaría dentro de las instrucciones generadas por esa línea de código a sí mismos, o que sería en una variable independiente cuya dirección (o el desplazamiento ) está dentro de esas instrucciones?

¿Fue útil?

Solución

Lo mejor que puede hacer en situaciones como esta es probarlo. He aquí un programa de ejemplo:

int main(int argc, char **argv)
{
  int adad=12345;
  volatile char character;

  character=*((char *)(&adad)+2);

  return 0;
}

I añade el volatile para evitar la línea de asignación ser completamente optimizado de distancia. Ahora, esto es lo que el compilador se le ocurrió (por -Oz en mi Mac):

_main:
    pushq   %rbp
    movq    %rsp,%rbp
    movl    $0x00003039,0xf8(%rbp)
    movb    0xfa(%rbp),%al
    movb    %al,0xff(%rbp)
    xorl    %eax,%eax
    leave
    ret

Las únicas tres líneas que nos importa son los siguientes:

    movl    $0x00003039,0xf8(%rbp)
    movb    0xfa(%rbp),%al
    movb    %al,0xff(%rbp)

El movl es la inicialización de adad. Entonces, como se puede ver, se lee en el 3er byte de adad, y lo almacena en la memoria de vuelta (el volatile está obligando a que la espalda de la tienda).

Creo que es una pregunta buena, ¿por qué te importa lo que el montaje se genera? Por ejemplo, con sólo cambiar mi bandera optimización de -O0, la salida de montaje para la parte interesante del código es:

    movl    $0x00003039,0xf8(%rbp)
    leaq    0xf8(%rbp),%rax
    addq    $0x02,%rax
    movzbl  (%rax),%eax
    movb    %al,0xff(%rbp)

Lo que se ve bastante sin rodeos como las operaciones lógicas exacta de su código:

  1. Inicializar adad
  2. Tome la dirección de adad
  3. Añadir 2 a esa dirección
  4. Carga un byte desreferenciando la nueva dirección
  5. tienda en un byte character

Varias optimizaciones cambiarán la salida ... si realmente necesita algún comportamiento específico / modo de direccionamiento por alguna razón, puede que tenga que escribir el montaje de uno mismo.

Otros consejos

Sin saber nada sobre el compilador y la arquitectura de CPU subyacente hay una respuesta definitiva se puede dar. Por ejemplo, no todas las arquitecturas de CPU permiten el direccionamiento de cada byte arbitraria en la memoria (aunque creo que todos los que actualmente populares hacerlo): en una CPU que de palabra-dirigida, en lugar de byte-dirigida, lo que el compilador generará inevitablemente se va siendo la carga en algún registro de toda la adad palabra (presumiblemente por un desplazamiento desde un registro de puntero de base, si la variable en cuestión es en la pila [1]), seguido de desplazamiento y de enmascaramiento para aislar el byte de interés.

[1] Nótese que, sin saber lo que la arquitectura de CPU que estamos hablando y cómo los usos del compilador que, ni siquiera podemos decir si "cargar una palabra en un desplazamiento fijo de un registro de base" es algo que se hace en línea dentro de la instrucción (como una esperanza de poder, y muchas arquitecturas populares duda hacerlo apoyo ;-) o necesita aritmética de direcciones separadas en un registro auxiliar.

OIA, si se trata de una idea buena o no, es definitivamente posible para definir una arquitectura de CPU que no se puede cargar / registros del almacén, excepto a partir de otros registros o direcciones de memoria definidos por otros registros o constante, y algunos existen tales arquitecturas (aunque pueden no ser todo lo que populares en este momento; -).

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