Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1




НазваниеКонспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1
страница5/41
Дата публикации03.03.2013
Размер5.22 Mb.
ТипКонспект
uchebilka.ru > Информатика > Конспект
1   2   3   4   5   6   7   8   9   ...   41
Часть команд сложно отнести к какой-либо1 группе (например, команды поме­щения данных в стек или извлечения данных из стека, команды работы с таблич­ными данными и т. д.).

Большинство команд работают с операндами в памяти, адресуемыми одним из способов, рассмотренных ранее, а также с регистрами общего назначения (ЕАХ, ЕВХ, ECX, EDX, ESI, EDI, EBP, ESP) и с регистрами сегментов (CS, DS, SS, ES, FS, GS).

Макроассемблер MASM версии 6.14 и выше поддерживает все основные ко­манды процессора Intel Pentium, а также специальные группы команд ММХ-, SSE- и SSE2-pacuraperoiu, которые подробно рассматриваются в последующих главах. Перечень всех команд процессора приводится в приложениях А и Б.

Лекция 5

Организация

вычислительных

циклов

Большинство программ, независимо от того, на каком языке они написаны, в процессе работы требуют изменения линейной последовательности выполнения операторов и перехода на другие ветви программного кода. В языках высокого уровня, таких, например, как C++ или Pascal, существуют специальные операторы, позволяющие выполнять ветвление программ, в то время как на языке ассемблера для организации переходов требуется писать специальный код.

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

  • Структура, основанная на сравнении каких-либо величин и выборе варианта продолжения программы в зависимости от результата сравнения. Такую логическую структуру можно описать выражением «если А, то В, иначе С». В языках высокого уровня ее аналогом является оператор if ... else. Кроме того, существуют и расширенные варианты оператора if ... else, например switch ... case.

  • Структура, в основе которой лежит алгоритм повторяющихся вычислений. Такой алгоритм выполняется при соблюдении определенных условий, которые проверяются в начале или в конце каждой итерации. Такие логические структуры в языках высокого уровня реализованы как операторы while, do ... while, for, repeat ... until и т. д.

Логические структуры языков высокого уровня придают особую гибкость и мощь этим языкам и позволяют относительно легко строить самые сложные алгоритмы. А как обстоят дела с языком ассемблера, ведь здесь нет подобных операторов? Несмотря на отсутствие подобных операторов, ассемблер обладает довольно мощными командами, позволяющими строить любые сколь угодно сложные логические структуры, в том числе и такие, которые довольно трудно, а иногда и невозможно реализовать в языках высокого уровня.

Хочу сразу же оговориться: мы не будем брать во внимание псевдомакросы логических структур, такие, как . IF и .WHILE, включенные в популярные языки ассемблера (в данном случае MASM). Псевдомакросы имитируют логические структуры высокого уровня, например i f ... else, но значительно уступают им по возможностям, хотя и улучшают читабельность кода. Если внимательно посмотреть на программный код макросов, то вы увидите, что они содержат команды ассемблера, которые вполне можно написать самостоятельно. Кроме того, псевдомакросы скрывают механизм операции, что может быть полезно для программирования, но не для изучения алгоритмов функционирования. По этим причинам я сознательно отказался от использования псевдомакросов и макрорасширений ассемблера при рассмотрении программного кода.

Посмотрим, как можно создать логические структуры на языке ассемблера и использовать их в программах. В подавляющем большинстве случаев для создания логических структур и выражений на ассемблере, таких, например, как if ... else, while и так далее, требуется два условия:

  • установить один или несколько битов в регистре флагов процессора;

  • проверить состояние бита (группы битов) с помощью команд условного перехода и передать управление на соответствующую ветвь программы.

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

Для передачи управления можно использовать и команды безусловного перехода; мы рассмотрим такую возможность позже.

