Системные флаги и поле IOPL




Вопросы ОКР-2 по системному программированию

Вопрос 1 (1 балл).

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

Команда безусловного перехода

Команда JMP выполняет безусловный переход — обеспечивает передачу управления при любых обстоятельствах. Формат команды:

JMP метка

здесь управление передается команде c меткой метка. Метку можно записывать на одной строке с командой или на отдельной строке:

метка: ADD AX,BX

Команда JMP для перехода в пределах -128 до +127 байт имеет тип SHORT. При этом ассемблер создает однобайтовый операнд в пределах от 00 до FF. Команда JMP, переходящая за эти пределы, получает тип FAR, для которого генерируется другой машинный код и двухбайтовый операнд. При первом просмотре исходной программы ассемблер определяет длину каждой команды. Но команда JMP может быть длиной два или три байта. Если к моменту просмотра команды JMP ассемблер уже вычислил значение операнда (при переходе назад), то он создает двухбайтовую команду. Если он еще не вычислил значение операнда (при переходе вперед), то он не знает тип перехода (NEAR или FAR) и ―на всякий случай‖ создает трехбайтовую команду. Чтобы указать ассемблеру на необходимость создания двухбайтовой команды, нужно использовать оператор SHORT:

JMP SHORT метка

Команды условного перехода

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

Операнды в этих командах указывают метки, расстояние до которых должно вмещаться в пределы от -128 до +127 байт. При выходе за эти границы ассемблер выдает сообщение ―Relative jump out of range‖ (превышены относительные границы перехода).

Команды условного перехода можно разделить на три группы:

1) переходы для беззнаковых данных;

2) переходы для знаковых данных;

3) специальные проверки.

Переходы для беззнаковых данных

Мнемоника Описание Проверяемые признаки

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

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

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

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

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

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

Переходы для знаковых данных

Мнемоника Описание Проверяемые признаки

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

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

JG/JNLE Переход, если больше/не меньше или равно ZF,SF,OF

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

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

JLE/JNG Переход, если меньше или равно/не больше ZF,SF,OF

 

Специальные арифметические проверки

Мнемоника Описание Проверяемые признаки

JS Переход, если есть знак (отрицательно) SF

JNS Переход, если нет знака (положительно) SF

JC Переход, если есть перенос (аналогично JB) CF

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

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

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

JP/JPE Переход, если паритет четный PF

JNP/JPO Переход, если паритет нечетный PF

Еще одна команда условного перехода проверяет, равно ли содержимое регистра CX нулю. Эта команда не обязательно должна располагаться непосредственно за командой арифметики или сравнения. Одно из возможных мест для команды JCXZ — начало цикла, где она проверяет, содержит ли регистр CX ненулевое значение.

 

2. Объяснить назначение регистра признаков, описать основные признаки в его составе.

 

Регистр флагов — регистр процессора, отражающий текущее состояние процессора.

Флаги состояния

