Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 [ 4 ] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

SCASW

Сканирование строки по словам (Scan string word)

Команда сравнивает содержимое регистра АХ с 16-разрядным содержимым ячейки памяти, адресуемой регистрами ES: DI, вычитая второй операнд (содержимое ячейки памяти) из первого (содержимое АХ), устанавливает признаки результата, после чего в зависимости от значения DF содержимое регистра D1 увеличивается или уменьшается на 2.

Префиксы повторения - REP, REPZ/REPE, REPNZ/REPNE

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

Повторять СХ раз (Repeat)

Префикс заставляет процессор выполнить стоящую за ним строковую команду СХ раз, уменьшая его содержимое на 1 при каждом очередном ее выполнении. Обычно используется с командами LODS, MOVS, STOS.

REPZ/REPE

Повторять пока нуль/повторять пока равно (Repeat while zero /equal)

Префикс заставляет процессор выполнить стоящую за ним строковую команду не более СХ раз, уменьшая его содержимое на 1 при каждом очередном ее выполнении. Выполнение команды прекращается, если флаг ZF равен нулю. Обычно используется с командами CMPS, SCAS.

REPNZ/REPNE

Повторять пока не нуль/повторять пока не равно (Repeat while not zero /equal)

Префикс заставляет процессор выполнить стоящую за ним строковую команду не более СХ раз, уменьшая его содержимое на 1 при каждом очередном ее выполнении Выполнение команды прекращается, если флаг ZF равен единице. Обычно используется с командами CMPS, SCAS.

Примеры

..-== Данные ===================

DB lOOh DUP (?)

DB Строка текста

= $ - Str

Buf Str

StrLen Table DW

89601, 8Eh, 95h, 96h, 0A6h DW OAFh, OBlh, 0C3h, 0E7h

-Addr DD Table

TSize = $ - Table

.==== Команды ==============================

eld push pop mov

mov movsb

ds es

si, OFFSET Str di, OFFSET Buf cx, StrLen

; Направление движения по строке

; DS: SI -> строка Str

; .ES: DI -> буфер Buf

; Длина строки

; Пересылка строки в буфер

eld ; Направление поиска

les di, TAddr ; ES: DI - адрес т.аблиш Table

mov cx, TSize ; Размер таблицы

mov ax, OAFh ; Искомый элемент

repnz scasw ; Поиск первого элемента таблицы,

; равного искомому

jnz NoElem ; Искомый элемент в таблице отсутствует

dec di

dec di ; Элемент найден,

; ES: DI - адрес этого элемента

Примечания.

1) Если необходимо зарезервировать ячейку памяти, не определяя конкретного значения, вместо константы или выражения указывается вопросительный знак.

2) Для повторения значений используется зарезеовированное слово DUP (Duplicate).

Команды ввода-вывода - IN, OUT N приемник, источник

Ввод информации из порта ввода-вывода

ран " читает байт или слово из порта Ввода-вывода, адрес которого указан в опе-Де-источнике, и помешает его в регистр-приемник, в качестве которого можно



Исходный текст профаммы заканчивается директивой END, завершающей трансляцию, ей указывается точка входа в профамму.

1.2.2. Структура программ типа .ЕХЕ и .СОМ

Рассмотрим типичные структуры программ типа .ЕХЕ и .СОМ. В профамме типа .ЕХЕ в общем случае для профаммы, данных и стека предусматриваются отдельные сегменты. Профамма типа состоит из единственного сегмента, в котором размещаются команды программы, данные н стек.

Примеры

==== riporpaMiMa типа .ЕХЕ.

..MODEL small .STACK lOOh .DATA

Здесь определяются данные, необходимые программе

.CODE Команды

Begin:

ах, @data ds, ax

mov ax, 4C00h int 21h

END Begin

Точка входа - первая выполняемая команда Первые выполняемые команды программы - инициализация сегментного регистра DS

Последние выполняемые

команды програм.мы - вызов системной

функции "Завершение процесса".

Точка входа - метка Begin

Примечания.

1) Константа транслятора @data формирует непосредственный операнд, значение которого равно сегментному адресу начала

сегмента данных.

2) В первых строках программы происходит инициализация регистра DS, только после которой программа может обращаться к данным.

