Архив категории ‘32-битное программирование’

Небольшое отступление: изменение цвета фона окна приложения

    На этом шаге мы рассмотрим пример программы, в которой меняется цвет фона окна приложения.     Студент 4 курса факультета математики и информационных технологий Курганского государственного университета (2006-07 уч.год) Борзов Виталий Викторович представляет решение следующей задачи: в приложении имеется список цветов. Выбор соответствующего цвета приводит к изменению текущего цвета фона окна приложения в соответствии со […]

Оптимизация кода: объектно-ориентированное программирование

    На этом шаге мы рассмотрим представление объектно-ориентированной программы.     Объектно-ориентированное программирование в значительной степени усложняет получаемый исполняемый код. Рассмотрим один простой пример. В следующем листинге представлена программа на C++. #include <stdio.h> #include <string.h> #include <conio.h> class stroka { public: char c[200]; char g[100]; stroka() {strcpy(g,"Privet");} int strcp(); }; stroka::strcp() { strcpy(c,g); return 0; } […]

Оптимизация кода: транслятор Visual C++ 6.0

    На этом шаге мы рассмотрим способы оптимизации транслятором Visual C++ 6.0.     Напомним, что мы рассматриваем оптимизацию следующей C-программы: #include <iostream.h> #include <conio.h> void main() { int i; char a[10]; char b[11]; for(i=0; i<10; i++) { a[i]='a'; *(b+i)='a'; cout << a[i] << " " << b[i] << endl; } getch(); } Текст этой программы […]

Оптимизация кода: транслятор Borland C++ 4.5

    На этом шаге мы рассмотрим как оптимизирует код транслятор Borland C++ 4.5.     Ранее мы пытались восстановить исходный текст программы по ассемблерному коду. Насколько это удалось, можно выяснить, сравнив получившийся текст с исходным. Причина отличия двух текстов программ заключается в том, что транслятор, кроме всего прочего, производит еще оптимизацию кода. Результат оптимизации - принципиальная […]

Функции и процедуры

    На этом шаге мы рассмотрим вызов подпрограмм.     Функции и процедуры идентифицируются достаточно просто. Структуру вызова и внутреннюю часть процедур вы уже хорошо знаете. Остается только напомнить некоторые положения.     Приведем небольшую программу на C++, содержащую обращение к функции: #include<iostream.h> void main() { int x; long cube (int); cout << "Задайте число: "; cin […]

Локальные переменные

    На этом шаге мы рассмотрим определение локальных переменных.     Чаще всего нам приходится работать с локальными переменными. С глобальными переменными мы уже встречались, они хранятся во вполне определенных секциях. Хороший дизассемблер их легко локализует. С локальными переменными часто разбираться гораздо сложнее. Особенно это касается записей или массивов. Хороший дизассемблер значительно упростит задачу. Рассмотрим, например, […]

Управляющие структуры языка С. Циклы

    На этом шаге мы рассмотрим представление циклов.     Укажем две наиболее часто встречающиеся структуры. 1-я структура. L1: . . . . СМР ЕАХ JL L1 2-я структура. L2: СМР ЕАХ, 10 JA L1 . . . . JMP L2 L1:     Первая структура соответствует следующему фрагменту на С: int i; . . . . […]

Управляющие структуры языка С. Оператор switch

    На этом шаге мы рассмотрим представление оператора выбора.     Оператор switch весьма часто употребляется в функциях окон. Хорошее знание его ассемблерной структуры поможет вам легче отыскивать эти функции в море ассемблерного кода. switch (i) { case 1: . . . . . break; case 3: . . . . . break; case 5: . […]

Управляющие структуры языка С. Конструкция If

    На этом шаге мы рассмотрим представление различных конструкций If.     Начиная с этого шага мы рассмотрим некоторые управляющие структуры языка С и их отображение в язык ассемблера. Неполная условная конструкция. if (простое условие) { . . . . } если условие простое, например, i == 1, то оно заменяется следующей последовательностью СМР ЕАХ,1 JNZ […]

Основы анализа кода программ. Переменные и константы

    На этом шаге мы приведем пример анализа кода исполняемого файла.     Большинство исполняемых модулей были написаны на языках высокого уровня и не содержат отладочной информации. Однако анализировать код программы и в этом случае приходится. Для того чтобы ускорить процесс анализа, необходимо знать или, по крайней мере, иметь перед глазами некоторые стандартные ассемблерные структуры, соответствующие […]