Таким образом, для построения вычислительных алгоритмов необходимо анализировать состояние битов регистра флагов EFLAGS центрального процессора. Девять из 16 бит регистра являются активными и определяют текущее состояние машины и результатов выполнения команд. Многие арифметические команды и команды сравнения изменяют состояние флагов. Напомню назначение отдельных битов регистра флагов:

  • CF (Carry Flag - флаг переноса) - содержит значение переносов (0 или 1) из старшего разряда при арифметических операциях и некоторых операциях сдвига и циклического сдвига;

  • PF (Parity Flag - флаг четности) - проверяет младшие 8 бит результатов выполнения операций над данными. Нечетное число битов приводит к установке этого флага в 0, а четное - в 1. Не следует путать флаг четности с битом контроля на четность;

  • AF (Auxiliary Carry Flag - дополнительный флаг переноса) - устанавливается в 1, если арифметическая операция приводит к переносу четвертого справа бита (бит 3) в регистровой однобайтовой команде. Данный флаг имеет отношение к арифметическим операциям над ASCII-символами и к полям, содержащим десятичные упакованные числа;

  • ZF (Zero Flag - флаг нуля) - устанавливается после выполнения арифметических команд и команд сравнения. Ненулевой результат операции приводит к установке этого флага в 0, а нулевой - к установке флага в 1. Этот флаг проверяется при помощи команд условного перехода je и jz;

  • SF (Sign Flag - знаковый флаг) - устанавливается в соответствии со знаком результата (старшего бита) после выполнения арифметических операций: при положительном результате флаг устанавливается в 0, а при отрицательном - в 1. Этот флаг проверяется при помощи команд условного перехода jg и jl;

  • TF (Trap Flag - флаг пошагового выполнения) - если этот флаг установлен в 1, то процессор переходит в режим пошагового выполнения команд, то есть в каждый момент выполняется одна команда под управлением пользователя;

  • IF (Interrupt Flag - флаг прерывания) - при нулевом состоянии этого флага прерывания запрещены, а при единичном - разрешены;

  • DF (Direction Flag - флаг направления) - используется в строковых операциях для определения направления передачи данных. При нулевом состоянии команда увеличивает содержимое регистров SI (ESI) и DI (EDI), а при ненулевом уменьшает содержимое этих регистров;

  • OF (Overflow Flag - флаг переполнения) - фиксирует арифметическое переполнение, то есть перенос в старший бит или из старшего (знакового) бита при знаковых арифметических операциях.

Чаще всего в программах используются флаг переноса CF, флаг знака SF, флаг нуля ZF, немного реже - флаг четности PF, флаг направления DF, флаг переполнения OF и флаг дополнительного переноса AF. Еще реже, преимущественно в специальных случаях, используются флаги TF и IF.

Рассмотрим некоторые примеры, демонстрирующие методику выполнения условных переходов в программах.
^ 1. Условные переходы и ветвления
Организацию ветвлений в программах на ассемблере лучше всего объяснить на примере. В следующем фрагменте программного кода выполняется переход на метку next при равенстве нулю содержимого регистра ЕСХ. Равенство нулю содержимого ЕСХ определяется при помощи команды стр, которая воздействует на флаги AF, CF, OF, PF, SF и ZF:
crap ЕСХ. О jz next

обработка ситуации, когда ЕСХ не равен О

next:

обработка ситуации, когда ЕСХ равен О
Если ЕСХ содержит нулевое значение, то команда стр устанавливает флаг нуля ZF в единицу. Команда jz проверяет флаг ZF и, если он равен 1, передает управление на адрес, указанный в ее операнде, то есть на метку next. Фактически данный фрагмент программного кода реализует логическую структуру if, анализирующую условие ЕСХ - 0.

Этот пример демонстрирует один из типичных вариантов организации ветвлений с использованием команды стр. В данном случае эта команда устанавливает или сбрасывает флаг ZF, в зависимости от равенства или неравенства нулю содержимого регистра ЕСХ. Состояние флага анализируется командой jz next, после чего осуществляется переход на одну из двух возможных ветвей программного кода. Большинство команд процессоров Intel воздействуют на флаги, что позволяет задействовать их для организации довольно сложных вычислительных алгоритмов.

Наиболее часто для организации ветвлений используются команды сравнения (cmp, test), а также арифметические (add, sub и др.) и логические команды (and, or, хог). Например, команда test выполняет операцию логического «И» над двумя операндами и в зависимости от результата устанавливает флаги SF, ZF и PF. При этом флаги OF и CF сбрасываются, а флаг AF имеет неопределенное значение. Очень важно то, что команда test не изменяет ни одного из операндов. Ее очень удобно использовать для анализа отдельных битов сравниваемых величин, как в этом примере:
test AX. 1

jne bitl_set
Здесь анализируется нулевой бит регистра АХ. Если он установлен в 1, то флаг ZF устанавливается в 0 и выполняется переход на метку bitltest.

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

