Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Буферизация пользовательского ввода. клавиатурный буфер, его назначение и принцип работы




Если в программе есть длительный по времени цикл, за время его выполнения пользователь может успеть нажать какие-нибудь клавиши. Предположим, после этого длинного цикла программа должна вывести вопрос «Форматировать все диски? Y/N» и дождаться нажатия Y или N. Если пользователь успел за время длинного цикла (т.е. до появления сообщения) нажать Y, то прочитать сообщение с вопросом он сможет только тогда, когда форматирование уже будет запущено (нажатая клавиша Y будет в клавиатурном буфере и функция ввода не будет ждать, вернёт управление в программу сразу же).

 

Клавиатурный буфер — это память в которую записываются байты, при нажатии на кнопку (по два байта на кнопку). В DOS есть функция int 08h, которая вызывается через int21h прерывание. Она ждет, пока будет нажата кнопка, т.е. ничего не делает, если буфер пустой. Как только в буфере появляются байты, она анализирует два байта: смотрит, нажата обычная клавиша(для которой не нужна расширенная ASCII) или расширенная (клавиша управления). В первом случаефункция преобразует эти два байта в один, и возвращает его в al, а после смещает указатель на два байта. Во втором случае функция преобразовывает два байта в один и возвращает в al 0. Далее необходимо вызвать функцию второй раз, и после этого она вернёт код расширенной клавиши. Грубо говоря, два байта превращаются в другие два байта.

 

Буфер имеет кольцевую структуру, реализованную в массиве. Массив начинается по адресу 0040:001E и занимает 32 байта. Адрес первого элемента (головы, head) хранится по адресу 0040:001A, последнего (хвоста, tail) — 0040:001С.

 

Команды условного и безусловного перехода. jmp и jcc

JMP – безусловный переход на метку. Работает в зависимости от состояния тех или иных флагов.Команду JMP применяют для осуществления ближних и дальних безусловных переходов. Команда JMP, в зависимости от типа своего операнда, изменяет содержимое либо только одного регистра (E)IP, либо обоих регистров CS и (E)IP

 

JCC – условный переход. Условный переход осуществляется, если выполняется определённое условие, заданное флагами процессора (кроме одной команды, которая проверяет CX на равенство нулю). Как вы помните, состояние флагов изменяется после выполнения арифметических, логических и некоторых других команд. Если условие не выполняется, то управление переходит к следующей команде.

Существует много команд для различных условных переходов. Также для некоторых команд есть синонимы (например, JZ и JE — это одно и то же). Для наглядности все команды условных переходов приведены в таблице:

 

Команда Переход, если Условие перехода
JZ/JE нуль или равно ZF=1
JNZ/JNE не нуль или не равно ZF=0
JC/JNAE/JB есть переполнение/не выше и не равно/ниже CF=1
JNC/JAE/JNB нет переполнения/выше или равно/не ниже CF=0
JP число единичных бит чётное PF=1
JNP число единичных бит нечётное PF=0
JS знак равен 1 SF=1
JNS знак равен 0 SF=0
JO есть переполнение OF=1
JNO нет переполнения OF=0
JA/JNBE выше/не ниже и не равно CF=0 и ZF=0
JNA/JBE не выше/ниже или равно CF=1 или ZF=1
JG/JNLE больше/не меньше и не равно ZF=0 и SF=OF
JGE/JNL больше или равно/не меньше SF=OF
JL/JNGE меньше/не больше и не равно SF≠OF
JLE/JNG меньше или равно/не больше ZF=1 или SF≠OF
JCXZ содержимое CX равно нулю CX=0

 

 

Регистр флагов. основные флаги и их назначение, использование регистра флагов

Смотри вопрос №7.

 

Команды Cmpиtest

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

CMP<операнд1>, <операнд2>

Команда сравнения эквивалентна команде SUB за исключением того, что вычисленная разность никуда не заносится. Назначение команды CMP – установка и сброс флагов.

Команда TEST —операция логического сравнения операндов если нужен не результат, а проверка. Команда TEST также может быть использована для проверки на равенство нулю.Команда TEST используется для логического умножения двух операндов. Результат операции, в отличие от команды AND, никуда не записывается, устанавливаются только флаги. Эту команду удобно использовать для получения информации о состоянии заданных битов операнда приемник. Для анализа результата используется флаг ZF, который равен 1, если результат логического умножения равен нулю.

 

Циклы. организация циклов в программе на ассемблере. команда loop

