МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусология

    целях". Исходное содержимое регистров изатекается из стека после возврата

    из подпрограммы. Другой распространенный прием - передача подпрограмме

    требуемых ею параметров через стек. Подпрограмма, зная, в каком порядке

    помещены в стек параметры, может забрать их оттуда и использовать при своем

    выполнении. Отличительной особенностью стека является своеобразный порядок

    выборки содержащихся в нем данных: в любой момент времени в стеке доступен

    только верхний элемент, т.е. элемент, загруженный в стек последним.

    Выгрузка из стека верхнего элемента делает доступным следующий элемент.

    Элементы стека располагаются в области памяти, отведенной под стек, начиная

    со дна стека (т.е. с его максимального адреса) по последовательно

    уменьшающимся адресам. Адрес верхнего, доступного элемента хранится в

    регистре-указателе стека SP. Как и любая другая область памяти программы,

    стек должен входить в какой-то сегмент или образовывать отдельный сегмент.

    В любом случае сегментный адрес этого сегмента помещается в сегментный

    регистр стека SS. Таким образом, пара регистров SS:SP описывают адрес

    доступной ячейки стека: в SS хранится сегментный адрес стека, а в SP -

    смещение последнего сохраненного в стеке данного (рис. 4, а). Обратитим

    внимание на то, что в исходном состоянии указатель стека SP указывает на

    ячейку, лежащую под дном стека и не входящую в него.

    [pic]

    Рис 4. Организация стека: а - исходное состояние, б - после загрузки одного

    элемента (в данном примере - содержимого регистра АХ), в - после загрузки

    второго элемента (содержимого регистра DS), г - после выгрузки одного

    элемента, д - после выгрузки двух элементов и возврата в исходное

    состояние.

    Загрузка в стек осуществляется специальной командой работы со стеком

    push (протолкнуть). Эта команда сначала уменьшает на 2 содержимое указателя

    стека, а затем помещает операнд по адресу в SP. Если, например, мы хотим

    временно сохранить в стеке содержимое регистра АХ, следует выполнить

    команду

    push АХ

    Стек переходит в состояние, показанное на рис. 1.10, б. Видно, что

    указатель стека смещается на два байта вверх (в сторону меньших адресов) и

    по этому адресу записывается указанный в команде проталкивания операнд.

    Следующая команда загрузки в стек, например,

    push DS

    переведет стек в состояние, показанное на рис. 1.10, в. В стеке будут

    теперь храниться два элемента, причем доступным будет только верхний, на

    который указывает указатель стека SP. Если спустя какое-то время нам

    понадобилось восстановить исходное содержимое сохраненных в стеке

    регистров, мы должны выполнить команды выгрузки из стека pop (вытолкнуть):

    pop DS

    pop AX

    Какого размера должен быть стек? Это зависит от того, насколько

    интенсивно он используется в программе. Если, например, планируется хранить

    в стеке массив объемом 10 000 байт, то стек должен быть не меньше этого

    размера. При этом надо иметь в виду, что в ряде случаев стек автоматически

    используется системой, в частности, при выполнении команды прерывания int

    21h. По этой команде сначала процессор помещает в стек адрес возврата, а

    затем DOS отправляет туда же содержимое регистров и другую информацию,

    относящуюся к прерванной программе. Поэтому, даже если программа совсем не

    использует стек, он все же должен присутствовать в программе и иметь размер

    не менее нескольких десятков слов. В нашем первом примере мы отвели под

    стек 128 слов, что безусловно достаточно.

    Структура программы на ассемблере

    Программа на ассемблере представляет собой совокупность блоков

    памяти, называемых сегментами памяти. Программа может состоять из одного

    или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность

    предложений языка, каждое из которых занимает отдельную строку кода

    программы.

    Предложения ассемблера бывают четырех типов:

    . команды или инструкции, представляющие собой символические аналоги

    машинных команд. В процессе трансляции инструкции ассемблера

    преобразуются в соответствующие команды системы команд

    микропроцессора;

    . макрокоманды — оформляемые определенным образом предложения текста

    программы, замещаемые во время трансляции другими предложениями;

    . директивы, являющиеся указанием транслятору ассемблера на выполнение

    некоторых действий. У директив нет аналогов в машинном представлении;

    . строки комментариев, содержащие любые символы, в том числе и буквы

    русского алфавита. Комментарии игнорируются транслятором.

    Синтаксис ассемблера

    Предложения, составляющие программу, могут представлять собой

    синтаксическую конструкцию, соответствующую команде, макрокоманде,

    директиве или комментарию. Для того чтобы транслятор ассемблера мог

    распознать их, они должны формироваться по определенным синтаксическим

    правилам. Для этого лучше всего использовать формальное описание синтаксиса

    языка наподобие правил грамматики. Наиболее распространенные способы

    подобного описания языка программирования — синтаксические диаграммы и

    расширенные формы Бэкуса—Наура. Для практического использования более

    удобны синтаксические диаграммы. К примеру, синтаксис предложений

    ассемблера можно описать с помощью синтаксических диаграмм, показанных на

    следующих рисунках.

    [pic]

    Рис. 5. Формат предложения ассемблера

    [pic]

    Рис. 6. Формат директив

    [pic]

    Рис. 7. Формат команд и макрокоманд

    На этих рисунках:

    . имя метки — идентификатор, значением которого является адрес первого

    байта того предложения исходного текста программы, которое он

    обозначает;

    . имя — идентификатор, отличающий данную директиву от других одноименных

    директив. В результате обработки ассемблером определенной директивы

    этому имени могут быть присвоены определенные характеристики;

    . код операции (КОП) и директива — это мнемонические обозначения

    соответствующей машинной команды, макрокоманды или директивы

    транслятора;

    . операнды — части команды, макрокоманды или директивы ассемблера,

    обозначающие объекты, над которыми производятся действия. Операнды

    ассемблера описываются выражениями с числовыми и текстовыми

    константами, метками и идентификаторами переменных с использованием

    знаков операций и некоторых зарезервированных слов.

    Как использовать синтаксические диаграммы? Очень просто: для этого нужно

    всего лишь найти и затем пройти путь от входа диаграммы (слева) к ее выходу

    (направо). Если такой путь существует, то предложение или конструкция

    синтаксически правильны. Если такого пути нет, значит эту конструкцию

    компилятор не примет. При работе с синтаксическими диаграммами обратим

    внимание на направление обхода, указываемое стрелками, так как среди путей

    могут быть и такие, по которым можно идти справа налево. По сути,

    синтаксические диаграммы отражают логику работы транслятора при разборе

    входных предложений программы.

    Допустимыми символами при написании текста программ являются:

    1. все латинские буквы: A—Z, a—z. При этом заглавные и строчные буквы

    считаются эквивалентными;

    2. цифры от 0 до 9;

    3. знаки ?, @, $, _, &;

    4. разделители , . [ ] ( ) < > { } + / * % ! ' " ? \ = # ^.

    Предложения ассемблера формируются из лексем, представляющих собой

    синтаксически неразделимые последовательности допустимых символов языка,

    имеющие смысл для транслятора.

    Лексемами являются:

    . идентификаторы — последовательности допустимых символов,

    использующиеся для обозначения таких объектов программы, как коды

    операций, имена переменных и названия меток. Правило записи

    идентификаторов заключается в следующем: идентификатор может состоять

    из одного или нескольких символов. В качестве символов можно

    использовать буквы латинского алфавита, цифры и некоторые специальные

    знаки — _, ?, $, @. Идентификатор не может начинаться символом цифры.

    Длина идентификатора может быть до 255 символов, хотя транслятор

    воспринимает лишь первые 32, а остальные игнорирует. Регулировать

    длину возможных идентификаторов можно с использованием опции командной

    строки mv. Кроме этого существует возможность указать транслятору на

    то, чтобы он различал прописные и строчные буквы либо игнорировал их

    различие (что и делается по умолчанию).

    Команды ассемблера.

    Команды ассемблера раскрывают возможность передавать компьютеру свои

    требования, механизм передачи управления в программе (циклы и переходы) для

    логических сравнений и программной организации. Однако, программируемые

    задачи редко бывают так просты. Большинство программ содержат ряд циклов,

    в которых несколько команд повторяются до достижения определенного

    требования, и различные проверки, определяющие, какие из нескольких

    действий следует выполнять. Некоторые команды могут передавать

    управление, изменяя нормальную последовательность шагов непосредственной

    модификацией значения смещения в командном указателе. Как говорилось ранее,

    существуют различные команды для различных процессоров, мы же будем

    рассматривать ряд некоторых команд для процессоров 80186, 80286 и 80386.

    1. Для описания состояния флагов после выполнения некоторой команды будем

    использовать выборку из таблицы, отражающей структуру регистра флагов

    eflags:

    Назначение: сложение двух операндов источник и приемник размерностью байт,

    слово или двойное слово.

    Алгоритм работы:

    . сложить операнды источник и приемник;

    . записать результат сложения в приемник;

    . установить флаги.

    Состояние флагов после выполнения команды:

    Назначение:

    . передача управления близкой или дальней процедуре с запоминанием в

    стеке адреса точки возврата;

    . переключение задач.

    Алгоритм работы:

    определяется типом операнда:

    . метка ближняя — в стек заносится содержимое указателя команд eip/ip и

    в этот же регистр загружается новое значение адреса, соответствующее

    метке;

    . метка дальняя — в стек заносится содержимое указателя команд eip/ip и

    cs. Затем в эти же регистры загружаются новые значения адресов,

    соответствующие дальней метке;

    . r16, 32 или m16, 32 — определяют регистр или ячейку памяти, содержащие

    смещения в текущем сегменте команд, куда передается управление. При

    передаче управления в стек заносится содержимое указателя команд

    eip/ip;

    . указатель на память — определяет ячейку памяти, содержащую 4 или 6-

    байтный указатель на вызываемую процедуру. Структура такого указателя

    2+2 или 2+4 байта. Интерпретация такого указателя зависит от режима

    работы микропроцессора:

    Состояние флагов после выполнения команды (кроме переключения задачи):

    |выполнение команды не влияет на флаги |

    При переключении задачи значения флажков изменяются в соответствии с

    информацией о регистре eflags в сегменте состояния TSS задачи, на которую

    производится переключение.

    Применение:

    Команда call позволяет организовать гибкую и многовариантную передачу

    управления на подпрограмму с сохранением адреса точки возврата.

    О б ъ е к т н ы й к о д (четыре формата):

    Прямая адресация в сегменте:

    |11101000|disp-low|diep-high|

    Косвенная адресация в сегменте:

    |11111111|mod010r/m|

    Косвенная адресация между сегментами:

    |11111111|mod011r/m|

    Прямая адресация между сегментами:

    |10011010|offset-low|offset-high|seg-low|seg-high|

    CMP

    (CoMPare operands)

    Сравнение операндов

    |Схема команды: |cmp операнд1,операнд2 |

    Назначение: сравнение двух операндов.

    Алгоритм работы:

    . выполнить вычитание (операнд1-операнд2);

    . в зависимости от результата установить флаги, операнд1 и операнд2 не

    изменять (то есть результат не запоминать).

    Состояние флагов после выполнения команды:

    Назначение: уменьшение значения операнда в памяти или регистре на 1.

    Алгоритм работы:

    команда вычитает 1 из операнда. Состояние флагов после выполнения команды:

    Назначение: выполнение операции деления двух двоичных беззнаковых значений.

    Алгоритм работы:

    Для команды необходимо задание двух операндов — делимого и делителя.

    Делимое задается неявно и размер его зависит от размера делителя, который

    указывается в команде:

    . если делитель размером в байт, то делимое должно быть расположено в

    регистре ax. После операции частное помещается в al, а остаток — в ah;

    . если делитель размером в слово, то делимое должно быть расположено в

    паре регистров dx:ax, причем младшая часть делимого находится в ax.

    После операции частное помещается в ax, а остаток — в dx;

    . если делитель размером в двойное слово, то делимое должно быть

    расположено в паре регистров edx:eax, причем младшая часть делимого

    находится в eax. После операции частное помещается в eax, а остаток —

    в edx.

    Состояние флагов после выполнения команды:

    Назначение: вызов подпрограммы обслуживания прерывания с номером

    прерывания, заданным операндом команды.

    Алгоритм работы:

    . записать в стек регистр флагов eflags/flags и адрес возврата. При

    записи адреса возврата вначале записывается содержимое сегментного

    регистра cs, затем содержимое указателя команд eip/ip;

    . сбросить в ноль флаги if и tf;

    . передать управление на программу обработки прерывания с указанным

    номером. Механизм передачи управления зависит от режима работы

    микропроцессора.

    Состояние флагов после выполнения команды:

    |09|08|

    |IF|TF|

    |0 |0 |

    Применение:

    Как видно из синтаксиса, существуют две формы этой команды:

    . int 3 — имеет свой индивидуальный код операции 0cch и занимает один

    байт. Это обстоятельство делает ее очень удобной для использования в

    различных программных отладчиках для установки точек прерывания путем

    подмены первого байта любой команды. Микропроцессор, встречая в

    последовательности команд команду с кодом операции 0cch, вызывает

    программу обработки прерывания с номером вектора 3, которая служит для

    связи с программным отладчиком.

    . Вторая форма команды занимает два байта, имеет код операции 0cdh и

    позволяет инициировать вызов подпрограммы обработки прерывания с

    номером вектора в диапазоне 0–255. Особенности передачи управления,

    как было отмечено, зависят от режима работы микропроцессора.

    О б ъ е к т н ы й к о д (два формата):

    Регистр: |01000reg|

    Регистр или память: |1111111w|mod000r/m|

    JCC

    JCXZ/JECXZ

    (Jump if condition)

    (Jump if CX=Zero/ Jump if ECX=Zero)

    Переход, если выполнено условие

    Переход, если CX/ECX равен нулю

    |Схема команды: |jcc метка |

    | |jcxz метка |

    | |jecxz метка |

    Назначение: переход внутри текущего сегмента команд в зависимости от

    некоторого условия.

    Алгоритм работы команд (кроме jcxz/jecxz):

    Проверка состояния флагов в зависимости от кода операции (оно отражает

    проверяемое условие):

    . если проверяемое условие истинно, то перейти к ячейке, обозначенной

    операндом;

    . если проверяемое условие ложно, то передать управление следующей

    команде.

    Алгоритм работы команды jcxz/jecxz:

    Проверка условия равенства нулю содержимого регистра ecx/cx:

    . если проверяемое условие истинно, то есть содержимое ecx/cx равно 0,

    то перейти к ячейке, обозначенной операндом метка;

    . если проверяемое условие ложно, то есть содержимое ecx/cx не равно 0,

    то передать управление следующей за jcxz/jecxz команде программы.

    Состояние флагов после выполнения команды:

    |JA |CF = 0 и ZF = 0 |если выше |

    |JAE |CF = 0 |если выше или равно |

    |JB |CF = 1 |если ниже |

    |JBE |CF = 1 или ZF = 1 |если ниже или равно |

    |JC |CF = 1 |если перенос |

    |JE |ZF = 1 |если равно |

    |JZ |ZF = 1 |если 0 |

    |JG |ZF = 0 и SF = OF |если больше |

    |JGE |SF = OF |если больше или равно |

    |JL |SF <> OF |если меньше |

    |JLE |ZF=1 или SF <> OF |если меньше или равно |

    |JNA |CF = 1 и ZF = 1 |если не выше |

    |JNAE |CF = 1 |если не выше или равно |

    |JNB |CF = 0 |если не ниже |

    |JNBE |CF=0 и ZF=0 |если не ниже или равно |

    |JNC |CF = 0 |если нет переноса |

    |JNE |ZF = 0 |если не равно |

    |JNG |ZF = 1 или SF <> OF |если не больше |

    Страницы: 1, 2, 3, 4, 5, 6, 7


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.