Например, если регистр АХ содержит 11000110В, а ВХ - 00010110В, то для беззнаковых данных значение в АХ будет больше ВХ, а для знаковых - меньше. Перечень команд условных переходов для беззнаковых данных приведен в табл. 1.


Таблица 1. Команды условных переходов для чисел без знака


Мнемоника


Описание


Проверяемые флаги


^ JE/JZ JNE/JNZ

Переход, если равно/нуль Переход, если не равно/не нуль

ZF ZF

JA/JNBE

Переход, если выше/не ниже или равно

ZF, CF

JAE/JNB

Переход, если выше или равно/не ниже

CF

JB/JNAE

Переход, если ниже/не выше или равно

CF

JBE/JNA

Переход, если ниже или равно/не выше

CF,AF


Любую проверку можно выполнить с помощью одного из двух мнемонических кодов. Например, команды jb и jnae генерирует один и тот же объектный код, хотя мнемоническое обозначение команды jb понять легче, чем jnae.

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

Таблица 2. Команды условных переходов для чисел со знаком



Мнемоника

Описание

^ Проверяемые флаги

JE/JZ

Переход, если равно/нуль

ZF

JNE/JNZ

Переход, если не равно/не нуль

ZF

JG/JNLE

Переход, если больше/не меньше или равно

ZF, SF, OF

JGE/JNL

Переход, если больше или равно/не меньше

SF,OF

JL/JNGE

Переход, если меньше/не больше или равно

SF, OF

JLE/JNG

Переход, если меньше или равно/не больше

ZF, SF, OF


Обратите внимание на то, что команды перехода для условий равно или нуль (je/jz) и не равно или не нуль (jne/jnz) присутствуют в обеих таблицах для беззнаковых и знаковых данных. Состояние равно/нуль не зависит от знака числа.

Помимо проверок на равенство-неравенство операндов, очень часто требуется анализировать и другие флаги. Все такие проверки представлены в табл. 3.



Мнемоника

Описание

Проверяемые флаги

JS

Переход, если число отрицательно

SF

JNS

Переход, если число положительно

SF

JC

Переход, если есть перенос

CF

JNC

Переход, если нет переноса

CF

JO

Переход, если есть переполнение

OF

JNO

Переход, если нет переполнения

OF

JP/JPE

Переход, если есть паритет

PF

JNP/JP

Переход, если нет паритета

PF


Еще одна команда условного перехода проверяет равенство содержимого регистра СХ нулю. Эта команда необязательно должна располагаться непосредственно за арифметической командой или командой сравнения. Команда jcxz может быть помещена в начало цикла, где она проверяет содержимое регистра СХ.
1   2   3   4   5   6   7   8   9   ...   41

Похожие:

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций для студентов заочной формы обучения направления 080201 (Информатика)
Предлагаемый конспект лекций представляет собой пособие по предмету “Теория информации”, который читается в Сумском государственном...

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций 2007 Экология. Конспект лекций. Для студентов специальностей...
Экология. Конспект лекций. Для студентов специальностей 080201 «Информатика», 090220 «Оборудование химических производств и предприятий...

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций по дисциплине информационные и телекоммуникационные...

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций по дисциплине “
«Компьютерная инженерия», специальности 091501 «Компьютерные сети и системы», 091502 «Системное программирование»

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций по курсу Выбранные вопросы информатики (часть 2)...
Точно так же как художник может выбирать для рисования различные инструменты, программист, создающий аплет Java, может выбирать различные...

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций по дисциплине “Статистика в машиностроении ” для студентов специальности
Конспект лекций предназначен для самостоятельного изучения студентами теоретической части курса “ Статистика в машиностроении ” (для...

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций по дисциплине “ основы защиты информации” для направления...
Министерство образования и науки украины восточноукраинский государственный университеТ

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций по курсу Начертательная геометрия
Конспект лекций по курсу начертательная геометрия (для студентов заочной формы обучения всех специальностей академии). Сост. Лусь...

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций и методические указания к выполнению контрольной работы к изучению курса
Конспект лекций и методические указания к выполнению контрольной работы по курсу “Проектирование специальных станочных и контрольных...

Конспект лекций по курсу Системное программирвание для специальности Информатика Лекция 1 iconКонспект лекций по курсу «Организация производства»
Конспект лекций по курсу «Организация производства» (для студентов и слушателей заочной формы обучения фпоизо специальностей 050100...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<