Для организации цикла предназначена команда LOOP. У этой команды один операнд — имя метки, на которую осуществляется переход. В качестве счётчика цикла используется регистр CX. Команда LOOP выполняет декремент CX, а затем проверяет его значение. Если содержимое CX не равно нулю, то осуществляется переход на метку, иначе управление переходит к следующей после LOOP команде. Пример:

metka:

int 21h      ;Обращение к функции DOS

incdl ;Следующий символ

loopmetka ;Команда цикла

 

Содержимое CX интерпретируется командой как число без знака. В CX нужно помещать число, равное требуемому количеству повторений цикла. Понятно, что максимально может быть 65535 повторений. Ещё одно ограничение связано с дальностью перехода. Метка должна находиться в диапазоне -127…+128 байт от команды LOOP (если это не так, FASM сообщит об ошибке).

 

Кроме команды LOOP, можно использовать командыREP/REPE/REPZ.

 

· REP используется перед следующими цепочечными командами и их краткими эквивалентами: movs, stos, ins, outs.

· REPE и REPZ используются перед следующими цепочечными командами и их краткими эквивалентами: cmps, scas.

· REPNE и REPNZ также имеют один код операции и имеют смысл при использовании перед следующими цепочечными командами и их краткими эквивалентами: cmps, scas. Разница же в том, что в REPE/REPZ проверяется cx<>0 или zf<>0, а в REPNE/REPNZ — cx<>0 или zf=0.

 

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

 

Команды побитовых сдвигов

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

 

Логический сдвиг вправо выполняется без учёта знакового бита. Для логического сдвига вправо предназначена команда SHR. У этой команды два операнда. Первый операнд представляет собой сдвигаемое значение и на его место записывается результат операции. Второй операнд указывает, на сколько бит нужно осуществить сдвиг. Этим операндом может быть либо непосредственное значение, либо регистр CL. Схема выполнения операции показана на рисунке:

 

Все биты операнда сдвигаются вправо (от старших битов к младшим). Выдвинутый бит становится значением флага CF. Старший бит получает нулевое значение. Эта операция повторяется несколько раз, если второй операнд больше единицы. Логический сдвиг вправо можно использовать для деления целых чисел без знака на степень 2, причём сдвиг работает быстрее, чем команда деления DIV.

 

Арифметический сдвиг вправоотличается от логического тем, что он не изменяет значение старшего бита, и предназначен для чисел со знаком. Арифметический сдвиг вправо выполняется командой SAR. У этой команды тоже 2 операнда, аналогично команде SHR. Схема выполнения операции показана на рисунке:

 

 

 

Выдвинутый бит становится значением флага CF. Знаковый бит не изменяется. При сдвиге на 1 бит сбрасывается флаг OF. Эту команду можно использовать для деления целых чисел со знаком на степень 2 (обратите внимание, что «округление» всегда в сторону меньшего числа, поэтому для отрицательных чисел результат будет отличаться от результата деления с помощью команды IDIV).

 

Логический сдвиг влево выполняется командой SHL, а арифметический — командой SAL. Однако, на самом деле это просто синонимы для одной и той же машинной команды. Сдвиг влево одинаков для чисел со знаком и чисел без знака. У команды 2 операнда, аналогично командам SHR и SAR.Схема этой операции показана на рисунке:

 

 

Циклический сдвиг отличается от линейного тем, что выдвигаемые с одного конца биты вдвигаются с другой стороны, то есть движутся по кольцу. В процессорах x86 существует 2 вида циклического сдвига: простой и через флаг переноса (CF). У всех команд по 2 операнда, таких же, как у команд линейного сдвига. Первый операнд — сдвигаемое значение и место для записи результата. Второй операнд — счётчик сдвигов, который может находится в регистре CL или указываться непосредственно.

 

Циклический сдвиг вправо выполняется командой ROR, а влево — командой ROL. Схема работы этих команд представлена на рисунке (на примере 8-битного операнда):

 

Значение последнего выдвигаемого бита копируется в флаг CF. Для сдвигов на 1 бит устанавливается флаг OF, если в результате сдвига изменяется знаковый бит операнда.

 

Циклический сдвиг через флаг переноса отличается от простого сдвига в том, что флаг CF участвует в сдвиге наравне с битами операнда. При сдвиге на 1 бит выдвигаемый бит помещается в CF, а значение CF вдвигается в операнд с другой стороны. При сдвиге на несколько бит эта операция повторяется многократно. Циклический сдвиг через флаг переноса выполняется командами RCR (вправо) и RCL (влево).

 

Опять же для сдвигов на 1 бит устанавливается флаг OF, если в результате сдвига изменяется знаковый бит операнда.

 

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 288.

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