Об ассемблере



страница17/52
Дата14.08.2018
Размер3.59 Mb.
#43964
ТипЛекция
1   ...   13   14   15   16   17   18   19   20   ...   52

IMUL


(Integer MULtiply)

Умножение целочисленное со знаком

 


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

imul множитель_1 

imul множ_1,множ_2 

imul рез-т,множ_1,множ_2


Назначение: операция умножения двух целочисленных двоичных значений со знаком.

Синтаксис

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

Алгоритм работы команды зависит от используемой формы команды. Форма команды с одним операндом требует явного указания местоположения только одного сомножителя, который может быть расположен в ячейке памяти или регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:



  • если операнд, указанный в команде, — байт, то второй сомножитель располагается в al;

  • если операнд, указанный в команде, — слово, то второй сомножитель располагается в ax;

  • если операнд, указанный в команде, — двойное слово, то второй сомножитель располагается в eax.

Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей:

  • при умножении байтов результат помещается в ax;

  • при умножении слов результат помещается в пару dx:ax;

  • при умножении двойных слов результат помещается в пару edx:eax.

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

  • в команде с двумя операндами первый операнд определяет местоположение первого сомножителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя;

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

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

11

07

06

04

02

00

OF

SF

ZF

AF

PF

CF

r

?

?

?



r

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

  • для однооперандной формы команды imul регистры ax/dx/edx являются знаковыми расширениями регистров al/ax/eax;

  • для двухоперандной формы команды imul для размещения результата умножения достаточно размерности указанных регистров назначения r16/r32;

  • то же для трехоперандной команды умножения.

Применение:

Команда выполняет целочисленное умножение операндов с учетом их знаковых разрядов. Для выполнения этой операции необходимо наличие двух сомножителей. Размещение и задание их местоположения в команде зависит от формы применяемой команды умножения, которая, в свою очередь, определяется моделью микропроцессора. Так, для микропроцессора i8086 возможна только однооперандная форма команды, для последующих моделей микропроцессоров дополнительно можно использовать двух- и трехоперандные формы этой команды.



.486

...


        mov     bx,186

        imul    eax,bx,8

;если результату не хватило размерности операнда1,

;то перейдем на m1, где скорректируем ситуацию:

        jc      m1

        


См. также: урок 8, приложение 7 и команду mul

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



Поделитесь с Вашими друзьями:
1   ...   13   14   15   16   17   18   19   20   ...   52




База данных защищена авторским правом ©vossta.ru 2022
обратиться к администрации

    Главная страница