Как компилятор С++ компилирует имена переменных?

Я понимаю, что не понял. Мое сомнение, я думаю, можно было бы суммировать в этом:

В исполняемом файле (машинный код), как представлены "переменные"? Являются ли они статическими адресами памяти? Компилятор дает каждому конкретное "имя" (или просто сохраняет тот, который вы им дали)?

Выражается в коде:

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

Как программа в каждом компьютере знает, какой адрес будет удерживать значение 5, чтобы удерживать введенное значение, чтобы добавить 1 к значению, которое оно сейчас имеет, и, наконец, напечатать то же значение.

- João

Ответ 1

Вот простая программа в C:

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

    int c = a + b;

    return 0;
}

Если вы скомпилируете его с помощью gcc -m32 -S -O0 -o main.s main.c под Linux, вы получите что-то вроде этого

    .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 address is %ebp - 4 */
    movl    $5, -4(%ebp)

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

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

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

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

Как вы можете видеть, в этом случае адреса переменных вычисляются как смещения базового указателя функции. Если вы включите оптимизацию, значения переменных могут храниться в регистрах.

Ответ 2

Он специфичен для реализации.

Как правило, расположение переменных будет основываться на всех факторах и оптимизации. Они могут вообще не проживать в ОЗУ, поскольку они могут быть оптимизированы для полноценного проживания внутри регистров или полностью оптимизированы.

Имена переменных не существуют во время выполнения; они отбрасываются во время компиляции. Однако компилятор может испускать отладочную информацию, хранящуюся в двоичном файле приложения, чтобы разработчики могли отлаживать приложение. Обычно это удаляется в версиях версий.

Я понятия не имею о специфике Gameshark. Но во многих случаях местоположение конкретной переменной может быть выяснено, взглянув на машинный код для приложения.

Ответ 3

Итак, есть две части, и я сделаю все возможное.

При компиляции компилятор преобразует код С++ во внутреннее представление. Затем он преобразуется в использование регистров процессора как можно более эффективно и выталкивает остальную часть данных в ОЗУ. По мере выполнения программы данные из RAM будут скопированы в регистры.

По вашему другому вопросу, один из методов, который я видел, что люди используют для этого, - это золото, которое имеет пользователь. Программа может забрать всю память в игре и скопировать ее. Затем пользователь делает что-то (минимальное действие), чтобы получить или потерять золото. Затем внешнее приложение выполняет поиск по всему пространству памяти, для каких значений изменилось, и какова ранее была первоначальная сумма золота, а также то, что сейчас является текущим количеством золота. Как только они найдут это местоположение, они смогут отредактировать местоположение памяти и обновить ее любым желаемым значением.

Как правило, чем сложнее игра, тем сложнее этот метод.