Флаги состояния (биты 0, 2, 4, 6, 7 и 11) отражают результат выполнения арифметических инструкций, таких как ADD, SUB, MUL, DIV.

  • CF — устанавливается при переносе из/заёме в (при вычитании) старший значащий бит результата и показывает наличие переполнения в беззнаковой целочисленной арифметике. Также используется в длинной арифметике.
  • PF — устанавливается, если младший значащий байт результата содержит чётное число единичных (ненулевых) битов. Изначально этот флаг был ориентирован на использование в коммуникационных программах: при передаче данных по линиям связи для контроля мог также передаваться бит чётности (см., например: RS-232#Принцип работы) и инструкции для проверки флага чётности облегчали проверку целостности данных.
  • AF — устанавливается при переносе и заёме из бита 3 результата. Этот флаг ориентирован на использование в двоично-десятичной (binary coded decimal, BCD) арифметике.
  • ZF — устанавливается, если результат равен нулю.
  • SF — равен значению старшего значащего бита результата, который является знаковым битом в знаковой арифметике.
  • OF — устанавливается, если целочисленный результат слишком длинный для размещения в целевом операнде (регистре или ячейке памяти). Этот флаг показывает наличие переполнения в знаковой целочисленной арифметике (в дополнительном коде).

Управляющий флаг

Флаг направления (DF, бит 10 в регистре флагов) управляет строковыми инструкциями (MOVS, CMPS, SCAS, LODS и STOS): установка флага заставляет уменьшать адреса (обрабатывать строки от старших адресов к младшим), обнуление заставляет адреса увеличивать. Инструкции STD и CLD соответственно устанавливают и обнуляют флаг DF.

Системные флаги и поле IOPL

Системные флаги и поле IOPL управляют операционной средой и не предназначены для использования в прикладных программах.

  • IF — обнуление этого флага запрещает отвечать на маскируемые запросы на прерывание.
  • TF — установка этого флага разрешает пошаговый режим отладки, когда после каждой выполненной инструкции происходит прерывание программы и вызов специального обработчика прерывания (см. также: Int3).
  • IOPL — показывает уровень приоритета ввода-вывода исполняемой программы или задачи: чтобы программа или задача могла выполнять инструкции ввода-вывода или менять флаг IF, её текущий уровень приоритета (CPL) должен быть ≤ IOPL.
  • NT — этот флаг устанавливается, когда текущая задача «вложена» в другую, прерванную задачу, и сегмент состояния TSS текущей задачи обеспечивает обратную связь с TSS предыдущей задачи. Флаг NT проверяется инструкцией IRET для определения типа возврата — межзадачного или внутризадачного.
  • RF — флаг маскирования ошибок отладки.
  • VM — установка этого флага в защищённом режиме вызывает переключение в режим виртуального 8086.
  • AC — установка этого флага вместо с битом AM в регистре CR0 включает контроль выравнивания операндов при обращениях к памяти — обращение к невыравненному операнду вызывает исключительную ситуацию.
  • VIF — виртуальная копия флага IF; используется совместно с флагом VIP.
  • VIP — устанавливается для указания наличия отложенного прерывания; используется совместно с флагом VIF.
  • ID — возможность программно изменить этот флаг в регистре флагов указывает на поддержку инструкции CPUID.

 

 

3. Объяснить состав и основные особенности использования команд организации циклов, описать неявное использование регистров в них.

 

Команда простого цикла.

Команда LOOP обеспечивает исполнение группы команд, составляющих тело цикла, заданное количество раз. Число, задающее количествао повторений цикла, нужно загрузить в регистр CX перед началом цикла. Сама команда помещается в конце цикла. При выполнении она каждый раз уменьшает значение в CX на 1. Если значение CX не равно нулю, она передает управление по адресу, указанному в операнде (на метку). Если значение равно нулю, управление передается следующей очередной команде. Расстояние команды LOOP до команды, заданной метокй, должно быть в пределах от -128 до +127 байт. Если расстояние превышает эти границы, то ассемблер выдаст сообщение "Relative jump out of range" (превышены границы перехода).

Команды условных циклов.

Дополнительно существует две разновидности команды цикла:

1) команда LOOPE (или LOOPZ) и LOOPNE (или LOOPNZ) — цикл, если равно или нуль; передает управление по адресу операнда, если регистр CX имеет ненулевое значение и признак нуля установлен (ZF=1);

2) команда LOOPNE (или LOOPNZ) — цикл, если не равно или не нуль; передает управление по адресу операнда, если регистр CX имеет ненулевое значение и признак нуля сброшен (ZF=0).

Замечание.

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

Организация “длинных” переходов и циклов

Команды условных переходов и команды циклов допускают передачу управления на расстояние от -128 до +127 байт относительно команды. Поэтому в случаях, когда требуется переход на большее расстояние, приходится привлекать команду JMP. ―Длинные‖ циклы тоже организуются без помощи команд цикла — привлекаются команды условных и безусловного переходов. Для организации таких циклов бывают полезны команды приращения:

1) INC — инкремент: прибавляет 1 к байту либо слову в указанном регистре либо ячейке памяти;

2) DEC — декремент: аналогично вычитает 1.

Некоторые арифметические и иные операции оставляют какие-то признаки в неопределенном состоянии. Если вслед за ними должна выполняться условная команда, то для правильной установки признаков используется команда сравнения CMP. Она действует, как команда вычитания, но не изменяет операндов.

 

Иногда надо организовать цикл, т.е. совершить повторение количество раз, которое указано в регистре ECX. Следовательно, надо у теле цикла уменьшать значение ECX. Именно для этого предназначена команда loop. Он проверяет, равен ли регистр ECX нулю, если он не равен нулю, то значение регистра ECX уменьшается на 1 и совершается ближний прыжок на смещение указанное в операнде.

