Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2012, 20:14   #1
cvbcvb
 
Регистрация: 10.05.2010
Сообщений: 3
Радость IMUL

Перемножены 2 числа. резутьтаты после знакового умножения в первом случае такие: 1) 0000000011111111
во втором такие 2) 1111111100000000
Почему флаги OF и CF после знакового умножения устанавливаются в 1 в обоих случаях?
Обясните пожалуйста?
cvbcvb вне форума Ответить с цитированием
Старый 13.03.2012, 20:26   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

какие числа перемножаются?
rpy3uH вне форума Ответить с цитированием
Старый 13.03.2012, 20:46   #3
cvbcvb
 
Регистрация: 10.05.2010
Сообщений: 3
По умолчанию

это уже результат перемножения целых чисел со знаком. Нужно определить какие будут флаги с таким результатом(это OF=1, CF=1) .
Конкретные множетели не так важны. Один из них со знаком. Я не понимаю почему флаги OF и CF после знакового умножения устанавливаются в 1 в обоих случаях?
cvbcvb вне форума Ответить с цитированием
Старый 14.03.2012, 05:05   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

cvbcvb
Внимательно читай описание команд
Синтаксис команды:
IMUL источник
IMUL приемник, источник
IMUL приемник, источник, число
Назначение: Умножение чисел со знаком
Команда имеет три формы, различающиеся числом операндов:
1) IMUL источник: источник (регистр или переменная) умножается на AL, АХ или ЕАХ (в зависимости от размера операнда), и результат располагается в АХ, DX:AX или EDX:EAX соответственно.
2) IMUL приемник,источник: источник (регистр или переменная) умножается на приемник (регистр), и результат заносится в приемник.
3) IMUL приемник,источник,число: источник (регистр или переменная) умножается на число, и результат заносится в приемник (регистр).
Во всех трех вариантах считается, что результат может занимать в два раза больше места, чем размер источника. В первом случае приемник автоматически оказывается достаточно большим, но во втором и третьем случаях могут произойти переполнение и потеря старших бит результата. Флаги OF и CF будут равны единице, если это произошло, и нулю, если результат умножения поместился целиком в приемник (во втором и третьем случаях) или в младшую половину приемника (в первом случае).
Значения флагов SF, ZF, AF и PF после команды IMUL не определены.
Mikl___ вне форума Ответить с цитированием
Старый 15.03.2012, 05:13   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

чтобы было более понятно - процитирую Рикардо Нарваха, в переводе Aquila - "Введение в крэкинг с нуля, используя OllyDbg" - Глава 5
IMUL (умножение со знаком)
Инструция IMUL - это умножение со знаком и употребляется аналогично MUL.
Код:
IMUL ECX
Данная операция производит умножение ECX на EAX, а результат сохраняется в EDX:EAX с учётом знака операндов.
Несмотря на сходство с инструкцией MUL, IMUL позволяет использовать больше одного операнда, что невозможно в случае с MUL.
Цитата:
Сообщение от туториал CAOS'а
Несмотря на использовальние регистров EAX и EDX по умолчанию, можно указать другие источники и приёмники данных вплоть до трёх операндов. Первый - место, куда необходимо поместить результат и которое всегда должно быть регистром, второй и третий - два значения, которые нужно перемножить. В этих примерах увидим применение этой инструкции с двумя или тремя операндами.
Код:
код  | команда  | комментарий
-----+----------+------------------
F7EB | imul ebx | EAX*EBX -> EDX:EAX
Это первый пример, который похож на MUL, не считая того, что здесь учитываются знаки.
Код:
код            |           команда                      | комментарий
---------------+----------------------------------------+------------------
696E74020080FF | imul ebp, dword ptr [esi+74], FF800002 | [ESI+74]*FF800002 -> EBP
Это второй пример, в котором три операнда: содержимое ESI+74 умножается на FF800002, а результат сохраняется в EBP
Пусть ESI = 401000, ESI + 74 - это адрес 401074, содержимым которого, допустим, является число C7000000. C7000000, будет умножено на FF800002, а результат данной операции будет сохранён в EBP. Калькулятор даёт нам следующий результат операции C7000000 * FF800002=C69C80018E000000. Но поскольку EBP не может вместить его полностью, то в нём остаётся только то, что поместилось, а остальное отбрасывается. EBP=8E000000. При этом флаги OF и CF будут равны единице.
В третьем примере только два операнда, оба из которых перемножаются, а результат сохраняется в первый из них.
Код:
    код  |                команда       | комментарий
---------+------------------------------+------------------
0FAF55E8 | imul edx, dword ptr [ebp-18] | EDX * [EBP-18] -> EDX
Как видим, основной способ для умножения больших чисел - использовать IMUL только с одним операндом, так как в этом случае результат сохраняется в EDX:EAX, то есть он может быть двойного размера, чего нельзя добиться при использовании двух или трёх операндах, соответственно, данную возможность следует применять для маленьких чисел.

Последний раз редактировалось Mikl___; 15.03.2012 в 05:35.
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц