Машинные алгоритмы умножения imul со знаком

Программирование на языке ассемблера

Алгоритм работы: команда выполняет умножение двух операндов без учета Адрес, Машинный код, Вид команды до трансляции .. Команда IMUL( Умножение целых чисел со знаком =” SIGNED MULTIPLY”). Ассемблер. Ассемблер представляет собой машинный язык в симво- лической . Ассемблерных команд, в соответствии с алгоритмом решаемой задачи. Для умножения чисел со знаком предназначена команда. IMUL src. Представление чисел; •Заключение; •Лекция 2 машинная организация IMUL(умножить со знаком) IDIV (разделить со знаком) . Команды умножения IMUL с непосредственным операндом в микропроцессоре нет. .. Более компактный алгоритм с циклом для многоразрядного.

Нужно только представлять себе процесс вычитания в столбик и правильно комбинировать команды микропроцессора с командой sbb. В завершение обсуждения команд сложения и вычитания отметим, что кроме флагов cf и of в регистре eflags есть еще несколько флагов, которые можно использовать с двоичными арифметическими командами.

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

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

Деление чисел без знака Для деления чисел без знака предназначена команда div делитель Делитель может находиться в памяти или в регистре и иметь размер 8, 16 или 32 бит.

Метод «разделяй и властвуй»

Местонахождение делимого фиксировано и так же, как в команде умножения, зависит от размера операндов. Результатом команды деления являются значения частного и остатка. Варианты местоположения и размеров операндов операции деления показаны в таблице Этот вид прерывания относится к так называемым исключениям. Эта разновидность прерываний возникает внутри микропроцессора из-за некоторых аномалий во время вычислительного процесса.

Арифметические операции над двоично-десятичными числами

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

В них могут возникать различные проблемы, для разрешения которых разработчики микропроцессора предусмотрели несколько команд. Команды преобразования типов Что делать, если размеры операндов, участвующих в арифметических операциях, разные?

Например, предположим, что в операции сложения один операнд является словом, а другой занимает двойное слово.

2. Арифметические команды

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

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

Эта операция приводит к целым значениям того же знака и той же величины, что и исходная, но уже в более длинном формате. Подобное преобразование называется операцией распространения знака. Существуют два вида команд преобразования типа. Итак, переполнение регистрируется с помощью флага переполнения of.

Дополнительно к флагу of при переносе из старшего разряда устанавливается в 1 и флаг переноса cf. Так как микропроцессор не знает о существовании чисел со знаком и без знака, то вся ответственность за правильность действий с получившимися числами ложится на программиста. Что же касается команд сложения чисел со знаком, то они те же, что и для чисел без знака.

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

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

Но посмотрите еще раз внимательно на результат операции вычитания. Это же —5 в дополнительном коде! Таким образом, после команды вычитания чисел без знака нужно анализировать состояние флага cf.

Cамоучитель по Assembler

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

К командам вычитания относятся следующие: Эта команда подобна adc, но теперь уже флаг cf выполняет роль индикатора заема 1 из старшего разряда при вычитании чисел. Рассмотрим пример листинг 4 программной обработки ситуации, разобранной в примере 6.

В этом примере в строке 11 выполняется вычитание. С указанными для этой команды вычитания исходными данными результат получается в дополнительном коде отрицательный. Для того чтобы преобразовать результат к нормальному виду получить его модульприменяется команда neg, с помощью которой получается дополнение операнда. В нашем случае мы получили дополнение дополнения или модуль отрицательного результата. А тот факт, что это на самом деле число отрицательное, отражен в состоянии флага cf.

Дальше все зависит от алгоритма обработки. Исследуйте программу в отладчике. Вычитание двоичных чисел со знаком Здесь все несколько сложнее. Последний пример листинг 4 показал то, что микропроцессору незачем иметь два устройства — сложения и вычитания. Достаточно наличия только одного — устройства сложения. Но для вычитания способом сложения чисел со знаком в дополнительном коде необходимо представлять оба операнда — и уменьшаемое, и вычитаемое.

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

Отследить такую ситуацию можно по содержимому флага переполнения of. Его установка в 1 говорит о том, что результат вышел за диапазон представления знаковых чисел то есть изменился старший бит для операнда данного размера, и программист должен предусмотреть действия по корректировке результата. Другой пример разности рассматривается в примере 7, но выполним мы ее способом сложения.

Вычитание и сложение операндов большой размерности Если вы заметили, команды сложения и вычитания работают с операндами фиксированной размерности: А что делать, если нужно сложить числа большей размерности, например 48 бит, используя разрядные операнды?

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