Что такое imul в ассемблере

Ассемблер. Арифметические инструкции

Обновл. 16 Сен 2021 |

На этом уроке мы будем разбираться с арифметическими инструкциями в ассемблере на примере INC, DEC, ADD, SUB и пр.

Инструкция INC

Инструкция INC (от англ. «INCREMENT») используется для увеличения операнда на единицу. Она работает с одним операндом, который может находиться либо в регистре, либо в памяти.

Синтаксис инструкции INC:

Операндом место_назначения может быть 8-битный, 16-битный или 32-битный операнд.

Инструкция DEC

Инструкция DEC (от англ. «DECREMENT») используется для уменьшения операнда на единицу. Она работает с одним операндом, который может находиться либо в регистре, либо в памяти.

Синтаксис инструкции DEC:

Операндом место_назначения может быть 8-битный, 16-битный или 32-битный операнд.

Инструкции ADD и SUB

Инструкции ADD и SUB используются для выполнения простого сложения/вычитания двоичных данных размером один byte, word или doubleword, то есть для сложения или вычитания 8-битных, 16-битных или 32-битных операндов, соответственно.

Синтаксис инструкций ADD и SUB:

ADD/SUB место_назначения, источник

Инструкции ADD/SUB могут выполняться между:

регистром и регистром;

памятью и регистром;

регистром и памятью;

памятью и константами.

Однако, как и для других инструкций, операции типа память-в-память невозможны с использованием инструкций ADD/SUB. Операции ADD или SUB устанавливают или сбрасывают флаги переполнения и переноса.

В следующем примере мы спрашиваем у пользователя два числа, сохраняем их в регистрах EAX и EBX, затем выполняем операцию сложения, сохраняем результат в ячейке памяти res и выводим его на экран:

Результат выполнения программы:

Enter a digit:
3
Please enter a second digit:
4
The sum is:
7

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

Результат выполнения программы:

Инструкции MUL и IMUL

Есть 2 инструкции для умножения двоичных данных:

инструкция MUL (от англ. «MULTIPLY») обрабатывает данные unsigned;

инструкция IMUL (от англ. «INTEGER MULTIPLY») обрабатывает данные signed.

Обе инструкции влияют на флаги переноса и переполнения.

Синтаксис инструкций MUL/IMUL:

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

Рассмотрим 3 разных сценария:

Сценарий №1: Перемножаются 2 значения типа byte. Множимое находится в регистре AL, а множителем является значение типа byte в памяти или в другом регистре. Результат произведения находится в AX. Старшие 8 бит произведения хранятся в AH, а младшие 8 бит хранятся в AL:

Что такое imul в ассемблере. Смотреть фото Что такое imul в ассемблере. Смотреть картинку Что такое imul в ассемблере. Картинка про Что такое imul в ассемблере. Фото Что такое imul в ассемблере

Что такое imul в ассемблере. Смотреть фото Что такое imul в ассемблере. Смотреть картинку Что такое imul в ассемблере. Картинка про Что такое imul в ассемблере. Фото Что такое imul в ассемблере

Сценарий №3: Перемножаются 2 значения типа doubleword. Множимое должно находиться в EAX, а множителем является значение типа doubleword, хранящееся в памяти или в другом регистре. Результат умножения сохраняется в регистрах EDX и EAX. Биты старшего порядка сохраняются в регистре EDX, а биты младшего порядка сохраняются в регистре EAX:

Источник

Учебники. Программирование для начинающих.

Все для начинающего программиста

Меню сайта

Информация

Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.

Приложение. Система команд процессоров Intel

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

mov AL,5 ;Первый сомножитель
mov BL,3 ;Второй сомножитель
imul BL ;AX=000Fh (произведение)

mov AX,256 ;Первый сомножитель
mov BX,256 ;Второй сомножитель
imul BX ;DX=0001h, AX=0000h
;(число 65536)

Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Имеются также варианты команды с двумя и тремя операндами.

mov EAX,-1 ;Первый сомножитель
mov ESI,100000000 ;Второй сомножитель
imul ESI ;EDX=FFFFFFFFh,
;EAX=FA0AlF00h
;Результат=-100000000

;В полях данных
ор2 dd 100h ;Первый сомножитель
; В программном сегменте
mov EAX,400000h ;Второй сомножитель
imul EAX,op2 ;EAX=40000000h
Пример 3
mov BX,300h
imul АХ,ВХ,4 ;AX=300h*4=0C00h

Источник

Assembler: IMUL, IDIV, NEG

Что такое imul в ассемблере. Смотреть фото Что такое imul в ассемблере. Смотреть картинку Что такое imul в ассемблере. Картинка про Что такое imul в ассемблере. Фото Что такое imul в ассемблере

Apr 21, 2019 · 4 min read

Что такое imul в ассемблере. Смотреть фото Что такое imul в ассемблере. Смотреть картинку Что такое imul в ассемблере. Картинка про Что такое imul в ассемблере. Фото Что такое imul в ассемблере

Привет приятель, вот и очередной пост про Assembler! На связи, как всегда, Naize, и сегодня нас ждут три команды, одна простая, а две других будут по-сложнее. Не будем тянуть, и начнём скорее!

NEG — from plus to minus… And to back

Команда NEG в Ассемблере изменяет знак числа на противоположный, то есть положительное число делает отрицательным, а отрицательное — положительным.

Именно для упрощения преобразования знака и был придуман NEG. Эта мнемоника имеет следующий синтаксис:

NEG число (число должно храниться либо в регистре, либо в переменной)

Инструкция NEG изменяет флаги CF, ZF, SF, OF, AF, PF. Значения флагов зависят от результата операции отрицания (про флаги и регистр FLAGS мы с вами поговорим в среду, а может и раньше))).

На этом разговоры про NEG мы завершим, и перейдём к более интересной команде.

About IMUL

Для умножения чисел со знаком предназначена команда IMUL. Эта команда имеет три формы, различающиеся количеством операндов:

Что такое imul в ассемблере. Смотреть фото Что такое imul в ассемблере. Смотреть картинку Что такое imul в ассемблере. Картинка про Что такое imul в ассемблере. Фото Что такое imul в ассемблере

About IDIV

Для деления чисел со знаком в ассемблере есть команда IDIV. Она очень похожа на обычный DIV и имеет такой же синтаксис. Синтаксис IDIV следующий:

IDIV делитель (где делитель — это 8-, 16-, 32-битный регистр или 8-, 16-, 32-битная переменная).

Местоположение делимого в команде IDIV не указывается, оно жестко определено и зависит от размерности (байт, слово, двойное слово) делителя. В этом отличие от IMUL.

Напомню, что делимое должно быть помещено:

При делении на слово или двойное слово, делимое должно быть “расписано” на два регистра. И да, это выбивает многих из колени, я не исключение))

Запись DX:AX означает делимое в виде двойного слова, два старших байта которого помещены в DX, два младших байта — в AX. Вспоминаем, что двойное слово (4 байта) — это у нас Double Word. Запись EDX:EAX означает тоже, что и в предыдущем случае, но только это уже 8 байт (Quad Wodr то бишь), четыре старших байта которого помещены в EDX, четыре младших байта — в EAX.

What is “Expansion commands” at Assembler?

Важно, это мы ещё не проходили! В знаковом делении используют команды CBW, CWD, CWDE, CDQ, при выполнении которых все старшие биты заполняются нулями — для положительных чисел, или единицами — для отрицательных чисел. Про них мы с вами ещё будем говорить, и посмотрим подробнее работу всего этого хозяйства на примерах. Но это как минимум через пост. А пока кратко пробежимся для общего понимания:

Вот так вот. Пока что имейте ввиду, что при использовании IDIV где-то рядом должна быть одна из команд CBW / CWD / CDQ / CWDE.

AfterWords

Ладно, на сегодня это всё. Материал не самый лёгкий и вам понадобится время, что бы его переварить. В следующем посте вы узнаете про флаги и регистры FLAGS / EFLAGS.

Кстати, ещё больше наших статей вы можете прочитать в Telegram канале. А также для вашего удобства все наши статьи собраны и отсортированы в боте. Ищите нас в Facebook и Twitter 🙂

Источник

Урок 7

Расширенные арифметические операции с целыми числами

Несмотря на то, что мы привыкли к десятичной арифметике (база 10), компьютер работает только с двоичной арифметикой (база 2). Кроме того, ввиду ограничения, накладываемого 16-битовыми регистрами, большие величины требуют специальной обработки. Данная глава дает сведения об операциях сложения, вычитания, умножения и деления для беззнаковых и знаковых данных. В главе приводятся много примеров и предупреждений о различных ловушках для опрометчивых исследователей мира микропроцессора. В следующей главе будут раскрыты операции преобразования между двоичными данными и ASCII кодами.

Сложение и вычитание

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

Поскольку прямой операции память-память не существует, данная oперация выполняется через регистр. В следующем примере к содержимому слова WORDB прибавляется содержимое слова WORDA, описанных как DW:

Переполнения

Многословное сложение

Беззнаковые данные

При возникновении переполнения при сложении знаковых чисел, результат получается неправильный:

При операциях сложения и вычитания может одновременно возникнуть и переполнение, и перенос:

Умножение

«Байт на байт». Множимое находится в регистре AL, а множи тель в байте памяти или в однобайтовом регистре. После умножения произведение находится в регистре AX. Операция игнорирует и стиpает любые данные, которые находились в регистре AH.

В единственном операнде команд MUL и IMUL указывается множитель. Рассмотрим следующую команду:

Если поле MULTR определено как байт (DB), то операция предполагает умножение содержимого AL на значение байта из поля MULTR. Если поле MULTR определено как слово (DW), то опереция предполагает умножение содержимого AX на значение слова из поля MULTR. Если множитель находится в регистре, то длина регистра определяет тип операции, как это показанно ниже:

Беззнаковое умножение: Команда MUL

Знаковое умножение: Команда IMUL

Многословное умножение

Обычно умножение имеет два типа: «байт на байт» и «слово на слово». Как уже было показано, максимальное знаковое значение в слове ограничено величиной +32767. Умножение больших чисел требует выполнения некоторых дополнительных действий. Рассматриваемый подход предполагает умножение каждого слова отдельно и сложение полученных результатов. Рассмотрим следующее умножение в десятичном формате:

Представим, что десятичная арифметика может умножать только двухзначные числа. Тогда можно умножить 13 и 65 на 12 раздельно, cледующим образом:

Следующим шагом сложим полученные произведения, но поскольку число 13 представляло сотни, то первое произведение в действительности будет 15600:

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

Так как первая команда ADD может выработать перенос, то второе cложение выполняется командой сложения с переносом ADC (ADd with Carry). В силу обратного представления байтов в словах в процессоpах 8086/8088, область PRODUCT в действи тельности будет содержать значение 8A13 8066 00E4. Программа предполагает, что первое слово в области PRODUCT имеет начальное значение 0000. Умножение «двойного слова на двойное слово». Умножение двух двойных слов включает следующие четыре операции умножения:

=== Сдвиг регистровой пары DX:AX Следующая подпрограмма может быть полезна для сдвига содержимого pегистровой пары DX:AX вправо или влево. Можно придумать более эффективный метод, но данный пример представляет общий подход для любого числа циклов (и, соответственно, сдвигов) в регистре CX. Заметьте, что сдвиг единичного бита за разрядную сетку устанавливает флаг переноса.

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

Деление

В единственном операнде команд DIV и IDIV указывается делитель. Рассмотрим следующую команду:

Беззнаковое деление: Команда DIV

Знаковое деление: Команда IDIV

Переполнения и прерывания

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

Деление вычитанием

Примечание: очень большое частное и малый делитель могут вызвать тысячи циклов.

Преобразование знака

Команда NEG обеспечивает преобразование знака двоичных чисел из положительного в отрицательное и наоборот. Практически команда NEG устанавливает противоположные значения битов и прибавляет 1. Примеры:

Преобразование знака для 35-битового (или большего) числа включает больше шагов. Предположим, что регистровая пара DX:AX содержит 32-битовое двоичное число. Так как команда NEG не может обрабатывать два регистра одновременно, то ее использование приведет к неправильному результату. В следую щем примере показано использование команды NOT:

