2012-02-19 3 views
10

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

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

Выраженный в коде:

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

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

--João

ответ

6

Вот простая программа в 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'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 

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

+0

СПАСИБО ВАМ ТАК. Вы столкнулись с трудностями, объясняя мне код внутри asm. Вы не только ответили на мой вопрос, но удовлетворили мое любопытство и заставили меня хотеть учиться сбору. Престижность вам, старший. –

+0

Просто еще одна вещь, если ее не слишком много, чтобы ее просить. Например, эти смещения означают:% ebp -12 = менее 12 адресов, отсчитываемых от базового? –

+0

@ JoãoSilva, если% ebp равно 0xffffcfe8, адрес c будет 0xffffcfe8 - 4 = 0xffffcfdc, если это то, что вы просите. – kharvd

7

Это конкретный вариант реализации.

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

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

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

+0

Все ваше сообщение не показывалось. Прости. О переменных: как то, что делает компилятор для имен var.О задании базы данных о читах: вы говорите, что местоположение переменной может быть определено машинным кодом? означает ли это, что переменной всегда присваивается один и тот же адрес? –

+0

@ JoãoSilva: Ваш оригинальный вопрос на самом деле не имеет смысла, компилятор не компилирует имена переменных. Мой ответ - попытка объяснить, что я думаю, что вы хотите знать. –

+0

@ JoãoSilva Компилятор отбрасывает имена переменных. –

1

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

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

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

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

+0

Благодарим вас за ответ. Извините, что так смущен, но представьте себе: int a = 5; a = 6, ваше первое объяснение не говорит мне, как программа знает, какое значение нужно изменить. С другой стороны, ваш второй ответ объясняет процесс поиска значений в памяти, таких как cheatengine. Это я уже знал. Мой вопрос касался баз данных читов, которые содержат то, что выглядит как адреса, например, если один и тот же адрес всегда содержит одну и ту же переменную в любой консоли (консоль видеоигр) при каждом запуске программы. Извините, если я не понимаю. Мой английский просто не помогает мне. –

+0

@ JoãoSilva: Многие системы внедряют [ASLR] (http://en.wikipedia.org/wiki/Address_space_layout_randomization), что затруднит это. –

Смежные вопросы