Команда loope делает то же самое, но перед прыжком проверяет, установлен ли флаг ZF, если он установлен, то прыжок совершается. Точно тоже самое делает команда loopz. Команды loopne и loopnz делают то же сомое что и loope, но прыгают, если флаг ZF сброшен.

 

 

4. Разъяснить схему работы команды прерывания INT. Охарактеризовать ее назначение и использование.

 

Команда INT прерывает обработку программы, передает управление в DOS или BIOS для определенного действия и затем возвращает управление в рерванную программу для продолжения обработки. Наиболее часто прерывание используется для выполнения операций ввода или вывода. Для выхода из программы на обработку прерывания и для последующего возврата команда INT выполняет следующие действия:

- уменьшает указатель стека на 2 и заносит в вершину стека содержимое флагового регистра;

- очищает флаги TF и IF;

- уменьшает указатель стека на 2 и заносит содержимое регистра CS в стек;

- уменьшает указатель стека на 2 и заносит в стек значение командного указателя;

- обеспечивает выполнение необходимых действий;

- восстанавливает из стека значение регистра и возвращает управление в прерванную программу на команду, следующую после INT.

 

Этот процесс выполняется полностью автоматически. Необходимо лишь определить сегмент стека достаточно большим для записи в него значений регистров.

 

Вопрос 2 (2 балла).

5. Объяснить понятие массива, понятия размера и размерности массива.

 

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

 

Одномерные массивы часто называются векторами:

A = a1, a2, a3,..., aM

 

Двухмерные массивы называются матрицами:

 

⎡a1,1, a1,2, a1,3,..., a1,M⎤

⎢a2,1, a2,2, a2,3,..., a2,M⎢

A = ⎢. ⎢

⎢. ⎢

⎢. ⎢

⎣aN,1, aN,2, aN,3,..., aN,M⎦

 

Следует различать:

1) размерность массива – количество его “координат” или индексов;

2) размер массива – его “длину” по каждой из “координат”.

 

Размерность массивов бывает более двух. Так, в языке APL можно работать с массивами размерностью до 255.

 

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

 

Например, для обращения к элементу с адресом (m,n) в матрице из M строк и N столбцов:

АДР = ДЛ × (N(m - 1) + (n - 1))

 

С массивами могут выполняться различные операции, чаще всего арифметические:

1) с массивом и константой – сложение, вычитание, умножение, деление и пр.;

2) с массивом и массивом – аналогичные; при этом массивы должны быть соразмерными.

 

Реже встречаются специальные операции, например:

1) декартово произведение: каждый элемент одного массива умножается на каждый элемент другого массива;

2) сцепление массивов – при этом соразмерность массивов особенно важна.

 

Для выполнения операций над массивами используются циклы, позволяющие переходить от элемента к элементу по всему массиву. Для работы с векторами достаточно одного цикла. Для работы с матрицами требуется двойной цикл (один внутри другого): один цикл управляет номером строки массива, другой – номером столбца.

 

6. Объяснить понятие таблицы, принципы организации таблиц в памяти.

 

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

 

Следующий пример таблицы инициализирован символьными и числовыми значениями:

MES DB 'ЯНВАРЬ ','ФЕВРАЛЬ ','МАРТ ',...,'ДЕКАБРЬ '

DEN DB 31,28,30,...,31

 

Эту же таблицу можно представить иначе:

 

MESDEN DB 'ЯНВАРЬ ',31

DB 'ФЕВРАЛЬ ',28

DB 'МАРТ ',31

...

DB 'ДЕКАБРЬ ',31

 

Здесь строки таблицы содержат смешанные данные (регулярно чередующиеся числовые и символьные поля).

 

Замечание.

В этих таблицах длины символьных элементов выравнены до одинаковой длины засчет дополнения концевыми пробелами.

Адресация элементов таблицы выполняется так же, как для множества. Это называется прямым табличным доступом. Так можно, например, по номеру месяца узнать его название и число дней. Но такой доступ возможен, только если элементы таблицы располагаются строго регулярно.

 

Адрес N-го элемента (строки):

АДР = L × (N-1)