При загрузке профамма типа .ЕХЕ размещается в памяти, как показано на рис. Ь2 Образ программы начинается с префикса программного сегмента - PSP, образуемого и заполняемого системой. Объем PSP всегда равен 256 байтам. PSP содержит даннЫ используемые системой при выполнении профаммы. Сегментные регистры автоматическ" инициализируются следующим образом:

щ DS и ES указывают на начало PSP, что дает возможность профамме, сохранив значение одного из нюс, обращаться к содержимому PSP;

g CS указывает на начало сегмента кода, в IP при этом загружается относительный адрес точки входа;

щ SS указывает на начало сегмента стека, в SP при этом загружается смещение конца сегмента стека.

D5, Е5

lOOh байтов

Сегмент команд (сегмент кода)

Первая команда программы

Сегмент данных

Сегмент стека

Точка входа

Рис. 1.2.1. Образ памяти программы Tufta .ЕХЕ

Примеры

-= Программа типа .СОМ.

.MODEL tiny .CODE

lOOh ; Выделение места для PSP

imp Nextlnstr ; Точка входа - первая команда после PSP

Здесь определяются данные, необходимые программе Nextlnstr: Команды

ах, 4C00h 21h

; Последние выполняемые команды ; программы - вызов системной ; функции "Завершение процесса".

Здесь также Begin

можно определить данные

; Точка входа - метка

2) з ORG lOOh резервирует место для PSP.

"Рограмш" ДРективы ORG lOOh должна стоять первая команда




40 Ассемблер в задачах защиты uнфopмaцutJ

При загрузке программа типа .СОМ размещается в памяти, как показано на рис. 1.2.2 Образ программы по-прежнему начинается с префикса программного сегмента - Psp (Program Segment Prefix). Заполняет его система, однако место для него должен выделять профаммист. Объем PSP всегда равен 256 байтам. PSP содержит данные, используемые системой при выполнении программы. Сегментные регистры инициализируются автоматически и указывают на начало единственного сегмента. CS, DS, ES, SS

PSP

lOO/i байтов

Первая команда программы

Команды и данные

Стек

Точка входа

Рис. 1.2.2. Образ памяти программы типа .СОМ

1.2.3. Последовательность разработки программ

Как видно из рис. 1.2.3, процесс создания программы включает в себя подготовку файла с исходным текстом программы (файл с расширением .ASM), трансляцию его в файл специального вида, называемого объектным файлом (файл с расширением .OBJ), и наконец, компоновку полученного объектного файла в выполняемый файл (файл с расширением .ЕХЕ или .СОМ). После получения выполняемого файла последний можно загрузить и выполнить в DOS (с использованием или без использования отладчика). Если в результате работы созданной программы возникает необходимость в изменении ее алгоритма, весь процесс повторяется сначала.

Ввод исходного текста осуществляется с помощью любого редактора текста, к которому предъявляется единственное требование - отсутствие в создаваемом тексте служебных символов. В процессе трансляции ассемблер помимо объектного файла может сформировать также файл с листингом программы (файл с расширением .LST).

Рассмотрим процесс подготовки программы типа .ЕХЕ с использованием Turbo Assembler фирмы Borland.

Для трансляции MYPROG.ASM в строке приглашения DOS можно, например, ввести команду

tasm /zi myprog, , myprog

Основы программирования на Ассемблере IBM PC 41 Глава 1..........................................................................................................................

ввод с клавиатуры vnnHoro текла программы "Пользованием редаора текста и получение файла myprag-asm

тпансляция исходного текаа

программы с использованием ассемблера и получение файла myprog.obj

Связывание объектного файла

с библиотечными и другими

программами с использованием редактора связей (компоновщика) и получение файла myprog.exe или myprog.com

Рис. 1.2.3. Процедура разработки программы на языке Ассемблера

TASM.EXE - это имя файла с зафузочным модулем Turbo Assemblera. В результате при отсутствии ошибок будет получен зафузочный модуль с полной отладочной информацией в файле с тем же именем и расширением .OBJ, а также файл с тем же именем и расширением .LST, содержащий листинг профаммы.

Чтобы получить зафузочный модуль, содержащий всю необходимую отладочную информацию, запуск компоновщика TLINK.EXE можно выполнить следующим образом: tlink /v myprog

При компоновке профаммы типа .СОМ компоновщик необходимо запускать с ключом /1.

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

myprog

TD.EXE - это имя файла с зафузочным модулем Turbo Debuggera.



0 1 2 3 [ 4 ] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88