Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OKR_SP-2_studentam.doc
Скачиваний:
5
Добавлен:
15.09.2019
Размер:
97.79 Кб
Скачать

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

Вопрос 1 (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 ненулевое значение.

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

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

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

Флаги состояния (биты 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.

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

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

Команда 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 сброшен.

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

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

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

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

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]