Форум программистов, компьютерный форум CyberForum.ru

Извлечение данных из стека - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Проблема с define и typedef http://www.cyberforum.ru/cpp-beginners/thread781574.html
Объясните мне пожалуйста, товарищи... В чем смысл объявлять такие дурацкие дефайны кто это делает? и таких бессмысленных дефайнов, просто кучи!!! Особенно в WinAPI... нельзя ли было просто написать? int wmain(int argc, _TCHAR* argv) и зачем этот *TCHAR?? почему бы не написать int wmain(int argc, wchar_t* argv ? Хоть кто нибудь, объясните зачем это...?
C++ Объясните пожалуйста, как работает код. Указатели Если не сложно, напишите пожалуйста комметнтарии к каждой строке. Никак не могу разобраться. Программа разделяет строку на слова. #include "stdafx.h" #include <iostream> #include <cstdio> using namespace std; int main() { setlocale (0,"rus"); char str; char token; http://www.cyberforum.ru/cpp-beginners/thread781572.html
Записать все двоичные числа по порядку каждую цифру в отдельный элемент массива C++
Дано число p - количество знаков в двоичном числе Нужно записать все двоичные числа по порядку каждую цифру в отдельный элемент массива и посчитать количество единиц в числе. Пример p=3 Массив А кол-во единиц в числах 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 2 1 0 0 1
C++ слияние списков
помогите с написание программы!!! нужно написать программу которая объединяет два упорядоченных списка в один. Функция merge должна получать указатели на первый узел каждого списка, которые необходимо объединить и вернуть указатель на первый узел объединяемого списка!!!
C++ воспроизведение файла из ресурсов http://www.cyberforum.ru/cpp-beginners/thread781565.html
Всем здравствуйте! Скажите, пожалуйста, как можно воспроизвести звук из ресурсов в visual C++?
C++ Указатель на массив символов фрагмент кода: void putX(int x, int y, char** mass); ///////////////////////////////////// // -------- Главная часть -------- // ///////////////////////////////////// int _tmain(int argc, _TCHAR* argv) { char mass= {' '}; int x = 0, y = 0; подробнее

Показать сообщение отдельно
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.02.2013, 02:07     Извлечение данных из стека
типичный код функции с локальными переменными выглядит так.
C++
1
2
3
4
5
6
void func(){
int a;
int b;
a=0;
b=a+1;
}
Я так понял, ты услышал, что локальные переменные пихаются в стек и это тебя смутило.
Т.к. ты решил, что обращаются к ним командами push и pop
Нет, в ассемблере вышеприведённый код возможно будет выглядеть как
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
push ebp;      //сохранить прежнее значение ebp которое было вне функции, 
                    ;//ebp будет сейчас изменён, а до вызова функции в нём могло быть
                   ;// что-то полезное
mov ebp, esp     ;//теперь в ebp хранится вершина стека в момент входа в функцию,
                              ;// т.к. в процессе выполнения стек может расти и esp в  этой роли использовать неудобно: он меняется.
sub esp, 8;     //далее в стек запихивается место под две переменные типа int (8 байт)
                       ; // обрати внимание, что пихать/вынимать из стека можно не только командами push/pop
                       ;    // но и просто "арифметическим" уменьшением/увеличением вершины стека соответственно
mov [ebp+4], 0;   ///обращение к первой переменной
                        ;   // обрати внимание, ты думал, чтобы обратиться к переменной в стеке требуется команда pop 
                         ;// нет, мы специально сохранили в регистре ebp адрес, от которого начинается размещение локальных переменных
mov eax, [ebp+4];
add  eax, 1;
mov [ebp+8], eax;   //вычисления идут и к локальным переменным мы обращаемся, указывая смещение относительно ebp
 
 
add esp, 8;   //перед завершением функции, мы совершаем обратные действия:
                 ;   // назад опускаем вершину стека.
                ;   //( тот же эффект был бы достигнут несколькими командами pop )
pop ebp;   //и восстанавливаем ebp
Компиляторы С++ не обязательно генерируют именно такой код,
Но именно этот код демонстрируют, что имеют в виду, когда говорят "Локальные переменные хранятся в стеке"
 
Текущее время: 16:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru