2011г.
Количество страниц: 366
Подробно и доходчиво в книге Ассемблер - это просто. Учимся программировать. 2-е изд. Калашников объясняются все основные вопросы программирования на ассемблере. Рассмотрены команды процессоров Intel, 16- и 32-разрядные регистры, основы работы с сопроцессором, сегментация памяти в реальном масштабе времени, управление клавиатурой и последовательным портом, работа с дисками и многое другое. Описано, как разработать безобидный нерезидентный вирус и антивирус против этого вируса, как написать файловую оболочку (типа Norton Commander или FAR Manager) и как писать резидентные программы.
Каждая глава состоит из объяснения новой темы, описания алгоритмов программ, многочисленных примеров и ответов на часто задаваемые вопросы. Во второе издание внесены исправления и добавлены новые примеры. Компакт-диск содержит исходные коды всех примеров, приведенных в книге, с подробными описаниями.
Оглавление книги
Ассемблер - это просто. Учимся программировать. 2-е изд. Калашников
Оглавление Предисловие 1
Несколько советов 2
Ответы на некоторые вопросы 3
ЧАСТЬ I. ЗНАКОМЬТЕСЬ: АССЕМБЛЕР
7
Глава 1. Первая программа
9
1.1. Шестнадцатеричная система счисления 9
1.2. Наша первая программа 12
1.3. Введение в прерывания 13
1.4. Резюме 16
Глава 2. Регистры процессора
17
2.1. Введение в регистры микропроцессоров 8086—80186 17
2.1.1. Регистры данных 17
2.1.2. Регистры-указатели 18
2.1.3. Сегментные регистры 18
2.2. Команды сложения и вычитания 19
2.2.1. Оператор add 19
2.2.2. Оператор sub 19
2.2.3. Оператор inc 20
2.2.4. Оператор dec 21
2.3. Программа для практики 21
Глава 3. Сегментация памяти в реальном режиме
23
3.1. Двоичная система счисления. Бит и байт 23
3.1.1. Как перевести двоичное число в десятичное 25
3.1.2. Как перевести десятичное число в двоичное 25
3.1.3. Как перевести шестнадцатеричное число в десятичное 26
3.2. Сегментация памяти в реальном режиме 26
3.2.1. Исследование программы в отладчике 28
3.3. Наше первое прерывание 32
3.3.1. Что такое ASCII? 32
3.4. Программа для практики 33
3.5. Подведем итоги 34
ЧАСТЬ II. УСЛОЖНЯЕМ ЗАДАЧИ
37
Глава 4. Создание циклов
39
4.1. Еще немного о сегментации памяти 39
4.1.2. Введение в адресацию 39
4.2. Создание циклов 42
4.2.1. Пример высокоуровневой оптимизации 43
4.3. Условный и безусловный переходы 44
4.3.1. Пример низкоуровневой оптимизации 45
4.4. Программа для практики 45
4.4.1. Принцип работы программы 46
Глава 5. Подпрограммы
47
5.1. Исправляем ошибку 47
5.2. Подпрограммы 48
5.3. Программа для практики 51
5.4. Несколько слов об отладчике AFD 53
Глава 6. Работа со стеком
54
6.1. Стек 54
6.2. Программа для практики 61
6.2.1. Оператор nop 61
6.2.2. Хитрая программа 62
Глава 7. Операторы сравнения
64
7.1. Разбор программы из главы 6 64
7.2. Оператор сравнения 66
7.3. Понятия условного и безусловного переходов 69
7.4. Расширенные коды ASCII 69
7.5. Программа для практики 71
Глава 8. Учимся работать с файлами
74
8.1. Программа из прошлой главы 74
8.2. Основы работы с файлами 76
8.3. Программа для практики 82
Глава 9. Работа с файлами
84
9.1. Программа из прошлой главы 84
9.2. Программа для практики 87
ЧАСТЬ III. ФАЙЛОВАЯ ОБОЛОЧКА, ВИРУС, РЕЗИДЕНТ
91
Глава 10. Введение в вирусологию. Обработчик прерываний
93
10.1. Программа из прошлой главы 93
10.2. Вирус 97
10.2.1. Структура и принцип работы вируса 98
Что должен делать вирус? 98
Какой объем памяти занимает вирус? 98
Что может вирус? 98
Какой вирус мы будем изучать? 98
Что будет делать вирус? 98
Как оформляется вирус? 98
10.3. Резидент 99
10.3.1. Подробней о прерываниях 99
10.4. Первый обработчик прерывания 101
10.4.1. Новые операторы и функции прерываний 104
10.5. Работа с флагами процессора 104
10.5.1. Как проверить работу программы? 106
Глава 11. Управление видеоадаптером
109
11.1. Оболочка 109
11.2. Управление видеокартой 112
Глава 12. Повторная загрузка резидента
115
12.1. Резидент 115
12.2. Проверка на повторную загрузку резидента 115
12.3. Команды работы со строками 118
12.4. Использование xor и sub для быстрого обнуления регистров 125
12.5. Задание для освоения информации из данной главы 126
Глава 13. Поиск и считывание файлов: вирус
127
13.1. Теория 127
13.2. Практика 128
13.3. Команда пересылки данных movs 132
13.4. Передача управления программе, расположенной в другом сегменте 134
13.5. Поиск файлов 135
Глава 14. Вывод окна в центре экрана
137
14.1. Модели памяти 137
14.1.1. Почему мы пишем только файлы типа COM? 137
14.1.2. Что такое модель памяти и какие модели бывают? 137
14.2. Оболочка SuperShell 139
14.2.1. Управление курсором 139
14.2.2. Операторы работы со стеком процессора 80286+ 140
14.3. Процедура рисования рамки (окна) 142
14.3.1. Прямое отображение в видеобуфер 142
14.3.2. Процедура Draw_frame 143
Что такое линейный адрес и зачем он нужен? 144
14.4. Практика 145
14.5. Новые операторы 145
Глава 15. Обработка аппаратных прерываний
148
15.1. Теория 148
15.1.1. Сохранение предыдущего вектора прерывания 150
15.1.2. Способы передачи управления на прежний адрес прерывания 151
Первый способ 151
Второй способ 151
15.2. Инструкции ret и retf 152
15.2.1. Оператор ret 152
15.2.2. Оператор retf 153
15.3. Механизм работы аппаратных прерываний. Оператор iret 155
15.4. Практика 157
15.5. Логические команды процессора 159
15.5.1. Оператор or 159
15.5.2. Оператор and 160
15.5.3. Оператор xor 161
15.6. Аппаратные прерывания нашего резидента 162
15.6.1. Аппаратное прерывание 05h 162
15.6.2. Аппаратное прерывание 09h 162
15.6.3. Аппаратное прерывание 1Ch 163
15.7. Резюме 164
Глава 16. Принципы работы отладчиков
165
16.1. Как работает отладчик 165
16.1.1. Прерывание 03h 165
16.2. Способы обойти отладку программы 170
16.2.1. Таблица векторов прерываний 170
16.3. Практика 172
Глава 17. Заражение файлов вирусом
174
17.1. Определение текущего смещения выполняемого кода 174
17.2. Вирус 176
17.2.1. Первые байты "файла-жертвы" 180
17.2.2. Передача управления "файлу-жертве" 181
Глава 18. Высокоуровневая оптимизация программ
183
18.1. Пример высокоуровневой оптимизации 183
18.2. Ошибка в главе 17 184
18.3. Оболочка Super Shell 185
18.3.1. Передача данных процедуре через стек 185
18.3.2. Передача параметров в стеке 192
18.3.3. Вычисление длины строки на стадии ассемблирования 192
18.3.4. Процедуры Copy_scr / Restore_scr (display.asm) 193
18.3.5. Оператор scas 194
18.3.6. Подсчет длины нефиксированной строки 196
18.3.7. Вывод строки на экран путем прямого отображения в видеобуфер 198
18.4. Резюме 199
Глава 19. Создание резидентного шпиона
200
19.1. Резидент 200
19.2. Что нужно вам вынести из этой главы? 204
Глава 20. Финальная версия вируса
205
20.1. Вирус 206
20.1.1. Альтернативы ret, call и jmp 206
20.1.2. Заражение файла 207
20.1.3. Общая схема работы вируса 210
20.2. Резюме 211
Глава 21. Работа с блоками основной памяти
213
21.1. Оболочка SuperShell 213
21.1.1. Теория 213
21.1.2. Практика 214
Новшество первое 214
Новшество второе 215
21.1.3. Оператор test 215
21.2. Работа с основной памятью DOS 219
21.2.1. Управление памятью 219
21.2.2. Считываем файлы в отведенную память 222
Глава 22. Часто задаваемые вопросы
223
Глава 23. Область PSP и DTA. Системные переменные (окружение DOS)
225
23.1. Структура командной строки 226
23.2. Системные переменные (окружение MS-DOS) 227
23.3. Основной резидент 231
23.3.1. Команды безусловного перехода 232
23.3.2. Команды управления флагами 233
23.3.3. Изменение параметров резидента "на лету" 235
23.4. Задание для закрепления сведений из данной главы 237
Глава 24. Резидентный антивирус
238
24.1. Регистры микропроцессоров 80386/80486. Хранение чисел в памяти 238
24.1.1. 16- и 32-разрядные отладчики 240
24.1.2. Директива use16/use32 241
24.1.3. Сопоставление ассемблера и языков высокого уровня 241
24.2. Резидентный антивирус. Практика 242
24.3. Резюме 247
Глава 25. Работа с сопроцессором
248
25.1. Ответы на некоторые вопросы 248
25.2. Введение в работу с сопроцессором 249
25.3. Первая программа с использованием сопроцессора 254
25.4. Вывод десятичного числа с помощью сопроцессора 255
25.5. Оболочка 256
25.5.1. Получение и вывод длинного имени файла 256
Глава 26. История развития ПК
258
26.1. Краткая история развития IBM-совместимых компьютеров 258
26.2. С чего все начиналось 259
26.3. Оболочка 260
26.3.1. Чтение файлов из каталога и размещение их в отведенной памяти 261
26.3.2. Размещение файлов в памяти нашей оболочки 262
Глава 27. Удаление резидента из памяти
264
27.1. Обзор последнего резидента 264
27.1.1. Перехват прерывания 21h 264
27.1.2. Как удалять загруженный резидент из памяти? 267
27.1.3. Случаи, когда резидент удалить невозможно 268
27.2. Практика 269
Глава 28. Алгоритм считывания имен файлов в память
271
28.1. Новый алгоритм считывания файлов в память 271
28.2. Процедура вывода имен файлов на экран 273
28.3. Новые переменные в оболочке 274
28.4. Обработка клавиш
и
276
28.5. Обработка клавиш и 276
Глава 29. Загрузка и запуск программ
278
29.1. Подготовка к запуску программы и ее загрузка 278
29.1.1. Выделяем память для загружаемой программы 279
Зачем необходимо урезать память перед загрузкой? 279
Зачем во второй строке мы сдвигаем на 4 бита вправо это смещение? 280
А для чего увеличиваем bx на единицу (3)? 280
29.1.2. Переносим стек в область PSP 280
29.1.3. Подготовка EPB 281
Еще несколько слов о системных переменных (сегменте окружения DOS) 282
Для чего нужно создавать свое окружение DOS? 283
Сегмент и смещение командной строки 283
Первый и второй адрес блоков FCB 284
29.1.4. Сохранение регистров 284
29.1.5. Запуск программы 285
29.2. "Восстановительные работы" 286
Глава 30. Работа с расширенной памятью
288
30.1. Расширенная (XMS) память. Общие принципы 288
30.2. Программа XMSmem.asm. Получение объема XMS-памяти 289
30.2.1. Подготовка к использованию расширенной памяти и вывод объема XMS-памяти 289
30.3. Программа XMSblock.asm. Чтение файла в расширенную память и вывод его на экран 291
30.3.1. Работа с расширенной памятью 293
30.3.2. Структура массива при работе с XMS-памятью 293
30.4. Программа XMScopy.asm. Копирование файла с использованием расширенной памяти 294
Глава 31. Обзор дополнительных возможностей оболочки
296
31.1. Оболочка Super Shell 296
31.1.1. Вызов внешних вспомогательных программ 297
31.1.2. Редактирование файла 298
31.2. Антивирусные возможности оболочки 299
31.2.1. Как защитить компьютер от заражения его резидентными вирусами 299
31.2.2. Как защитить компьютер от программ-разрушителей дисковой информации 300
Глава 32. Все о диске и файловой системе
302
32.1. Что находится на диске? 302
32.1.1. Таблица разделов жесткого диска 302
32.1.2. Загрузочный сектор 303
32.1.3. Таблица размещения файлов (FAT) 304
32.2. Удаление и восстановление файла 305
32.3. Ошибки файловой системы 306
32.3.1. Потерянные кластеры файловой системы FAT, FAT32 306
П Р И Л О Ж Е Н И Я 307
Приложение 1. Ассемблирование программ (получение машинного кода из ассемблерного листинга) 309
П1.1. Загрузка MASM 6.10—6.13 309
П1.2. Ассемблирование 309
П1.3. Компоновка 310
П1.3.1. Ассемблирование и компоновка программ пакетами Microsoft (MASM) 311
Приложение 2. Типичные ошибки при ассемблировании программы 312
Приложение 3. Таблицы и коды символов 313
П3.1. Основные символы ASCII 313
П3.2. Расширенные коды ASCII 320
П3.3. Скан-коды клавиатуры 322
Приложение 4. Содержимое компакт-диска 324
Предметный указатель 325
VI Оглавление VII Оглавление