Как компилятор С++ компилирует имена переменных?
Я понимаю, что не понял. Мое сомнение, я думаю, можно было бы суммировать в этом:
В исполняемом файле (машинный код), как представлены "переменные"? Являются ли они статическими адресами памяти? Компилятор дает каждому конкретное "имя" (или просто сохраняет тот, который вы им дали)?
Выражается в коде:
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 будут скопированы в регистры.
По вашему другому вопросу, один из методов, который я видел, что люди используют для этого, - это золото, которое имеет пользователь. Программа может забрать всю память в игре и скопировать ее. Затем пользователь делает что-то (минимальное действие), чтобы получить или потерять золото. Затем внешнее приложение выполняет поиск по всему пространству памяти, для каких значений изменилось, и какова ранее была первоначальная сумма золота, а также то, что сейчас является текущим количеством золота. Как только они найдут это местоположение, они смогут отредактировать местоположение памяти и обновить ее любым желаемым значением.
Как правило, чем сложнее игра, тем сложнее этот метод.