Знакомство с порядком описания команд и принятыми обозначениями 5 страница



IN

(INput operand from port)

Ввод операнда из порта

 

Схема команды: in аккумулятор,ном_порта

Назначение: ввод значения из порта ввода-вывода.

Синтаксис

Алгоритм работы:

Передает байт, слово, двойное слово из порта ввода-вывода в один из регистров al/ax/eax. Состояние флагов после выполнения команды: выполнение команды не влияет на флаги.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команда применяется для прямого управления оборудованием компьютера посредством портов. Номер порта задается вторым операндом в виде непосредственного значения или значения в регистре dx. Непосредственным значением можно задать порт с номером в диапазоне 0-255. При использовании порта с большим номером используется регистр dx. Размер данных определяется размерностью первого операнда и может быть байтом, словом, двойным словом. В качестве примера применения рассмотрим фрагмент обработчика прерывания от клавиатуры 9. Это прерывание вызывается всякий раз при нажатии любой клавиши на клавиатуре. Обработчик этого прерывания должен прочитать скан-код клавиши, подтвердить микропроцессору клавиатуры факт приема скан-кода, преобразовать этот код в соответствии с клавишами-переключателями и поместить преобразованный код в буфер клавиатуры, находящийся в области BIOS. Действия чтения и подтверждения приема скан-кода могут выглядеть, к примеру, так:

in al,60h ;читаем скан-код push ax ;сохраним его на время in al,61h ;читаем порт 61h or al,80h ;старший бит байта из порта 61h в 1 out 61h,al ;подтверждаем факт приема скан-кода pop ax out 61h,al ;восстановили байт в порту 61h

См . также : урок 7 и команды out, ins/insb/insw/insd, outs

INC

(INCrement operand by 1)

Увеличить операнд на 1

 

Схема команды: inc операнд

Назначение: увеличение значения операнда в памяти или регистре на 1.

Синтаксис

Алгоритм работы:

команда увеличивает операнд на единицу.

Состояние флагов после выполнения команды:

11 07 06 04 02
OF SF ZF AF PF
r r r r r

Применение:

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

inc ax ;увеличить значение в ax на 1

См. также: урок 8 и команды dec, add, adc

INS/INSB/INSW/INSD

(Input String Byte/Word/Double word operands)

Ввод строк байтов/слов/двойных слов из порта

 

Схема команды: ins приемник,порт insb insw insd

Назначение: ввод из порта в память последовательности байт, слов, двойных слов.

Синтаксис

Алгоритм работы:

  • передать данные из порта ввода-вывода, номер которого загружен в регистр dx, в память по адресу es:edi/di;
  • в зависимости от состояния флага df изменить значение регистров edi/di:
    • если df=0, то увеличить содержимое этих регистров на длину структурного элемента последовательности;
    • если df=1, то уменьшить содержимое этих регистров на длину структурного элемента последовательности;
  • при наличии префикса выполнить определяемые им действия (см. команду rep).

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команда вводит данные из порта ввода-вывода, номер которого загружен в регистр dx, в память по адресу es:edi/di. Сегментная составляющая адреса должна быть обязательно в регистре es. Замена сегментного регистра недопустима. Непосредственное задание порта в команде также недопустимо - для этого используется регистр dx. Размеры вводимых элементов зависят от применяемой команды. Команда ins может работать с элементами размером в байт, слово, двойное слово. В качестве операндов в команде указывается символическое имя ячейки памяти, в которую вводятся элементы из порта ввода-вывода. Реально это символическое имя используется лишь для получения типа элемента последовательности, а его адрес должен быть предварительно загружен в пару регистров es:edi/di. Транслятор, обработав команду ins и выяснив тип операнда, генерирует одну из машинных команд insb, insw или insd. Машинного аналога для команды ins нет. Для того чтобы эти команды можно было использовать для ввода последовательности элементов, имеющих размерность байт, слово, двойное слово, необходимо использовать префикс rep. Префикс rep заставляет циклически выполняться команду ввода до тех пор, пока содержимое регистра ecx/cx не станет равным нулю.

.286;ввести 10 байт из порта 300h (номер порта bgr условно);в цепочку байт в памяти по адресуstr_10 db 10 dup(0)adr_str dd str_10 les di,adr_str mov dx,300hrep insb...

См. также: уроки 2, 11 и команды cmps/cmpsb/cmpsw/cmpsd, lods/lodsb/lodsw/lodsd, movs/movsb/movsw/movsd, outs, scas/scasb/scasw/scasd, stos/stosb/stosw/stosd, rep/repe/repz/repne/repnz

INT

(INTerrupt)

Вызов подпрограммы обслуживания прерывания

 

Схема команды: int номер_прерывания

Назначение: вызов подпрограммы обслуживания прерывания с номером прерывания, заданным операндом команды.

Синтаксис

Алгоритм работы:

  • записать в стек регистр флагов eflags/flags и адрес возврата. При записи адреса возврата вначале записывается содержимое сегментного регистра cs, затем содержимое указателя команд eip/ip;
  • сбросить в ноль флаги if и tf;
  • передать управление на программу обработки прерывания с указанным номером. Механизм передачи управления зависит от режима работы микропроцессора (см. уроки 15 и 17).

Состояние флагов после выполнения команды:

09 08
IF TF
0 0

Применение:

Как видно из синтаксиса, существуют две формы этой команды:

  • int 3 — имеет свой индивидуальный код операции 0cch и занимает один байт. Это обстоятельство делает ее очень удобной для использования в различных программных отладчиках для установки точек прерывания путем подмены первого байта любой команды. Микропроцессор, встречая в последовательности команд команду с кодом операции 0cch, вызывает программу обработки прерывания с номером вектора 3, которая служит для связи с программным отладчиком.
  • Вторая форма команды занимает два байта, имеет код операции 0cdh и позволяет инициировать вызов подпрограммы обработки прерывания с номером вектора в диапазоне 0–255. Особенности передачи управления, как было отмечено, зависят от режима работы микропроцессора.

 

;вызов обработчика аппаратного прерывания 08h из программы: int 08h

См. также: уроки 15, 17 и команды into, iret/iretd

INTO

(INTerrupt if Overflow)

Прерывание, если переполнение

 

Схема команды: into

Назначение: инициирование прерывания с номером 4, если установлен флаг of.

Синтаксис

Алгоритм работы:

Проанализировать состояние флага of:

  • если of=0, то никаких действий производить не нужно — передать управление на следующую команду;
  • если of=1, то дальнейшие действия, как при команде int, то есть:
    • записать в стек регистр флагов eflags/flags и адрес возврата. При записи адреса возврата вначале записывается содержимое сегментного регистра cs, затем содержимое указателя команд eip/ip;
    • сбросить в ноль флаги if и tf;
    • передать управление на программу обработки прерывания с данным номером. Механизм передачи зависит от режима работы микропроцессора (см. уроки 15 и 17).

Состояние флагов после выполнения команды:

09 08
IF TF
r r

Применение:

Свойство этой команды инициировать вызов подпрограммы обработки прерывания с номером вектора 4 определяет варианты ее применения. Если предыдущая команда в программе может в результате своей работы установить флаг переполнения of (к примеру, арифметические команды), то для обнаружения и обработки такой ситуации можно использовать команду into. Особенности передачи управления и обработки (корректировки) результата зависят от режима работы микропроцессора.

.486... mov bx,186 imul eax,bx,8;если результату не хватило размерности операнда1,;то of установится в 1;исправим ситуацию в обработчике прерывания 3 into

См. также: уроки 8, 15, 17 и команды int, iret/iretd, imul

IRET/IRETD

(Interrupt RETurn)

Возврат из прерывания

 

Схема команды: iret iretd

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

Синтаксис

Алгоритм работы:

Работа команды зависит от режима работы микропроцесссора:

  • в реальном режиме команда iret последовательно извлекает из стека и затем восстанавливает в микропроцессоре содержимое следующих регистров: eip/ip, cs, eflags/flags. Далее прерванная программа продолжается с точки прерывания;
  • в защищенном режиме действия команды зависят от состояния флага NT (вложенной задачи) в регистре флагов:
    • если NT=0, то производятся действия по возврату управления прерванной программе, при этом характер этих действий зависит от соотношения уровней привилегированности прерванной программы и программы обработки прерывания;
    • в случае NT=1 производятся действия по переключению задач.

Состояние флагов после выполнения команды:

11 10 09 08 07 06 04 02 00
OF DF IF TF SF ZF AF PF CF
r r r r r r r r r

Применение:

Команду iret необходимо применять для восстановления сохраненных командой int регистров флагов, указателя команд и сегментного регистра кода. Число этих команд в программе обработки прерывания должно соответствовать количеству точек выхода из нее. Команда iretd используется в старших моделях микропроцессоров для извлечения из стека и восстановления 32-битных регистров.

my_int1c proc;программа обработки прерывания 1Ch... iret endp

См. также: уроки 15, 17 и команды int, into

JCC

JCXZ/JECXZ

(Jump if condition)

(Jump if CX=Zero/ Jump if ECX=Zero)

Переход, если выполнено условие

Переход, если CX/ECX равен нулю

 

Схема команды: jcc метка jcxz метка jecxz метка

Назначение: переход внутри текущего сегмента команд в зависимости от некоторого условия.

Синтаксис

Алгоритм работы команд (кроме jcxz/jecxz):

Проверка состояния флагов в зависимости от кода операции (оно отражает проверяемое условие):

  • если проверяемое условие истинно, то перейти к ячейке, обозначенной операндом;
  • если проверяемое условие ложно, то передать управление следующей команде.

Алгоритм работы команды jcxz/jecxz:

Проверка условия равенства нулю содержимого регистра ecx/cx:

  • если проверяемое условие истинно, то есть содержимое ecx/cx равно 0, то перейти к ячейке, обозначенной операндом метка;
  • если проверяемое условие ложно, то есть содержимое ecx/cx не равно 0, то передать управление следующей за jcxz/jecxz команде программы.

Состояние флагов после выполнения команды:

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 для обхода цикла, если его счетчик нулевой.

... jcxz m1 ;обойти цикл, если cx=0cycl:;некоторый цикл loop cyclm1: ...

См. также: уроки 10, 11 и команду jmp


Дата добавления: 2019-09-13; просмотров: 239; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!