здесь L – длина элемента.

 

Пусть пользователь ввел номер месяца 03, и программа должна преобразовать этот номер в алфавитное значение МАРТ. Программа для такого преобразования включает определение таблицы алфавитных названий месяцев, имеющих одинаковую длину. Так как самое длинное название СЕНТЯБРЬ, таблица имеет вид:

MESDEN DB 'ЯНВАРЬ '

DB 'ФЕВРАЛЬ '

DB 'МАРТ '

...

 

Каждый элемент таблицы имеет длину 8 байт. Адреса элементов: 'ЯНВАРЬ ' =

MESDEN, 'ФЕВРАЛЬ ' = MESDEN+8, 'МАРТ ' = MESDEN+16. Для локализации

месяца 03 программа должна выполнить следующее:

1) преобразовать введенный номер месяца из ASCII 33 в двоичное 03;

2) вычесть единицу из номера месяца: 03 - 1 = 02;

3) умножить результат на длину элемента: 02 × 8 = 16

4) прибавить произведение (18) к адресу MESDEN; в результате получится адрес

требуемого названия месяца: MESDEN+16.

 

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

 

 

7. Объяснить понятия внутренней и внешней подпрограммы, особенности организации внутренних и внешних подпрограмм.

 

Подпрограмма (процедура) есть часть программы или отдельная несамостоятельная программа. Обычно она выполняет определенные, логически завершенные операции, которые могут многократно требоваться при работе основной (главной) программы.

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

 

Команда CALL

Выполняет вызов подпрограммы. Работает по-разному в зависимости от типа подпрограммы. Заносит в стек адрес возврата. Формат команды:

CALL имя_подпр

 

Команда RET

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

 

Все подпрограммы должны начинаться директивой PROC и заканчиваться директивой ENDP.

Внутренняя подпрограмма есть часть текста главной программы. Она описывается с помощью директив PROC и ENDP и завершается командой RET. Пример структуры программы с подпрограммами:

 

BEGIN PROC FAR; главная программа

...

BEGIN ENDP

;------------------------------------

PR_1 PROC FAR; первая вложенная подпрограмма

...

PR_1 ENDP

;------------------------------------

PR_2 PROC FAR; вторая вложенная подпрограмма

...

PR_2 ENDP

;------------------------------------

.

.

.

END BEGIN; конец программы

 

10.5. Организация внешних подпрограмм

 

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

 

Причины такой организации программ следующие:

1) компоновка программ, написанных на разных языках, – например, для объединения мощности языка высокого уровня и эффективности языка ассемблера;

2) программа в виде одного модуля может оказаться слишком большой для ассемблирования;

3) отдельные части программы могут писать разные программисты, ассемблирующие свои модули раздельно;

4) из-за большого размера выполняемого модуля может появиться необходимость перекрытия частей программы в процессе выполнения.

 

Межсегментные вызовы

 

Вызов в другой кодовый сегмент есть межсегментный (длинный) вызов. При этом сначала записывается в стек содержимое регистра CS и заносится в этот регистр адрес другого сегмента, затем записывается в стек значение регистра IP и заносится новый относительный адрес в этот регистр. Так в стеке запоминаются адрес кодового сегмента и смещение для последующего возврата из подпрограммы. Каждая часть программы организуется как хотя-бы один сегмент.

 

 

8. объяснить понятие символьной цепочки. Описать состав команд для работы с цепочками, особенности их применения.

 

 

Часто требуется переслать или сравнить поля данных, которые превышают длиной одно слово. Например, нужно сравнить описания или имена, чтобы отсортировать их. Элементы такого формата известны как символьные цепочки (цепочки символов) и могут быть символьными и числовыми. Для их обработки язык ассемблера содержит пять специальных команд:

MOVS – переслать один байт или одно слово из одной области памяти в другую;

LODS – загрузить из памяти один байт в регистр AL или одно слово в регистр AX;

STOS – записать содержимое регистра AL или AX в память;

CMPS – сравнить содержимое двух областей памяти, размером в один байт или в одно слово;

SCAS – сравнить содержимое регистра AL или AX с содержимым памяти.

 

Префикс REP позволяет этим командам обрабатывать строки любой длины.

 

Свойства операций над цепочками

 