Математические сопроцессоры (описание)

Системная плата компьютера содержит пустое гнездо, зарезервированное для числового процессора Intel 8087 (или 80287). Сопроцессор 8087 действует совместно с 8088, а сопро цессор 80287 действует совместно с 80286. Каждый сопроцессор имеет собственный набор команд и средства для операций с плавающей запятой для выполнения экспоненциальных, логарифмических и тригонометрических функций. Сопроцессор содержит восемь 80-битовых регистров с плавающей запятой, которые могут представить числовые значения до 10 в 400 сте пени. Математические вычисления в сопроцессоре выполняются примерно в 100 раз быстрее, чем в основном процессоре. Основной процессор выполняет специальные операции и передает числовые данные в сопроцессор, который выполняет необходимые вычисления и возвращает результат. Для ассембли рования с помощью транслятора MASM, необходимо добавлять параметр /E или /R, например, MASM /R.

Источник

Что такое imul в ассемблере

7.1. Сложение и вычитание.

7.1.1. ADD – команда для сложения двух чисел. Она работает как с числами со знаком, так и без знака.

Логика работы команды:

По сути дела, это – команда сложения с присвоением, аналогичная принятой в языке C / C ++:

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

После выполнения команды изменяются флаги, по которым можно определить характеристики результата:

add dx,cx ;DX = DX + CX

add dx,cl ;Ошибка: разный размер операндов.

Логика работы команды:

По сути дела, это – команда вычитания с присвоением, аналогичная принятой в языке C / C ++:

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

На самом деле вычитание в процессоре реализовано с помощью сложения. Процессор меняет знак второго операнда на противоположный, а затем складывает два числа.

sub b x,cl ;Ошибка: разный размер операндов.

7.1.3. Инкремент и декремент. Очень часто в программах используется операция прибавления или вычитания единицы. Прибавление единицы называется инкрементом, а вычитание — декрементом. Для этих операций существуют специальные команды процессора: INC и DEC. Эти команды не изменяют значение флага CF.

Эти команды содержит один операнд и имеет следующий синтаксис:

Логика работы команд:

7.1.4. NEG – команда для изменения знака операнда.

Логика работы команды:

7.2. Сложение и вычитание с переносом.

В системе команд процессоров x86 имеются специальные команды сложения и вычитания с учётом флага переноса (CF). Для сложения с учётом переноса предназначена команда ADC, а для вычитания — SBB. В общем, эти команды работают почти так же, как ADD и SUB, единственное отличие в том, что к младшему разряду первого операнда прибавляется или вычитается дополнительно значение флага CF.

Они позволяют выполнять сложение и вычитание многобайтных целых чисел, длина которых больше, чем разрядность регистров процессора (в нашем случае 16 бит). Принцип программирования таких операций очень прост — длинные числа складываются (вычитаются) по частям. Младшие разряды складываются(вычитаются) с помощью обычных команд ADD и SUB, а затем последовательно складываются(вычитаются) более старшие части с помощью команд ADC и SBB. Так как эти команды учитывают перенос из старшего разряда, то мы можем быть уверены, что ни один бит не потеряется. Этот способ похож на сложение(вычитание) десятичных чисел в столбик.

На следующем рисунке показано сложение двух двоичных чисел командой ADD:

Что такое imul в ассемблере. Смотреть фото Что такое imul в ассемблере. Смотреть картинку Что такое imul в ассемблере. Картинка про Что такое imul в ассемблере. Фото Что такое imul в ассемблере

При сложении происходит перенос из 7-го разряда в 8-й, как раз на границе между байтами. Если мы будем складывать эти числа по частям командой ADD, то перенесённый бит потеряется и в результате мы получим ошибку. К счастью, перенос из старшего разряда всегда сохраняется в флаге CF. Чтобы прибавить этот перенесённый бит, достаточно применить команду ADC:

Что такое imul в ассемблере. Смотреть фото Что такое imul в ассемблере. Смотреть картинку Что такое imul в ассемблере. Картинка про Что такое imul в ассемблере. Фото Что такое imul в ассемблере

//Сложение двух чисел с учетом переноса: FFFFFFAA + FFFF

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *