Категория > Новости > Погружение в ассемблер. Работаем с большими числами и делаем сложные математические вычисления - «Новости»
Погружение в ассемблер. Работаем с большими числами и делаем сложные математические вычисления - «Новости»7-10-2020, 00:01. Автор: Andrews |
Как ты знаешь, регистры процессора 8088 — 16-битные. Однако при необходимости ты можешь работать через эти регистры не только с 16-битными числами, но и с числами большей разрядности: и с 32-битными, и даже более крупными. В этой статье я сначала расскажу как, а затем мы нарисуем знаменитый фрактал — множество Мандельброта.Другие статьи курса
Простейшие операции над 32-битными числамиСразу возникает вопрос: если регистры у нас 16-битные, то как с их помощью обрабатывать 32-битные числа? Ответ очевиден: мы просто будем задавать каждое число не одним регистром, а сразу двумя. Только нам надо сначала определиться, какими регистрами и как мы будем для этого пользоваться. Давай не станем изобретать велосипед, а поищем подсказки в самом процессоре 8088. У 8088 есть инструкция Давай и мы, по примеру этих трех инструкций, тоже будем хранить 32-битные числа в Ну вот, мы с тобой условились, где и как хранить 32-битные числа. Теперь давай реализуем для них операцию сложения и операцию вычитания. Для этого нам пригодятся инструкции Удивлен, что операция сложения у нас заняла всего две инструкции? Сейчас объясню, что тут происходит. Дело в том, что, когда ты выполняешь инструкцию Инструкция Теперь давай реализуем вычитание 32-битных чисел по такому же принципу. Что тут происходит? Инструкция Р?нструкция РњС‹ СЃ тобой успешно реализовали операции сложения Рё вычитания. Теперь давай реализуем логическое инвертирование Рё арифметическое инвертирование. Чтобы сделать логическое инвертирование 32-битного числа ( Если требуется выполнить арифметическое инвертирование ( ![]() Реализуем операцию умножения РґРІСѓС… 32-битных чиселА теперь давай реализуем операцию умножения. Рто СѓР¶Рµ будет посложнее. Здесь РЅСѓР¶РЅРѕ вспомнить то, что ты изучал РІ начальной школе. ![]() РўС‹ Р¶Рµ, надеюсь, еще РЅРµ разучился умножать числа РІ столбик? РќР° РІСЃСЏРєРёР№ случай напомню, что РјС‹ тут делаем. Поочередно, справа налево, умножаем каждую цифру РјРЅРѕР¶РёРјРѕРіРѕ РЅР° вторую цифру множителя. Так Сѓ нас получается первая строчка промежуточного результата. Затем умножаем каждую цифру РјРЅРѕР¶РёРјРѕРіРѕ РЅР° первую цифру множителя. Так Сѓ нас получается вторая строчка промежуточного результата. Затем сдвигаем вторую строчку РЅР° РѕРґРёРЅ разряд влево Рё суммируем РґРІР° промежуточных результата. Получается, чтобы перемножить РґРІР° двузначных числа, нам РЅСѓР¶РЅРѕ выполнить четыре операции умножения. Рђ если надо перемножить числа большей разрядности, то операций умножения потребуется еще больше. РќРѕ это если «в роли цифры» Сѓ нас выступают цифры РѕС‚ Почему это удобнее? Потому что для умножения РґРІСѓС… 32-битных чисел (РїРѕ РґРІРµ 16-битные цифры РЅР° каждое) нам понадобится всего четыре инструкции умножения. РўРѕРіРґР° умножение РґРІСѓС… 32-битных чисел РјРѕР¶РЅРѕ будет реализовать РІРѕС‚ так. ![]() Умножение, конечно, выглядит сложновато РїРѕ сравнению СЃРѕ сложением Рё вычитанием. РќРѕ РЅРµ переживай, сейчас РІСЃРµ РѕР±СЉСЏСЃРЅСЋ. Здесь весь алгоритм разделен РЅР° четыре операции умножения: РїРѕ РѕРґРЅРѕР№ РЅР° каждое 16-битное слово. Точно так Р¶Рµ, как РЅР° СЂРёСЃСѓРЅРєРµ СЃ умножением РІ столбик. Кстати, если такой Р¶Рµ алгоритм реализовывать РЅР° 32-битном процессоре, его РјРѕР¶РЅРѕ расширить РґРѕ операций над 64-битными числами, Р° если РЅР° 64-битном процессоре, то над 128-битными числами. РќРѕ давай вернемся Рє нашему 16-битному алгоритму. Обрати внимание, здесь РїРѕРґ результат отводится только 48 Р±РёС‚. Рђ это значит, что если умножить, допустим, Перейти обратно к новости |