Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/40: Рейтинг темы: голосов - 40, средняя оценка - 4.50
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35

Оптимизация ассемблерных программ арифметических операций

15.02.2013, 01:34. Показов 8054. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здесь будет приведено краткое изложение книги А.В. Максимова «Проектирование ассемблерных программ вычислительных алгоритмов». Книга вышла летом 2012 года. Оглавление этой книги приведено в А.В. Максимов Проектирование ассемблерных программ вычислительных алгоритмов
Как только упоминается слово оптимизация, тут же надо искать (или спрашивать) критерии оптимальности. В книге автор оптимизацию ассемблерных программ рассматривает с точки зрения (по критериям) достижения максимальной точности вычисления и минимального кода на исполнение.
Стоит ли вообще рассматривать эту тему, ведь 32, 64 разряда плавающей запятой, более того, FPU, SSE обеспечивают очень высокую точность? Да стоит! FPU, SSE есть в процессорах с системой команд совместимой с Intel x86. Другие процессоры такой разви-той системы команд не имеют, а точность выполнения арифметических операций с чис-лами в формате плавающей запятой значительно ниже точности выполнения этих опера-ций с числами в формате с фиксированной запятой. Точность выполнения арифметиче-ской операции определяется числом разрядов мантиссы. В 32-х разрядных числах форма-та плавающей запятой мантисса занимает 24 разряда (см. стандарт IEEE 754), а в числах с фиксированной запятой – 31!
Пусть в 16-ти разрядном процессоре самое максимальное значение переменной бу-дет 4000h (или 32768 в десятичной записи) с учетом знака. Это самый наихудший случай для представления в ЦВМ переменной, так как самый старший информационный разряд будет занимать только одно значение переменной, другие ее значения будут меньше. Пусть ошибка вычисления определяется тремя младшими разрядами. Тогда приведенная относительная погрешность составит:

δ=(3/32768)*100%≈0,009%

Нет необходимости доказывать, что если ошибка вычислений будет в 2-х или в 1-ом младшем разряде и/или, если, диапазон изменения переменной будет больше (в преде-ле переменная может быть 65535), то приведенная относительная погрешность буде зна-чительно меньше!
Те, кто имели дело с электроизмерительными приборами (вольтметры, микроам-перметры и т.п.), по всей видимости, знают, что эти стрелочные приборы имеют классы точности. Так приборы, которые имеют класс точности 1.0, 0.5 и выше – считаются пре-цизионными (т.е особо точными). Как правило, прецизионные приборы имеют зеркаль-ную шкалу. Цифры 1.0, 0.5 на шкалах этих приборов означают класс точности и соответ-ствуют приведенной относительной погрешности этих приборов. С этой точки зрения даже 8-ми разрядные процессоры при определенных обстоятельствах могут быть преци-зионными устройствами!
Изложение материалов книги будет в виде занятий. На занятие будут рассмотрены конкретные вопросы (или один вопрос). Далее небольшой перерыв для ответов на вопро-сы и обсуждения. Затем изложение нового материала.

Занятие 1. Масштабирование числовых данных


В обычной практике при записи чисел на бумаге предполагается, что нет ограничений на число информационных разрядов, их число бесконечно большое. Числа записываются со столькими разрядами, сколько необходимо для решения конкретной задачи. В ЦВМ число разрядов N, отводимых для записи данных с учетом их знака, является её важнейшим техническим параметром. Этот параметр имеет конкретное и ограниченное значение.
Числа в ЦВМ будем представлять в виде следующего обобщенного графического изо-бражения, называемого форматом представления данных, форматом представления ма-шинной переменной (рисунок 1).

[ATTACH]Вложение 234976[/ATTACH]
Рис 1


Работая с разрядностью N, программист имеет возможность оперировать с 2N числом различных двоичных кодовых комбинаций. Понятно, что число кодовых комбинаций (число двоичных чисел) ограничено и с уменьшением разрядности ЦВМ уменьшается.
Ограниченный диапазон изменения двоичных чисел в ЦВМ порождает при организации вычислительных алгоритмов проблему в установлении оптимального по точности и быстродействию соотношения между конкретными двоичными кодовыми комбинациями (двоичными числами) и конкретными значениями фактических (физических, математических) переменных, моделируемых этими алгоритмами. Проблема решается введением масштабирования данных вычислительного алгоритма.
Определения процесса масштабирования и масштаба:

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

Определение 2: Масштабом называется коэффициент приведения диапазона изменения истинной переменной к диапазону изменения машинной переменной.

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

[ATTACH]Вложение 234981[/ATTACH]

формула (1-а)

Здесь X – истинная (физическая, математическая) переменная, [X] – машинное представ-ление истинной переменной (машинная переменная), Mx – масштаб переменной X. Для того, чтобы масштабирование можно было успешно применять во всем диапазоне изме-нения как истинной, так и машинной переменных, масштаб необходимо определять при наибольших значениях этих переменных, то есть

[ATTACH]Вложение 234982[/ATTACH]

формула (1-б)

Определения масштаба и масштабирования данных в ЦВМ полностью идентичны определениям масштабов и масштабированию в машиностроительном черчении, при построении географических карт и топологических планов.
В уравнении (1) кроме масштаба Мх неизвестным является и [X]max . В самом деле, даже если нам известна разрядность представления данных в ЦВМ, то это еще не означает, что мы имеем возможность определить [X]max .

Определить наибольшее значение машинной переменной можно в том случае, если известно положение машинной запятой, то есть определен формат машинной переменной.

Решить уравнение (1) (назовем это решением задачи масштабирования) можно путем принудительного фиксирования одной из переменных: либо [X]max , либо Мх.
В общем случае произвольная фиксация одной из неизвестной в уравнении с двумя неизвестными приводит к появлению семейства решений этого уравнения или к неоднозначности решения. В нашем случаи это неоднозначность решения задачи масштабирования в общем виде.
При программировании вычислительных алгоритмов для ЦВМ с фиксированной запятой можно применять два метода решения задачи масштабирования: в первом фиксируется формат машинной переменной, во втором – масштаб. Ниже будет рассмотрен только метод фиксированного формата, так как этот метод получил наибольшее распространение в отечественной практике.
При применении метода фиксированного формата программист фиксирует для всех переменных и констант вычислительного алгоритма положение машинной запятой в машинном формате данных. Возможны пять случаев фиксации положения машинной запятой, но наибольшее распространение получили два: так называемые дробная и целочисленная арифметики.
На рисунке 2 показан формат машинных данных при использовании дробной арифметики:

[ATTACH]Вложение 234977[/ATTACH]

Рис. 2.

Все машинные числа в этой арифметике будут дробными. (Отсюда и название).
На рисунке 3 приведен формат машинной переменной в целочисленной арифметике:
[ATTACH]Вложение 234978[/ATTACH]

Рис. 3.

В этом случае все машинные переменные будут целыми числами.
Масштабы, определяемые по формуле (1) называются предельными. Предельные масштабы неудобны. Более практичнее – двоичные масштабы. (Вспомним в машиностроительном черчении ГОСТами определены строго определенные масштабы 1:2, 1:4, 2:1, 10:1, 1:10 и т.п. В географических картах – свои стандарты масштабов 1:50000, 1:1000, 1:1000000 и т.п)
Для любого значения Xmax всегда можно найти такое целое mx, что будет справедливо неравенство
[ATTACH]Вложение 234983[/ATTACH]

Формула (2)
где mx принято называть масштабным коэффициент. Масштабный коэффициент показывает сколько двоичных разрядов необходимо для представления целой части переменной с учетом представления ее максимального значения.
Очевидно, что для дробной арифметике наибольшее машинное число определится как:

[X]max = 1- 2^(-n) ≈ 1 (3)

Приближенное равенство можно применять для n ≥ 7, при этом ошибка не превысит 1,5625%.
Подставим в (1) наибольшее значение истинной переменной из правой части неравенства (2), а наибольшее значение машинной переменной из (3) получим формулу для масштаба в дробной арифметике:

[ATTACH]Вложение 234984[/ATTACH]
Формула (4)

В целочисленной арифметике наибольшее значение машинной переменной определяется как

[X]max = 2^(n) – 1 ≈ 2^n.

И в этом случае приближенное равенство можно применять для n ≥ 7, и также ошибка не превысит 1,5625%. Используя последнее приближенное равенство и правую часть неравенства (3) получим формулу масштаба для целочисленной арифметике:
[ATTACH]Вложение 234985[/ATTACH]
Формула (5)

В формулах (4) и (5) специально применены различные буквы для обозначения масштаба. Применение такого обозначения в дальнейшем позволит быстро определять тип арифметики, применяемой для решения конкретной задачи.
Пример 1.
Дано: разрядность ЦВМ N=8, наибольшее значение переменной Аmax=30,5, текущее значение переменной, подлежащее представлению в заданной ЦВМ, А=20,5.
Решение: Примем целочисленную арифметику.
Определим масштабный коэффициент ma для переменной А в соответствии с выражением (2):
2^4 <(или =) Аmax < 2^5 , откуда ma = 5.

Определим по формуле (5) масштаб переменной А
Ma = 2^(n-ma) = 2^(7-5) = 2^2 .
По формуле (1-а) определим текущее машинное значение [А]:

[А] = A * Ma = 20,5 * 2^2 = (2^4 + 2^2 + 2^(-1) ) *2^2 = 2^6 + 2^4 + 2^1 .

В последнем выражении в скобках приведено разложение текущего значения А по целым степеням двойки. Вычислять сумму степеней двойки в машинном представлении [А] = 2^6 + 2^4 + 2^1 нет необходимости, так как запись в целых степенях двойки полностью соответствует формуле записи [А] в двоичной системе счисления.
В случае нашего примера для целочисленной арифметики принимает вид:

[А] = а6*2^6 + а5*2^5 + а4*2^4 + а3*2^3 + а2*2^2 + а1*2^1 + а0*2^0 .

Очевидно, что значения коэффициентов а6=а4=а1=1, а коэффициентов а5=а3=а2=а0=0. Учитывая формат данных для целочисленной арифметики (смотри рис. 3), впишем единицы в разряды, веса которых соответствуют коэффициентам а6, а4, а1, а нули в разряды, веса которых соответствуют коэффициентам а0, а2, а3, а5. Получен-ный результат иллюстрирует рисунок 4:
[ATTACH]Вложение 234986[/ATTACH]
Рис. 4.

В программных продуктах очень часто для ввода/вывода данных используют шестнадцатиричную форму записи данных. В нашем примере текущее машинное значение переменной в десятичной, двоичной и шестнадцатиричной формах записи будет иметь вид
[А] =82d=01010010b=52h .
В рассматренном примере текущее число 20,5 больше половины наибольшего значения переменной А (точнее больше чем (32:2)=16), следовательно в машинном представлении этого числа не должно быть свободных старших информационных разрядов. Это вывод подтверждается рисунком 4. Так как ma = 5, а масштабный коэффициент определяет число двоичных разрядов, отводимых для записи целой части машинной переменной, то положение истинной запятой в машинном формате будет между первым и вторым разрядами. Относительно положения истинной запятой в формате заданной ЦВМ по результату решения прямой задачи записано число 10010,10b=>20,5d, что является правильным результатам. Итак, на основании анализа результата тестового примера можно ут-верждать, что задача представления данных для переменной А решена правильно.
В книге рассматриваются много примеров представления чисел в ЦВМ. Приводятся примеры решения обратной задачи – определения истинного значения переменной по ее машинному значению. На этих примерах останавливаться не будем из-за экономии места. Рассмотрим лишь пример представления дробей.
Дано: n = 11, Хmax = 128, текущее значение переменной – Х =15,8. Определить машинное представление текущего значения переменной.
Решение. Перевод из одной системы счисления в другую смешанного числа проводят в два этапа: отдельно переводят целую часть, отдельно дробную. В нашем случае представление целой части Х имеет вид 15,0d -> 1111,0b
Переведем в двоичную систему дробную часть нашего числа по методике, изложенной в книге Соловьева Г.Н. «Арифметические устройства ЭВМ», издательство Энергия, 1978г. В этом случае необходимо дробь умножить на два. Если результат умножения не превысил 1, то первая значащая цифра двоичного представления дроби равна 0 и умножение повторяют до тех пор, пока результат превысит 1, записывая каждый раз нули в значащие цифры двоичного представления дроби. Как только результат превысил 1, то значащая цифра двоичного представления равна 1. Эту единицу вычитают из результата ум-ножения и продолжают умножение на 2 оставшейся дроби. Процесс повторяют до тех пор, пока не получат в остатке 0 или пока не выявится период, или достигнут желаемой точности.
В нашем примере дробная часть равна 0,8. Рисунок 5 иллюстрирует перевода этой дроби в двоичную систему:

[ATTACH]Вложение 234979[/ATTACH]
Рис.5.

Нетрудно заметить, что конечная дробь в десятичной системе трансформируется в периодическую в двоичной.!!! (Очень важно!) Таким образом, исходное текущее значение переменной Х в двоичной системе можно записать в виде
Хd = 15,810 -> 1111,1100(1100)b .

В нашем примере масштабный коэффициент в соответствии с (2) равен mx=8. Следовательно, для представления целой части переменной Х необходимо отвести 8 разрядов. Для представления дробной части остаются три разряда. На рисунке 6 представлено текущее значение Х в формате заданной ЦВМ. Из рисунка видно, что фактически в ЦВМ представлено число 15,75, а не 15,8 как необходимо. Полученная погрешность представления числа Х = 15,8, называется погрешностью оцифровки. Эту особенность необходимо учитывать при масштабировании сложных математических выражений.
[ATTACH]Вложение 234980[/ATTACH]
Рис. 6.

В книге кроме понятия масштаба дается определение цене как величине обратной масштабу. Для дробной арифметике это цена машинной единицы, для целочисленной - цена младшего разряда.
На этом изложение первой главы закончу. В следующей главе будут рассмотрены приемы оптимизации ассемблерных программ одиночных арифметических операций: сложения/вычитания, умножения, деления.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2013, 01:34
Ответы с готовыми решениями:

А.В. Максимов Проектирование ассемблерных программ вычислительных алгоритмов
Предлагаю обсудить книгу А.В. Максимов Проектирование ассемблерных программ вычислительных алгоритмов Учебное пособие для студентов...

Блок-схемы ассемблерных программ
Как их делают и на что они похожи? Нету примерчика?

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

14
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
15.02.2013, 04:40
K_1212,
замечания по оформлению:
  1. текст скопирован с электронного носителя, но вот просмотреть или поискать с помощью Ctrl+F и удалить переносы всё таки нужно, постоянно режут глаз: «разви-той», «чис-лами», «опера-ций»
  2. в тексте полно верхних и нижних индексов: «[X]max = 1- 2^(-n) ≈ 1» для публикации на сайте следует использовать тэги [SUВ] и [/SUВ] для верхних, [SUР] и [/SUР] для нижних
  3. картинки и формулы вставляются в расширенном режиме редактирования и окружаются тэгами [IМG] и [/IМG], у Вас ссылки на картинки и формулы ведут в никуда, формулы, кстати, можно набирать и в редакторе формул который находится над окном редактирования
А по тексту -- вполне читабельно, нормальные объяснения, особенно понравилась идея изложения материалов книги в виде занятий. С нетерпением жду продолжения...
0
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
16.02.2013, 22:59  [ТС]
Прошу простить такую мою оплошность! В первый раз такой большой материал представляю здесь!
Хотел открыть новую тему с исправлениями, но потом решил исправиться. Все файлы вставил здесь.
Mikl___
Спасибо за поддержку и полезные советы.

Рисунок 1
Вложение 235517

Формула 1-а
Вложение 235519

Формула 1-б
Вложение 235520

Рисунок 2
Вложение 235521

Рисунок 3
Вложение 235522

Формула 2
Вложение 235523

Формула 4

Вложение 235524

Формула 5

Вложение 235525

Рисунок 4

Вложение 235529

Рисунок 5

Вложение 235530

Рисунок 6

Вложение 235531

Попробую набрать формулу (3)
0
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
16.02.2013, 23:20  [ТС]
Опять облом!!!!
Рисунок 1

Рисунок 2

Рисунок 3

Рисунок 4

Рисунок 5

Рисунок 6

Кажется рисунки вставились!!!!
Формула 1-а

Формула 1-б

Формула 2

Формула 4

Формула 5


Ну вот исправился

Формула (3)
\left|X \right|max=1-{2}^{-n}\approx 1
1
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
16.02.2013, 23:31  [ТС]
Ну вот и опять облом!!!!
Формула не вставилась
Формула (3)
https://www.cyberforum.ru/cgi-bin/latex.cgi?\large \left|X \right|max=1-{2}^{-n}\approx 1

Беру тайм-аут на три дня для освоения редактора текста и формул.
На вопросы готов отвечать.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
16.02.2013, 23:43
Цитата Сообщение от K_1212 Посмотреть сообщение
Пусть в 16-ти разрядном процессоре самое максимальное значение переменной бу-дет 4000h (или 32768 в десятичной записи) с учетом знака.
нестыковочка однако
4000h это 16384
а 32768 это 8000h не может быть такого положительного числа для знаковых в 16 битах
для безнаковых
FFFFh=65535 максимальное
для знаковых
7FFFh = 32767 максимальное положительное
8000h = -32768 минимальное отрицательное
FFFFh=-1 максимальное отрицательное
1
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
20.02.2013, 01:07  [ТС]
Всем добрый вечер!
Пример состояния человека, удовлетворяющего поговорке: "Что такое не везет и как с ним бороться".
Рисунки не вставляются, формулы не форматируются, расчеты экспромтом - с грубыми ошибками!
ValeryS - Вы совершенно правы. Более того, в формуле приведенной относительной погрешности еще одна "плюха"!
Предварительно оговорил значение ошибки в трех младших разрядах, а в формулу подставил число 3, когда должна стоять 7. Не убивайте, может еще пригожусь!?
Все во власти всевышнего. Видимо не хочет он моего присутствия на форуме.
Величина приведенной относительной погрешности должна иметь вид:

https://www.cyberforum.ru/cgi-bin/latex.cgi?\delta =\frac{7}{16384}*100%\approx 0,043%

Но даже после исправления вывод остается прежним: 16-ти разрядная ЦВМ может давать высокую точность арифметических операций!!!

Занятие 2. Масштабирование операций сложение/вычитание


С точки зрения процессора ЦВМ операции сложения и вычитания - эквивалентны. Поэтому масштабирование их проводится по одному правилу.
Цели масштабирования операции сложения (или вычитания):
а) Избежать переполнения:
б) Выполнить операцию с максимальной точностью
Напомню, переполнение - эффект в ЦВМ, когда, например, складываются два положительных числа, а сумма получается отрицательной.
Под максимальной точностью будем понимать наличие в старшем информационном бите прямого кода переменной 1, когда переменная имеет максимальное значение.
При выводе масштабных соотношений в рассматриваемом случае вводиться термин выравнивание масштабов. Действия, выполняемые по выравниванию масштабов чисел с фиксированной запятой, эквивалентны действиям, выполняемым при выравнивании порядков для сложения чисел в формате с плавающей запятой.
Важно: коэффициенты выравнивания масштабов есть двойки в нулевой или отрицательной целой степени.
Материалы этого занятия имеют много формул, рисунков, примеров. Боюсь опять сделать что-нибудь не так.
Все материалы в файле Сложение.pdf.
На странице 48 рисунок 2.2 - ошибка (техническая опечатка). Результат операции должен быть
01000011.
Сложение.rar
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
20.02.2013, 01:37
Цитата Сообщение от K_1212 Посмотреть сообщение
Не убивайте, может еще пригожусь!?
Да не живи пока
Цитата Сообщение от K_1212 Посмотреть сообщение
Напомню, переполнение - эффект в ЦВМ,
не только
ближайший пример стрелочные часы
к 11 часам прибавить 3
получим переполнение (результат 2)
0
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
26.02.2013, 23:33  [ТС]
Занятие 3. Масштабирование операции умножения

Методика вывода масштабных соотношенй одинакова для всех арифметических операций. Подробно разъясняется причина появления поправочных коэффициентов соответственно для дробной и целочисленной арифметик.
Все особенности иллюстрируются примерами.
Особо следует обратить внимание на повышение точности выполнения операции умножения. Запас по точности есть у каждой операции умножения. Этот запас как минимум один разряд, как максимум - два. Интересно заметить, что , например, фирма Analog Devices для повышения точности выполнения операции умножения в своих сигнальных процессорах типа Blackfin 536, 561 и др специально ввела как самостоятельную команду умножения со сдвигом произведения на один разряд влево. Так что этим советом целесообразно пользоваться!!!
В книге не рассмотрено беззнаковое умножение (т.е. применение команда mul). Но используя методику книги можно быстро получить результаты и для этого случая.
На форумах иногда встречаются "программисткие откровения" - способы замены умножения, например на число 3, сложением. Для этого множимое сдвигают на один разряд вправо и складывают результат сдвига с исходным значением. В книге показано как это делать для многих чисел. Еще раз обращаю внимание - практических примеров очень много.
Желаю успехов в освоении материала!

Умнож 1.pdf

Умнож 2.pdf
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
04.03.2013, 06:55
K_1212,
замеченные опечатки и неточности:
  1. стр 48 рис 2.2 [https://www.cyberforum.ru/cgi-bin/latex.cgi?y_1] 0000010,0
    [https://www.cyberforum.ru/cgi-bin/latex.cgi?x] 0011111,1
    [https://www.cyberforum.ru/cgi-bin/latex.cgi?z] 0100001,1
  2. стр 54 https://www.cyberforum.ru/cgi-bin/latex.cgi?M_x=2^{7-9}=2^{-2}
  3. стр 58 https://www.cyberforum.ru/cgi-bin/latex.cgi?|z|_{max} = 531,75 + (-1020)
    https://www.cyberforum.ru/cgi-bin/latex.cgi?-1020_d = - 0000001111111100,00_b = not(0000001111111100,00_b) + 0,01_b =  1111110000000100,00_b

    Code
    1
    2
    3
    4
    5
    6
    
           00001000010011,11        
          +11110000000100,00
           _________________
           11111000010111,11
           _________________
          -00000111101000,01= -488,25
  4. стр 70 imul одно-, двух-, трех-операндные команды, а не одно-, двух-, трех-адресные
    OpcodeInstructionDescription
    F6/5 IMUL r/m8 AX<- AL * r/m byte
    F7/5 IMUL r/m16 DX:AX <- AX * r/m word
    F7/5 IMUL r/m32 EDX:EAX <- EAX * r/m doubleword
    REX.W + F7/5 IMUL r/m64 RDX:RAX <- RAX * r/m quadword
    0FAF/r IMUL r16,r/m16 word register <- word register * r/m word
    0FAF/r IMUL r32,r/m32 doubleword register <- doubleword register * r/m doubleword
    REX.W + 0FAF/r IMUL r64,r/m64 quadword register <- quadword register * r/m quadword
    6B/r ib IMUL r16,r/m16,imm8 word register <- r/m word * signextended immediate byte
    6B/r ib IMUL r32,r/m32,imm8 doubleword register <- r/m doubleword * sign-extended immediate byte
    REX.W + 6B/r ibIMUL r64,r/m64,imm8 quadword register <- r/m quadword * sign-extended immediate byte
    6B/r ib IMUL r16,imm8 word register <- word register * sign-extended immediate byte
    6B/r ib IMUL r32,imm8 doubleword register <- doubleword register * signextended immediate byte
    REX.W + 6B/r ibIMUL r64,imm8 quadword register <- quadword register * signextended immediate byte
    69/r iw IMUL r16,r/m16,imm16word register <- r/m word * immediate word
    69/r id IMUL r32,r/m32,imm32doubleword register <- r/m doubleword * immediate doubleword
    REX.W + 69/r idIMUL r64,r/m64,imm32quadword register <- r/m quadword * immediate doubleword
    69/r iw IMUL r16,imm16 word register <- word register * immediate word
    69/r id IMUL r32,imm32 doubleword register <- doubleword register * immediate doubleword
    REX.W + 69/r idIMUL r64,imm32 quadword register <- quadword register * immediate doubleword
    для команды imul с тремя операндами ист1 может быть только 16-/32-/64-разрядными регистрами или 16-/32-/64-разрядной ячейкой памяти, а операнд пр только 16-/32-/64-разрядным регистром, но не 8-разрядным. Попробуйте написать команду imul, где один или два операнда будут иметь размер байт — компилятор выдаст следующие ошибки:
    • imul ax,bl,0Ah; invalide instruction operands
    • imul al,bl,0Ah; byte register cannot be first operand
    • imul ax,byte ptr [bx],0Ah;instruction operands must be the same size
0
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
05.03.2013, 23:11  [ТС]
Mikl___ !
Ваши замечания, комментарии, советы всегда приятно видеть: они лаконичные, аргументированы, четкие!
По порядку замечаний:
1. Да, но я об этом недостатке говорил А.В. Максимов Проектирование ассемблерных программ вычислительных алгоритмов.
2. Да! Эту небрежность я не заметил!
3. Здесь Вы ошиблись. в книге все в порядке! Там идет речь об операции вычитания. Посмотрите внимательнее.
4. Разделю это замечание на две части.
Первая
Вы советуете применять выражение трех-операндная команда, вместо трех-адресная.
Если подходить с точки зрения точности перевода "мануала" Intel, то Вы, несомненно, правы!
Но если учитывать российско-советскую школу цифровой вычислительной техники, то она сформировала термин
АДРЕСНОСТЬ команды процессора. Этот термин вошел в отраслевые стандарты, учебники, методики проектирования процессоров. (Адресность - технический параметор, подлежащий проектированию). С этой точки зрения, наверное, можно позволить автору употребить термин трех-адресная команда.
Вторая часть - Вы абсолютно правы, в трех-операндной (трех-адресной) команде IMUL нельзя применять приемник и источник разрядности байт. Кроме источника в виде непосредственного числа.
0
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
09.03.2013, 23:15  [ТС]
Занятие 4. Масштабирование операции деления.


Операция деления самая сложная в математике и, как следствие, в аппаратной и программной реализациях. Как пример этому очень много вопросов на форумах программистов – «сваливается» программа деления, «деление на ноль – почему? Я делал все правильно, как учили, делил слово на байт!» и т.п. Очень часто дают советы типа: «такое деление в целых числах выполнять не целесообразно, всегда будет ноль в ответе, переходите на FPU». А на самом деле выполнить нормальное деление при указанных условиях можно!
Практически на все подобные вопросы найдете ответы в подразделах книги 2.6 и 2.7 «Масштабирование операции деления» и «Особые случаи масштабирования операции деления» соответственно.
В книге приводятся типовые варианты программ деления, которые можно использовать как шаблоны. Как всегда много практических примеров.
Основное правило для программиста при реализации операции деления - частное не должно выходить за установленные разработчиком аппаратной части (в нашем случае Intel-ом) рамки в машинных целых числах:
для байта – -128 или +127;
для слова – - 32768 или + 32767;
для двойного слова – - 2 141 483 648 или + 2 141 483 647
для квадрослова – - 9 223 372 036 854 775 808 или + 9 223 372 036 854 775 807.
В этом смысле так и хочется подвергнуть критике пиаровское словоблудие в мануале Intel о делении слова на байт, двойного слова на слово, квадрослова на двойное слово и т.п. Но здесь этим заниматься не будем.
Intel так организовал аппаратное деление, что требует числитель располагать в расширенном аккумуляторе:
для байта это регистры AH:AL
для слова DX:AX
для двойного слова EDX:EAX
для квадрослова RDX:RAX
(Здесь: аккумулятор AL, AX, EAX, RAX; расширение аккумулятора - AH, DX, EDX, RDX.) При этом во всех битах расширителя аккумулятора должен быть знак числителя! Для облегчения программистам выполнять это условие Intel предусмотрел специальные команды копирования знака аккумулятора во все биты расширения:
CBW (Convert Byte to Word) преобразовать байт в слово;
CWD (Convert Doubleword to Quadword) преобразовать слово в двойное слово;
CDQ (Convert Doubleword to Quadword) преобразовать двойное слово в квадрослово;
CQO (Convert Quadword to OWord ) преобразовать квадрослово в восемь слов (OctavWord). Команды расширения обязательно должны применяться при программировании знакового деления. Их место в программе – перед командой IDIV. Если применяется беззнаковое деление (команда DIV) обязательно необходимо в расшерение загрузить ноль.
Если эти условия выдерживать – команды IDIV и DIV будут выполняться безупречно во всем диапазоне изменения числителя одинарного формата (от 800…00h до 7FF…FFh), и во всем диапазоне изменения знаменателя независимо от значения числителя от 800…00h до 7FF…FFh, кроме 0h, естественно, и даже при 01h. При этом, возможны специфические случаи, когда
истинные числитель и знаменатель не равны каждый независимо друг от друга нулю, при этом истинное частное, естественно, не равно нулю; для этого же случая машинные числитель и знаменатель независимо друг от друга не равны нулю, а машинное частное – равно нулю. Такой случай возникает тогда, когда машинный числитель в одинарной (первоначальной, нерасширенной) разрядности по абсолютной величине меньше машинного значения (одинарной разрядности) знаменателя. В любой позиционной системе счисления если 50/700 , то целая часть частного равно нулю. Дробная часть – 5/70, или 50 в остатке. Intel не дает возможности получать дробную часть частного, частное в аппаратном решении у него – одинарной разрядности и только старшая часть. (Вспомните, при умножении аппаратная часть дает программный доступ к полному произведению удвоенной разрядности!). Легко проверить (в книге это показано), что при полнодиапазонном изменениях числителя и знаменателя, независимо друг от друга, под частное необходимо, в идеальном случае, выделять удвоенную разрядность. А Intel в аппаратуре выделяет только старшую часть одинарной разрядности!
Учитывая все сказанное становится понятным почему появляется «деление на ноль» и нецелесообразность выполнять некоторые операции деления в целых числах.
Если заранее известно, что машинное значение знаменателя никогда не достигнет своего самого наименьшего значения 000…01h для положительных чисел или 0FF…FFh для отрицательных чисел, то можно повысить точность или даже реанимировать операцию деления за счет левого сдвига расширенного числителя на строго определенное число разрядов. В книге приводится методика расчета числа разрядов для повышения точности.
Примеры.
Здесь https://www.cyberforum.ru/asse... 98874.html участник форума попросил помочь вычислить значение выражения

https://www.cyberforum.ru/cgi-bin/latex.cgi?Y=\frac{A}{{A}^{2}+1}

Пусть, для конкретности, А=3 и разрядность данных N=16. Результат вычислений равен 0,3.
Если подходить к решению этой задачи не зная о методах повышения точности операции деления, получим следующую программу (пример 1):
Assembler
1
2
3
4
5
6
7
mov ax,  3h
mul ax
add ax, 1h  
xor dx,  dx
mov bx, ax  
mov ax, 3
div bx
Частное должно быть в AX, в DX – остаток. Имеем: AX = 0, DX = 0003

Для отрицательного значения А (пусть оно будет А=-3) основное тело программы будет (пример 2):

Assembler
1
2
3
4
5
6
7
mov ax, -3
imul ax
add ax,1
mov bx, ax
mov ax, -3
cwd
idiv bx
Перед выполнением собственно операции деления в аккумуляторе машинный числитель c учетом представления отрицательных чисел в дополнительном коде AX = FFFD h = (-0003h) = (-3)d. В регистре BX машинное значение делителя BX=000Ah =10d. При делении в позиционной системе счисления (-0003)h на 000Аh или (-3)d на 10d мы получим 0 целых в регистре AX и остаток в регистре DX=FFFDh.
Нетрудно заметить, что при реализации исходного выражения в программах, написанных как показано выше, при любых значениях А перед операцией деления машинный числитель всегда будет меньше машинного знаменателя. Это означает, что ответ всегда будет равен 0! То есть программа при реализации в целых числах не имеет смысла. Следовательно, сделаем вывод, необходим FPU!
Не будем торопиться. Методика, предложенная в книге, весьма эффективна! Применим ее для рассматриваемого примера. Пусть А=-3, разрядность N=16.
Выполним масштабирование:
масштаб А=3 в целочисленной арифметике

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{a}={2}^{13};

масштаб https://www.cyberforum.ru/cgi-bin/latex.cgi?Y1={A}^{2}=9

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{Y1}={2}^{11};

масштаб 1-цы

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{1}={2}^{14};

коэффициент выравнивания масштаба 1-цы при ее сложении с Y1

https://www.cyberforum.ru/cgi-bin/latex.cgi?K1={2}^{-3};

масштаб знаменателя, то есть Y2=(Y1+1)=10

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{Y2}={2}^{11};

предварительная оценка масштаба частного Y3 = A/Y2, то есть результата

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{Y3}=\frac{{M}_{a}}{{M}_{Y2}}={2}^{2}

(в книге предварительные масштабы помечаются звездочкой);

фактический масштаб результата

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{Y3ist}={2}^{16};

запас по точности при выполнении деления

https://www.cyberforum.ru/cgi-bin/latex.cgi?P={\log }_{2}(\frac{{M}_{Y3ist}}{{M}_{Y3}})={\log }_{2}(\frac{{2}^{16}}{{2}^{2}})=14

Основное тело программы будет иметь вид (пример 3):

Assembler
1
2
3
4
5
6
7
8
mov ax, -3*8192
imul ax
shld dx,ax,1
add dx,800h
mov bx,dx
mov ax,-3*8192
cwd
idiv bx
Выполнение этой программы дает следующий результат:
частное в АХ – B334h;
остаток в DX – C000h;
истинное значение частного с учетом представления отрицательных чисел в дополнительном коде будет равно

https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{B334h}{{2}^{16}}=\frac{-19660}{{2}^{16}}=- 0,29998779296875

Пусть А=3, разрядность данных также 16.
Выполним масштабирование:
масштаб А-3 в целочисленной арифметике

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{a}={2}^{14};

масштаб https://www.cyberforum.ru/cgi-bin/latex.cgi?Y1={A}^{2}=9

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{Y1}={2}^{12};

масштаб 1-цы

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{1}={2}^{15};

коэффициент выравнивания масштаба 1-цы при ее сложении с Y1

https://www.cyberforum.ru/cgi-bin/latex.cgi?K1={2}^{-3};

масштаб знаменателя, то есть Y2=(Y1+1)=10

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{Y2}={2}^{12};

предварительная оценка масштаба частного Y3 = A/Y2 , то есть результата

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{Y3}=\frac{{M}_{a}}{{M}_{Y2}}={2}^{2};

фактический масштаб результата

https://www.cyberforum.ru/cgi-bin/latex.cgi?{M}_{Y3ist}={2}^{17};

запас по точности при выполнении деления

https://www.cyberforum.ru/cgi-bin/latex.cgi?P={\log }_{2}(\frac{{M}_{Y3ist}}{{M}_{Y3}})={\log }_{2}(\frac{{2}^{17}}{{2}^{2}})=15

Основное тело программы будет иметь вид (пример 4):

Assembler
1
2
3
4
5
6
7
8
9
mov ax, 0с000h
mul ax
add dx,1000h
mov bx,dx
mov ax, 0c000h
xor dx,dx
shld dx,ax,15
sal ax,15
div bx
Выполнение этой программы дает следующий результат:
частное в АХ – 9999h
остаток в DX - 6000h
Истинное значение частного будет равно

https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{9999h}{{2}^{17}}d=0,29999542236328125

Если выполнять вычисления с разрядностью N=8, то для А=3 основное тело программы будет иметь вид:

Assembler
1
2
3
4
5
6
7
8
mov al, 0с0h
mul al
add ah,10h
mov bl,ah
mov al, 0c0h
xor ah,ahx
sal ax,7
div bl
Частное будет в AL =99h.
Истинное значение частного в этом случае равно:

https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{99h}{{2}^{9}}=\frac{153}{512}=0,298828125

Очевидно, что комментарии здесь излишни!!!
Более интересным был бы пример программы, которая вычисляет значение функции

https://www.cyberforum.ru/cgi-bin/latex.cgi?Y=\frac{X}{{X}^{2}+1}

допустим в интервале изменения аргумента Х от -6 до +6.
Рассмотрим этот пример на следующем занятии.
Напомню, что конечная дробь в одной позиционной системе счисления не обязательно будет конечной в другой. Конечная в десятичной системе счисления дробь 0,3d - в двоичной будет периодической 0,0(1001)b = 0,25+0,003125 + …. = 0,28125 + …. .
В книге обнаружена еще неточность. На стр. 103 на восьмой строке снизу неправильная ссылка на рисунок: есть «рис. 2.29, ……», должно быть – «рис. 2.25, ….»
В прилагаемых файлах:
деление.pdf – скан соответствующего раздела книги;
Pr4.doc – полный текст программы пяти примеров, рассмотренных выше с комментариями. Программа написана под MS DOS. Текст программы написан в виндовском Блокноте.
Вложение 242121
Вложение 242119
Желаю всем успехов!
1
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
10.03.2013, 19:47  [ТС]
Наверное опять промазал с файлами вложения!?
Повторяю
[ATTACH]Pr4.doc[/ATTACH]
Вложения
Тип файла: pdf Деление.pdf (8.61 Мб, 61 просмотров)
1
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
12.03.2013, 22:29  [ТС]
Повторю файл текста примеров, наверное опять не проходит.

Интересно, я этого не знал: не принимает один и тот же файл с расширением .DOC, но с измененным именем.
Я хотел повторить вложение файла Pr4.doc - редактор не принимает. Изменил имя - не принимает и оба раза говорит, что я уже вложил этот файл. Я делаю что-то не так, как надо?!!
0
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
16.03.2013, 23:28  [ТС]
Добрый вечер всем!

Занятие 5 Масштабирование вычислительных процессов

Заключительный раздел цитируемой книги полностью посвящен практическим примерам программирования вычислительных задач.
Сформулирована методика, которая не требует комментариев. Методика содержит всего 5 пунктов и умещается на 2-х страницах.
Далее весьма подробно разобраны примеры программирования вычисления полинома, синуса, разложенного в ряд Маклорена, решения простой системы дифференциальных уравнений.
В пяти приложениях в книге представлены различные вспомогательные материалы, а также полные тексты программ, рассмотренных примеров.
Здесь во вложении помещены копии последних разделов книги. Названия вложенных файлов соответствуют названиям подразделов книги.
включить копии книги

Полином.pdf
Синус ряд Тейлора.pdf
дифф уравнение.pdf
приложения.pdf

Попробуем применить методику книги для программирования функции из четвертого задания:

https://www.cyberforum.ru/cgi-bin/latex.cgi?y=\frac{x}{{x}^{2}+1}

Пусть аргумент Х изменяется от -6 до +6, а шаг его изменения примем 0,25. В книге рассматривается пример применения шага аргумента не кратного целой степени двойки типа 0,1, 0,05 и т.п.. Показано, что такое решение приводит к дополнительной, довольно значительной вычислительной ошибки. Поэтому в нашем примере будем применять шаг кратный целой степени двойки.
В соответствии с пунктом 1 методики проведем анализ поведения нашей функции на всем интервале изменения аргумента, выявим ее экстремальные значения, а также экстремальные значения всех промежуточных переменных.
Арифметический алгоритм вычисления нашей функции простой:

Y1=X*X;
Y2=Y1+1;
Y=X/Y2.

В файле Пример 1.xls в листе 1 приведены расчеты всех промежуточных переменных и самой функции, приведен график функции.

Пример 1.xlsx

Из этих расчетов определим максимальные значения переменных. Эти значения нам нужны будут для определения оптимальных масштабов переменных.
Y1 - 36;
Y2 - 37;
Y - 0,5.
Поскольку наименьшее по абсолютной величине значение переменной Y2 будет 1, то необходимо провести повышение точности выполнения операции деления. (В книге это вопрос рассмотрен в разделе масштабирование операции деления). Разумеется, повышать точность необходимо и после выполнения операции умножения.
Для адекватного выполнения операции сложения 1 к Y1, необходимо выровнить ее масштаб представления под масштаб Y1.
В соответствии с пунктом 2 методики выполним масштабирование последовательно всех операций арифметического алгоритма, начиная с первой. Результаты масштабирования сведены в таблицу - файл Сводная таблица.doc.

Сводная таблица.doc

В этой таблице приведен проект ассемблерной программы еще не оптимизированной (пункт 3 методики).
Ниже приведен текст более-менее оптимизированный ассемблерной программы вычисления нашей функции. Программа специально написана под MS DOS, так как в этом случае выглядит очень компактно. Здесь были использованы TASM, Tlink и Turbo Debugger.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
%title "Prim1"
;-----------------------------
; блок инициализации программы
;-------------------
dosseg
.model tiny
.code
.586
m:
mov ax,@code
mov ds,ax
mov es,ax
;----- открытие файла  ---------
mov ah,3ch
mov cx,0
mov dx, offset f_name
int 21h
mov handle,ax
;-----------------------------
; Основное тело программы
;-----------------------------
m2:
mov ax,x
mov bx,ax
imul bx
shld dx,ax,1    ; повышение точности умножения
mov cx,dx   ;y1 -> cx
;-----------
add cx,200h ;y2 =  y1+1 -> cx
;-----------
mov ax,bx
cwd     ; расширение аккумулятора
shld dx,ax,12   ; повышение точности  деления
sal ax,12       ; повышение точности  деления
idiv cx
mov y,ax    ;y -> ax
;---------- запись Х в файл  -------
mov ah,40h
mov bx,handle
mov cx,2
mov dx,offset x
int 21h
;-------  запись Y в файл  -------
mov ah,40h
mov dx,offset y
int 21h
;--------------  проверка аргумента на окончание счета -----
cmp x,6000h
je m3
add x,400h
jmp m2
;---------  закрыть файл  ------
m3:
mov ah,3eh
mov bx,handle
int 21h
;-----------------------------
;  выход  в ОС
Exit:
mov ah,04ch
int 21h
;----------------------------
; блок переменных
;-------------------
x dw 0A000h
y dw ?
handle dw ?
f_name db 'D:\temp\Prim1.dat'
;-----------------------------
end m
;-----------------------------
В файле PRIN1.DOC приведены результаты работы программы. (Просматривать данные необходимо с помощью HEX-редактора.) Эти результаты перенесены отдельной программкой в лист 2 файла Пример 1.xls. Структура этих таблиц следующая: первый и второй столбцы - машинные значения аргумента Х и функции Y в шестнадцатиричной форме записи.

PRIM1.DOC

Третий и четвертый столбцы - машинные значения X и Y, записанные как целые десятичные числа. Пятый и шестой столбцы - истинные значения аргумента и функции, полученные путем деления их машинных десятичных значений на соответствующие масштабы.
Седьмой столбец – эталонное значение нашей функции, рассчитанное с помощью Excel. Восьмой столбец – ошибка вычисления заданной функции, которую дает наша программа. На том же втором листе приведены графики собственно рассчитанной функции и ошибки. Наибольшее значение относительной (относительной, но не приведенной) ошибки составляет чуть более 0,011%. Не забудьте - работали мы с шестнадцатью разрядами!!!
Если внимательно посмотреть на второй столбец листа 2 файла Пример 1.xls, то можно отметить наибольшее значение вычисляемой функции Y = 4000h. Это говорит о достижении наивысшей точности представления этой переменной в машине, так как в старшем информационном разряде при максимальном значении переменной присутствует 1 и нет запаса по повышению точности!!!
Аналогичную картину можно увидеть в пошаговом режиме в отладчике для переменных Y1 и Y2. Их машинные значения в экстремуме равны соответственно 4800h и 4A00h. То есть, и для этих переменных запас по точности представления в процессоре использован в полной мере!
Вывод: методика работает нормально!!!
На этом можно закончить! Если будут вопросы - попытаюсь дать ответ.
Желаю успехов!
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.03.2013, 23:28
Помогаю со студенческими работами здесь

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

Заменить в данной строке знаки арифметических операций названиями противоположных им операций
Заменить в данной строке знаки арифметических операций названиями противоположных им операций.

Напечатать все знаки арифметических операций и операций отношения
Напечатать все знаки арифметических операций и операций отношения,которые входят в заданый массив и все знаки арифметических операций и...

Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100
Вычисления проводятся слева-направо, ни одна операция не имеет приоритета. Добавлено через 2 минуты задача вынесла моск, прошу помочь

Исследование арифметических операций
Уважаемые программисты, помогите с кодом,и если можно с объяснением. Используя в качестве операндов переменные, определенные в сегменте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru