Работа со строками. В ассемблере под строкой понимается последовательность соседних байтов или слов. В связи с этим все строковые команды имеют две разновидности - для работы со строками из байтов (в мнемонику операций входит буква B) и для работы со строками из слов (в мнемонику входит W).
Имеются следующие операции над строками:
ü пересылка элементов строк (в память, из памяти, память-память);
ü сравнение двух строк;
ü просмотр строки с целью поиска элемента, равного заданному.
Каждая из этих операций выполняется только над одним элементом строки, однако, одновременно происходит автоматическая настройка на следующий или предыдущий элемент строки.
Имеются специальные команды повторения (REP и др.), которые заставляют следующую за ними строковую команду многократно повторяться (до 216 раз), в связи с чем, такая пара команд позволяет обработать всю строку, причем намного быстрее, чем запрограммированный цикл.
Команда Lea. LEA SI,<начальный/конечный адрес строки> Если же надо загрузить сразу оба регистра DS и SI, тогда можно воспользоваться командой LDS SI,m32 которая в регистр SI заносит первое слово, а в регистр DS - второе слово из двойного слова, имеющего адрес m32 (таким образом, по адресу m32+2 должен храниться сегмент, а по адресу m32 - смещение начального или конечного элемента строки). Начальную загрузку регистров ES и DI обычно осуществляют одной командойDI,m32 которая действует аналогично команде LDS. Перечислим вкратце строковые команды ассемблера.
Команда загрузки элемента строки в аккумулятор (LODSB или LODSW) пересылает в регистр AL или AX очередной элемент строки, на который указывает пара DS:SI, после чего увеличивает (при DF=0) или уменьшает (при DF=1) регистр SI на 1 или 2. Команда записи аккумулятора в строку (STOSB или STOSW) заносит содержимое регистра AL или AX в тот элемент строки, на который указывает пара ES:DI, после чего изменяет регистр DI на 1 или 2.
Команда пересылки строк (MOVSB или MOVSW) считывает элемент первой строки, определяемый парой DS:SI, в элемент второй строки, определяемый парой ES:DI, после чего одновременно меняет регистры SI и DI.
Команда сравнения строк (CMPSB или CMPSW) сравнивает очередные элементы строк, указываемые парами DS:SI и ES:DI, и результат сравнения (равно, меньше и т.п.) фиксирует в флагах, после чего меняет регистры SI и DI.
Команда сканирования строки (SCASB или SCASW) сравнивает элемент строки, адрес которого задается парой ES:DI, со значением регистра AL или AX и результат сравнения фиксирует в флагах, после чего меняет содержимое регистра DI.
Перед любой строковой командой можно поставить одну из двух команд, называемых "префиксами повторения", которая заставит многократно повториться эту строковую команду.
Команды переходов. В систему команд ассемблера входит обычный набор команд перехода: безусловные и условные переходы, переходы с возвратами и др.
По способу изменения счетчика команд переходы делятся на абсолютные и относительные. Если в команде перехода указан адрес (смещение) той команды, которой надо передать управление, то это абсолютный переход.
Однако в команде может быть указана величина (сдвиг), которую надо добавить к текущему значению регистра IP, чтобы получился адрес перехода, и тогда это будет относительный переход при этом сдвиг может быть положительным и отрицательным, так что возможен переход вперед и назад.
По величине сдвига относительные переходы делятся на короткие (сдвиг задается байтом) и длинные (сдвиг - слово).
Абсолютные же переходы делятся на прямые и косвенные:
при прямом переходе адрес перехода задается в самой команде, а при косвенном - в команде указывается регистр или ячейка памяти, в котором (которой) находится адрес переходано в зависимости от типа операнда, ассемблер формирует разные машинные команды. 1) Внутрисегментный относительный короткий переход.
Циклы. Цикл это ничего более, чем блок кода, который заканчивается условным переходом так, что этот код может выполняться постоянно, до тех пор, пока не выполнится условие окончания. Циклы используются для обработки массивов, проверки статуса портов ввода-вывода, пока не будет достигнуто определенное состояние, очистки блоков памяти, чтения строк с клавиатуры, вывода строк на экран и т.п. Поэтому они часто используются, и Ассемблер предоставляет несколько специальных инструкций для циклов: LOOP, LOOPE, LOOPNE и JCXZ.
Когда Вам нужен цикл, который повторяется до тех пор, пока счетчик не достигнет нуля, загрузите счетчик в CX и используйте инструкцию LOOP.
Процедуры в языке ассемблера. команде CALL, когда надо вызвать процедуру. Это же имя должно быть повторено в директиве ENDP, заканчивающей описание процедуры.
Предложения между этими двумя директивами образуют тело процедуры (подпрограмму).
Имя процедуры является фактически меткой первой из команд тела, поэтому данную команду не надо специально метить
Прерывания INT. Команда INT прерывает обработку программы, передает управление в DOS или BIOS для определенного действия и затем возвращает управление в прерванную программу для продолжения обработки.
Наиболее часто прерывание используется для выполнения операций ввода или вывода.
Формат команды INT тип_прерывания
Для выхода из программы на обработку прерывания и для последующего
возврата команда INT выполняет следующие действия: - уменьшает указатель стека
на 2 и заносит в вершину стека содержимое флагового регистра; - очищает флаги
TF и IF; - уменьшает указатель стека на 2 и заносит содержимое регистра CS в
стек; - уменьшает указатель стека на 2 и заносит в стек значение командного
указателя; - вычисляет адрес вектора прерывания, умножая тип_прерывания на 4;
загружает второе слово вектора прерываний в регистр CS; загружает в IP первое
слово вектора прерывания; -обеспечивает выполнение необходимых действий; -
восстанавливает из стека значение регистра и возвращает управление в прерванную
программу на команду, следующую после INT.
1.2 Практическая часть
Тема: Регистры, памяти и логическая адресация
Задание: Написать программу “Получение данных из командной строки” на языке Ассемблер
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.486
.model flat, stdcall: none/masm32/include/windows.inc/masm32/include/user32.inc/masm32/include/kernel32.inc/masm32/lib/user32.lib/masm32/lib/kernel32.lib/masm32/macros/macros.asmmasm32, comctl32, ws2_32
.code:0$("Command Line")0
3)Выполнил отладку программы командой project-run program
4)Создал exe-файл
Рис.2
)Запустил программу OllyDbg.Просмотрел
код
Рис.3
Лабораторная работа №2
Тема: Передача параметров через стек
Задание 1: Передача параметров через стек, возврат результата через регистр EAX.
)Запустил программу MASM32 Editor
)Написал текст исходного кода
стек программирование регистр
.686
.model flat, c
optioncasemap: none\masm32\include\windows.inc\masm32\include\kernel32.inc\masm32\lib\kernel32.lib
.data76dd-8?
.code:baProcedureesp,8,eax0proc,[esp+4],[esp+8],edx
)Выполнил отладку программы командой project-run program
4)Создал exe-файл
Рис.4
)Запустил программу OllyDbg.Просмотрел
код
Рис.5
Задание 2: Передача параметров через стек, возврат результат по адресу.
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.486
.model flat, stdcall:none/masm32/include/windows.inc/masm32/include/kernel32.inc/masm32/lib/kernel32.lib
.data76dd-8?
.code:offset dbaProcedure,
8,eax0proc,[esp+4],[esp+8],edx,[esp+12][edx],eaxendp
3) Выполнил отладку программы командой project-run program
)Создал exe-файл
Рис.6
)Запустил программу OllyDbg.Просмотрел
код
Рис.7
Лабораторная работа №3
Тема: Команды обработки данных на языке Ассемблер.
Задание: Сложение двух чисел
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.486
.model flat, stdcall
optioncasemap:none/masm32/include/windows.inc/masm32/include/user32.inc/masm32/include/kernel32.inc/masm32/lib/user32.lib/masm32/lib/kernel32.lib/masm32/macros/macros.asmmasm32,comctl32,ws2_32
.data
.code:, 123, -90, ebx, eaxzeroMessageBox,0, chr$("Вeaxне 0!"), chr$("info"), 0:, 0, chr$("Вeax 0!"),
chr$("info"), 0:, 0
) Выполнил отладку программы командой project-run program
4)Создал exe-файл
Рис.8
5)Запустил программу OllyDbg.Просмотрел
код
Рис.9
Лабораторная работа №4
Тема: Применение команд цикла на языке Ассемблер
Задание 1:Организация цикла.Repeat
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.486
.model flat, stdcall
.data_titledb "Title",0DB 1h128 dup(?)"%d",0
.code:AL, A
.REPEATAL
.UNTIL AL==7, addr buffer, addr format, AL, 0, addr buffer,
addrmsg_title, MB_OK, 0
) Выполнил отладку программы командой project-run program
)Создал exe-файл
Рис.10
)Запустил программу OllyDbg.Просмотрел
код
Рис.11
Задание 2: Организация цикла While
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.486
.model flat, stdcall
optioncasemap:none/masm32/include/windows.inc/masm32/include/user32.inc/masm32/include/kernel32.inc/masm32/lib/user32.lib/masm32/lib/kernel32.lib/masm32/macros/macros.asmmasm32,comctl32,ws2_32
.data_titledb "Title",0DB 1h128 dup(?)"%d",0
.code:, 1, 1
.WHILE edx==1
.IF eax==7
.BREAK
.ENDIF
.ENDW, addr buffer, addr format, AL, 0, addr buffer,
addrmsg_title, MB_OK, 0 endstart
)Выполнил отладку программы командой project-run program
)Создал exe-файл
Рис.12
)Запустил программу OllyDbg.Просмотрел
код
Рис.13
Лабораторная работа 5
Тема: Программирование действий с массивами данных на языке Ассемблер
Задание: Сумма всех элементов массива
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.486
.model flat, stdcall
option casemap:none/masm32/include/windows.inc/masm32/include/user32.inc/masm32/include/kernel32.inc/masm32/lib/user32.lib/masm32/lib/kernel32.lib/masm32/macros/macros.asmmasm32,comctl32,ws2_32
.data_title db "Title",0DB 1hdd 0,1,2,3,4,5,6,7,8,9,10,11dd 12db 128 dup(?)db "%d", 0
.code:eax, 0ecx, nedx, 0
L:add eax, x[ebx]ebx, type xecxecx, 0Lwsprintf, addr buffer,
addr format, ALMessageBox, 0, addr buffer, addr msg_title, MB_OKExitProcess,
0start
)Выполнил отладку программы командой project-run program
4)Создал exe-файл
Рис.14
)Запустил программу OllyDbg.Просмотрел
код
Рис.15
Лабораторная работа 6
Тема: Особенности работы с процедурами на языке Ассемблер
Задание 1:Передача параметров и возврат из процедуры с использованием соглашения о вызовах stdcall
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.686
.model flat, stdcallcasemap:none/masm32/include/windows.inc/masm32/include/kernel32.inc/masm32/lib/kernel32.lib
.datadd 0dd 4
.code:yxProcedure0ExitProcessproc8endpprogram
)Выполнил отладку программы командой project-run program
)Создал exe-файл
Рис.16
)Запустил программу OllyDbg.Просмотрел
код
Рис.17
Задание 2: Передача параметров и возврат из процедуры с использованием соглашения о вызовах cdecl
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.686
.model flat, сcasemap:none/masm32/include/windows.inc/masm32/include/kernel32.inc/masm32/lib/kernel32.lib
.code:yxProcedureesp, 80procendpprogram
) Выполнил отладку программы командой project-run program
)Создал exe-файл
Рис.18
)Запустил программу OllyDbg.Просмотрел
код
Рис.19
Задание 3: Рекурсивная процедура вычисления факториала целого беззнакового числа. Процедура получает параметр через стек и возвращает результат через регистр EAX
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.686
.model flat, ccasemap:none/masm32/include/windows.inc/masm32/include/kernel32.inc/masm32/lib/kernel32.lib
.datadd 76dd -8dd ?
.code
program:offset dbafactorialesp, 8d,
eax0proceax,[esp+4]eax,eaxL1eaxeaxfactorialesp,4dword ptr[esp+4]L2:inc
eax:retendpprogram
)Выполнил отладку программы командой project-run program
4)Создал exe-файл
Рис.20
)Запустил программу OllyDbg.Просмотрел
код
Рис.21
Лабораторная работа 7
Тема: Работа со строками в языке Ассемблер.
Задание: Расчет формулы
на Ассемблере
)Запустил программу MASM32 Editor
)Написал текст исходного кода
.486
.model flat, stdcallcasemap:none/masm32/include/windows.inc/masm32/include/user32.inc/masm32/include/kernel32.inc/masm32/lib/user32.lib/masm32/lib/kernel32.lib/masm32/macros/macros.asmmasm32,comctl32,ws2_32
.data_title db "Title", 0DB 1hdd 0,1,2,3,4,5,6,7,8,9,10,11dd 12db 128 dup(?)db "%d", 0
.code:eax, 0ecx, nedx, 0:add eax, x[ebx]ebx, type xecxec[,
0Lwsprintf, addr buffer, addr format, ALMessageBox, 0, addr buffer, addr
msg_title, MB_OKExitProcess, 0start
) Выполнил отладку программы командой project-run program
4)Создал exe-файл
Рис.22
)Запустил программу OllyDbg.Просмотрел
код
Рис.23
2.Основы HTML
.1 Теоретическая часть
.1.1 Работа с текстом, изображения, мультимедия
Теги заголовков - <H1>,<H2>,<H3>,<H4>,<H5>,<H6>.
Всего 6 видов заголовков - от H1 до H6. Тегу H1 соответствует самый большой заголовок, тегу H6 - самый маленький. Закрывающий тег обязателен.
Атрибуты:
align- выравнивает заголовок в соответствии со следующими значениями:по центру.по левому краю.по правому краю.всплывающая подсказка.
Тег <p> создает новый параграф.
Атрибуты:выравнивает параграф относительно одной из сторон документа.выравнивание по правому краю (По умолчанию ).выравнивание по правому краю.выравнивание по центру.выравнивание по ширине.- всплывающая подсказка.
Контейнер <b> </b> выделяет текст жирным шрифтом.
Аналогичный тег - <strong> </strong>, он тоже выделяет текст
жирным. Но его не рекомендуется использовать больше 1-2 раз на странице - при
большом количестве тегов <strong> на странице поисковые системы могут
воспринять это как спам.
Атрибуты:- Всплывающая подсказка.
Тег <hr> добавляет в документ горизонтальную линию.
Закрывающий тег не обязателен.
Атрибуты:Устанавливает толщину линии.Устанавливает ширину линии в пикселах или процентах.Создает линию без тени.Задает линии определенный цвет.
<hr noshade="noshade" width="80%" color="#00FF33" />.
Тег <br /> переводит текст на новую строку.
Закрывающий тег не обязателен.
Очень длинный текст, который нужно разбить на две строки.
Очень длинный текст, но уже разбитый на две строки вставкой тега <br /> после слова "текст,".