Цепочечные команды можно использовать для повторяющейся обработки байта или слова за одно выполнение. Например, можно выбрать “байтовую” команду для обработки цепочки с нечетным числом байт или “двухбайтовую” команду для обработки четного числа байт. Ниже перечислены регистры, участвующие в цепочечных командах (для однобайтовых и двухбайтовых вариантов). Пусть регистры DI и SI содержат нужные адреса:

 

Команда Операнды Байт Слово

 

MOVS DI,SI MOVSB MOVSW

LODS AL,SI или AX,SI LODSB LODSW

STOS DI,AL или DI,AX STOSB STOSW

CMPS SI,DI CMPSB CMPSW

SCAS DI,AL или DI,AX SCASB SCASW

 

Например, можно кодировать операнды для команды MOVS, но опустить их для MOVSB и MOVSW. Эти команды предполагают, что регистры DI и SI содержат относительные адреса, указывающие на нужные области памяти (для загрузки адреса можно использовать команду LEA). Регистр SI обычно связан с регистром сегмента данных, составляя регистровую пару DS:SI. Регистр DI всегда связан с регистром дополнительного сегмента – пара ES:DI. Поэтому команды MOVS, STOS, CMPS и SCAS требуют инициализации регистра ES (обычно адресом в регистре DS).

 

Чтобы цепочечные команды обрабатывали цепочки по всей длине, используется префикс повторения команды REP. Он обеспечивает повторение команды несколько раз. Префикс пишется непосредственно перед командой (например, REP MOVSB). Для использования префикса нужно занести начальное значение в регистр CX. При каждом выполнении команды с префиксом происходит уменьшение на 1 значения в регистре CX – до нуля. Так можно обрабатывать цепочки любой длины.

 

Признак направления определяет направление повторяющейся операции: DF = 0 – слева направо (устанавливается командой CLD); DF = 1 – справа налево (командой STD).

 

Пример: пересылка 20 байт из STR1 в STR2. Предполагается, что регистры DS и ES инициализированы адресом сегмента данных:

 

STR1 DB 20 DUP('*')

STR2 DB 20 DUP(' ')

...

CLD; сброс признака DF

MOV CX,20; счетчик на 20 байт

LEA DI,STR2; адрес области “куда”

LEA SI,STR1; адрес области “откуда”

REP MOVSB; пересылка данных

 

При выполнении команд CMPS и SCAS возможна установка признаков состояния – с тем чтобы операция могла прекратиться сразу после обнаружения нужного условия. Ниже приведены варианты префикса для этих целей:

 

REP – повторять операцию, пока CX не равно 0;

REPZ или REPE – повторять, пока признак ZF показывает “равно или ноль”; прекратить при значении признака, показывающем “не равно или не ноль” или при CX, равном 0;

REPNE или REPNZ – повторять, пока признак ZF показывает “не равно или не ноль”; прекратить при значении признака, показывающем “равно или ноль” или при CX, равном 0.

Замечания к командам

 

MOVS

Для области, принимающей цепочку, используется сегментный регистр ES; регистр DI содержит относительный адрес области, передающей цепочку. Для области, передающей цепочку, используется сегментный регистр DS; регистр SI содержит относительный адрес. Перед командой нужно инициализировать регистры ES и DS, также загрузить относительные адреса полей в регистры DI и SI. В зависимости от состояния признака DF команда увеличивает или уменьшает на 1 (для байта) или на 2 (для слова) содержимое регистров DI и SI.

 

LODS

Загружает из памяти байт в регистр AL или слово в регистр AX. Адрес памяти определяется регистрами DS:SI. В зависимости от значения признака DF происходит увеличение или уменьшение регистра SI. Поскольку команда загружает регистр, префикс повторения не нужен. Часто команда MOV вполне соответствует команде LODS, хотя MOV генерирует три байта машинного кода, а LODS – лишь один, но требует инициализации регистра SI. Можно использовать команду LODS, когда нужно продвигаться вдоль цепочки (по байту или по слову), проверяя загружаемый регистр на конкретное значение.

 

Остальные команды

Требуют инициализации регистров ES:DI, DS:SI или всех вместе.

 

Все команды

В зависимости от признака DF увеличивают либо уменьшают значения адресов: на 1 – при побайтовой обработке; на 2 – при пословной обработке.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-07 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: