![]() |
|
|
Реферат: Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусологияДопустимыми символами при написании текста программ являются: 1. все латинские буквы: A—Z, a—z. При этом заглавные и строчные буквы считаются эквивалентными; 2. цифры от 0 до 9; 3. знаки ?, @, $, _, &; 4. разделители , . [ ] ( ) < > { } + / * % ! ' " ? \ = # ^. Предложения ассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка, имеющие смысл для транслятора. Лексемами являются:
Команды ассемблера. Команды ассемблера раскрывают возможность передавать компьютеру свои требования, механизм передачи управления в программе (циклы и переходы) для логических сравнений и программной организации. Однако, программируемые задачи редко бывают так просты. Большинство программ содержат ряд циклов, в которых несколько команд повторяются до достижения определенного требования, и различные проверки, определяющие, какие из нескольких действий следует выполнять. Некоторые команды могут передавать управление, изменяя нормальную последовательность шагов непосредственной модификацией значения смещения в командном указателе. Как говорилось ранее, существуют различные команды для различных процессоров, мы же будем рассматривать ряд некоторых команд для процессоров 80186, 80286 и 80386.
Команды (в алфавитном порядке): *Данные команды описаны подробно. ADD(ADDition) Сложение
Назначение: сложение двух операндов источник и приемник размерностью байт, слово или двойное слово. Алгоритм работы:
Состояние флагов после выполнения команды:
Применение: О б ъ е к т н ы й к о д (три формата): Регистр плюс регистр или память: |000000dw|modregr/rm| Регистр AX (AL) плюс непосредственное значение: |0000010w|--data--|data, если w=1| Регистр или память плюс непосредственное значение: |100000sw|mod000r/m|--data--|data, если BW=01| CALL(CALL) Вызов процедуры или задачи
Назначение:
Алгоритм работы:
Состояние флагов после выполнения команды (кроме переключения задачи):
При переключении задачи
значения флажков изменяются в соответствии с информацией о регистре eflags в
сегменте состояния TSS задачи, на которую производится переключение. О б ъ е к т н ы й к о д (четыре формата): Прямая адресация в сегменте: |11101000|disp-low|diep-high| Косвенная адресация в сегменте: |11111111|mod010r/m| Косвенная адресация между сегментами: |11111111|mod011r/m| Прямая адресация между сегментами: |10011010|offset-low|offset-high|seg-low|seg-high| CMP(CoMPare operands) Сравнение операндов
Назначение: сравнение двух операндов. Алгоритм работы:
Состояние флагов после выполнения команды:
Применение: О б ъ е к т н ы й к о д (три формата): Регистр или память с регистром: |001110dw|modregr/m| Непосредственное значение с регистром AX (AL): |0011110w|--data--|data, если w=1| Непосредственное значение с регистром или памятью: |100000sw|mod111r/m|--data--|data, если sw=0| DEC(DECrement operand by 1) Уменьшение операнда на единицу
Назначение: уменьшение значения операнда в памяти или регистре на 1. Алгоритм работы:
Применение:
О б ъ е к т н ы й к о д (два формата): Регистр: |01001reg| Регистр или память: |1111111w|mod001r/m| DIV(DIVide unsigned) Деление беззнаковое
Назначение: выполнение операции деления двух двоичных беззнаковых значений. Алгоритм работы:
Состояние флагов после выполнения команды:
Применение: О б ъ е к т н ы й к о д:
|1111011w|mod110r/m| INT(INTerrupt) Вызов подпрограммы обслуживания прерывания
Назначение: вызов подпрограммы обслуживания прерывания с номером прерывания, заданным операндом команды. Алгоритм работы:
Состояние флагов после выполнения команды:
Применение:
О б ъ е к т н ы й к о д (два формата): Регистр: |01000reg| Регистр или память: |1111111w|mod000r/m| JCC
|
Схема команды: |
jcc метка |
Назначение: переход внутри текущего сегмента команд в зависимости от некоторого условия.
Алгоритм работы команд (кроме jcxz/jecxz):
Проверка состояния флагов в зависимости от кода операции (оно отражает
проверяемое условие):
Алгоритм работы команды
jcxz/jecxz:
Проверка условия равенства нулю содержимого регистра ecx/cx:
Состояние флагов после выполнения команды:
11 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
OF | SF | ZF | 0 | AF | 0 | PF | 1 | CF |
? | ? | ? | r | ? | r |
Применение (кроме
jcxz/jecxz):
Команды условного перехода удобно применять для проверки различных условий,
возникающих в ходе выполнения программы. Как известно, многие команды формируют
признаки результатов своей работы в регистре eflags/flags. Это обстоятельство и
используется командами условного перехода для работы. Ниже приведены перечень
команд условного перехода, анализируемые ими флаги и соответствующие им
логические условия перехода.
Команда | Состояние проверяемых флагов | Условие перехода |
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 | если не больше |
JNGE | SF <> OF | если не больше или равно |
JNL | SF = OF | если не меньше |
JNLE | ZF=0 и SF=OF | если не меньше или равно |
JNO | OF=0 | если нет переполнения |
JNP | PF = 0 | если количество единичных битов результата нечетно (нечетный паритет) |
JNS | SF = 0 | если знак плюс (знаковый (старший) бит результата равен 0) |
JNZ | ZF = 0 | если нет нуля |
JO | OF = 1 | если переполнение |
JP | PF = 1 | если количество единичных битов результата четно (четный паритет) |
JPE | PF = 1 | то же, что и JP, то есть четный паритет |
JPO | PF = 0 | то же, что и JNP |
JS | SF = 1 | если знак минус (знаковый (старший) бит результата равен 1) |
JZ | ZF = 1 | если ноль |
Логические
условия "больше" и "меньше" относятся к сравнениям
целочисленных значений со знаком, а "выше и "ниже" — к
сравнениям целочисленных значений без знака. Если внимательно посмотреть, то у
многих команд можно заметить одинаковые значения флагов для перехода. Это
объясняется наличием нескольких ситуаций, которые могут вызвать одинаковое
состояние флагов. В этом случае с целью удобства ассемблер допускает несколько
различных мнемонических обозначений одной и той же машинной команды условного
перехода. Эти команды ассемблера по действию абсолютно равнозначны, так как это
одна и та же машинная команда. Изначально в микропроцессоре i8086 команды
условного перехода могли осуществлять только короткие переходы в пределах
-128...+127 байт, считая от следующей команды. Начиная с микропроцессора i386,
эти команды уже могли выполнять любые переходы в пределах текущего сегмента
команд. Это стало возможным за счет введения в систему команд микропроцессора
дополнительных машинных команд. Для реализации межсегментных переходов
необходимо комбинировать команды условного перехода и команду безусловного
перехода jmp. При этом можно воспользоваться тем, что практически все команды
условного перехода парные, то есть имеют команды, проверяющие обратные условия.
Применение jcxz/jecxz:
Команда | Состояние флагов в eflags/flags | Условие перехода |
JCXZ | не влияет | если регистр CX=0 |
JECXZ | не влияет | если регистр ECX=0 |
Команду jcxz/jecxz удобно использовать со всеми командами, использующими регистр ecx/cx для своей работы. Это команды организации цикла и цепочечные команды. Очень важно отметить то, что команда jcxz/jecxz, в отличие от других команд перехода, может выполнять только близкие переходы в пределах -128...+127 байт, считая от следующей команды. Поэтому для нее особенно актуальна проблема передачи управления далее чем в указанном диапазоне. Для этого можно привлечь команду безусловного перехода jmp. Например, команду jcxz/jecxz можно использовать для предварительной проверки счетчика цикла в регистре cx для обхода цикла, если его счетчик нулевой.
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |