2012-02-19 9 views
10

Entiendo que no me hice claro. Mi duda, creo, se puede resumir en esto:¿Cómo compila un compilador C++ los nombres de las variables?

En un archivo ejecutable (código de máquina) ¿cómo se representan las "variables"? ¿Son direcciones de memoria estáticas? ¿El compilador le da a cada uno un "nombre" específico (o simplemente conserva el que le diste)?

Expresado en código:

int x=5; 
//Bunch of code 
cin>>y; 
cout<<x+1; 

¿Cómo funciona el programa en cada una de las máquinas sabe qué dirección va a contener el valor 5, para mantener el valor inputed, añadir 1 al valor que tiene ahora y finalmente imprime ese mismo valor.

--João

Respuesta

6

Aquí es un programa sencillo en C:

int main() { 
    int a = 5; 
    int b = 7; 

    int c = a + b; 

    return 0; 
} 

Si se compila con gcc -m32 -S -O0 -o main.s main.c bajo Linux, obtendrá algo como esto

.file "main.c" 
    .text 
    .globl main 
    .type main, @function 
main: 
.LFB0: 
    /* %ebp is a Base Pointer Register */ 
    pushl %ebp 
    movl %esp, %ebp 

    /* Here we reserve space for our variables */ 
    subl $16, %esp 

    /* a's address is %ebp - 4 */ 
    movl $5, -4(%ebp) 

    /* b's address is %ebp - 8 */ 
    movl $7, -8(%ebp) 

    /* a + b */ 
    movl -8(%ebp), %eax 
    movl -4(%ebp), %edx 
    addl %edx, %eax 

    /* c's address is %ebp - 12 */ 
    movl %eax, -12(%ebp) 

    /* return 0 */ 
    movl $0, %eax 
    leave 
    ret 

Como se puede ver, en este caso , las direcciones de variables se calculan como compensaciones de un puntero base de una función. Si habilita las optimizaciones, los valores de las variables pueden almacenarse en registros.

+0

MUCHAS GRACIAS. Tuviste el problema de explicarme el código asm interno. No solo respondiste a mi pregunta, sino que también satisfizo mi curiosidad y me hizo querer aprender a ensamblar. Felicitaciones a usted Sr. –

+0

Una cosa más si no es demasiado pedir. ¿Significan esas compensaciones por ejemplo:% ebp -12 = menos 12 direcciones que cuentan desde la base? –

+0

@ JoãoSilva si% ebp es 0xffffcfe8, la dirección de c será 0xffffcfe8 - 4 = 0xffffcfdc, si eso es lo que está preguntando. – kharvd

7

Se es específico de la implementación.

Por lo general, la ubicación de las variables se basará en todo tipo de factores y optimizaciones. Es posible que no vivan en la memoria RAM, ya que pueden optimizarse para vivir completamente dentro de los registros, o optimizarse completamente.

Los nombres de las variables no existen en el tiempo de ejecución; son descartados durante la compilación. Sin embargo, el compilador puede emitir información de depuración almacenada en el binario de la aplicación, para permitir a los desarrolladores depurar la aplicación. Sin embargo, esto generalmente se elimina en las versiones de lanzamiento.

No tengo ni idea acerca de los detalles de Gameshark. Pero en muchos casos, la ubicación de una variable en particular puede determinarse observando el código de máquina para la aplicación.

+0

Tu publicación no aparecía. Lo siento. Acerca de las variables: ¿Qué hace el compilador con los nombres var?Acerca de la pregunta de la base de datos de Cheat: ¿Usted dice que la ubicación de una variable puede determinarse mediante el código de máquina? ¿eso significa que una variable siempre recibe la misma dirección? –

+0

@ JoãoSilva: Su pregunta original no tiene sentido, el compilador no "compila nombres de variables". Mi respuesta es un intento de explicar lo que creo que quieres saber. –

+0

@ JoãoSilva El compilador descarta nombres de variables. –

1

Así que hay dos partes para esto, y haré todo lo posible.

Al compilar, un compilador convertirá el código de C++ en una representación interna. Esto se convierte luego en el uso de los registros de la CPU de la manera más eficiente posible, y empujando el resto de los datos a la memoria RAM. A medida que el programa se ejecuta, los datos del ariete se copiarán de un lado a otro en los registros.

En su otra pregunta, un método que he visto que las personas usan para esto es por el oro que tiene un usuario. Un programa podría tomar todo el espacio de la memoria del juego y copiarlo. Luego, el usuario hace algo (una acción mínima) para ganar o perder oro. Luego, la aplicación externa busca en todo el espacio de la memoria los valores que han cambiado, y lo que anteriormente era la cantidad original de oro, y cuál es ahora la cantidad actual de oro. Una vez que encuentran esta ubicación, pueden editar la ubicación de la memoria y actualizarla con el valor que deseen.

En general, cuanto más complicado es el juego, más difícil es el método.

+0

Gracias por su respuesta. Lamento estar tan confundido, pero imagina esto: int a = 5; a = 6; su primera explicación no me dice cómo el programa sabe qué valor cambiar. Por otro lado, su segunda respuesta explica el proceso de búsqueda de valores en la memoria como lo hace cheatengine. Eso ya lo sabía. Mi pregunta era acerca de las bases de datos de trucos que contienen lo que parecen direcciones, como si la misma dirección siempre tiene la misma variable en cualquier consola (consola de videojuegos) cada vez que se ejecuta el programa. Lo siento si no estoy seguro. Mi inglés simplemente no me está ayudando. –

+0

@ JoãoSilva: muchos sistemas están implementando [ASLR] (http://en.wikipedia.org/wiki/Address_space_layout_randomization), lo que dificultaría esa tarea. –

Cuestiones relacionadas