«МК-Про»: два регистра в одном
В оптимизаторе
Сейчас я реализую многоходовую оптимизацию, и у меня трудятся сразу несколько агентов, чтобы её запрограммировать.
Первая часть уже, в принципе, давно готова: идея в том, чтобы хранить в одном регистре сразу два значения. Тут можно придумать несколько способов, но самый простой — следующий.
Идея в том, что два целых числа с известными диапазонами можно упаковать в одно число: одно — в целую часть, другое — в дробную. Тогда извлечь их можно операциями нахождения целой части (
В эталонной программе, о которой идёт речь, все регистры заняты под завязку, и эта оптимизация должна работать в связке с другой: в дробной части будет храниться счётчик, а в целой — опорное число для адреса перехода, которое, например, будет менять знак в зависимости от условия. Сам адрес считается по подобранной формуле.
Опорное число и формула подбираются в зависимости от того, где реально оказались в памяти подпрограммы, к которым надо перейти, и это не проблема. Хотя сеть убеждала меня, что опорное число придётся подобрать вручную, я подсказал ей идею простого решателя, и он, судя по тестам, работает.
Вчера я остановился на том, что решатель должен перебирать функции, в том числе тригонометрические: именно они обычно дают самый толковый результат.
В общем, зарядил я «Кодекс», чтобы он покопался в микрокоде калькулятора и алгоритмически повторил код, реализующий тригонометрию в Си++. Цель была обозначена, на мой взгляд, очень чётко. Но не зря я говорю, что нейросеть иногда похожа на джина, который всё, что можно понять двояко, вывернет вам во вред.
Когда я уходил спать, всё работало как часы — нейросеть копалась в ПЗУ калькулятора, сравнивала реализацию с эталоном, разбиралась почему ошибки. Утром я первым делом полез в этот код, чтобы посмотреть что получилось. А там…
А там, как говорят поляки «wygląda jak gówno, a smakuje jeszcze lepiej» — «выглядит как говно, а на вкус ещё лучше». Пятьдесят тысяч строк отвратительного лапшекода, сгенерированного программно из ПЗУ
Сеть


Комментарии 48
01. F10^x
02. XY
03. Bx
04. :
05. Bx
06. :
07. K{x}
08. *
09. K[x]
10. C/П
потому что память большие программы (которые требуют регистров) выжирают под логику
01. F10^x
02. :
03. K{x}
04. 2
05. F10^x
06. *
07. K[x]
08. C/П
01. F10^x
02. :
03. K{x}
04. ВП
05. 2
06. K[x]
07. C/П
00. ИП4
01. :
02. K{x}
03. ИП2
04. *
05. K[x]
06. С/П
[Вложение не попало в экспорт: вложение]
[01.07.2026 8:08] Roman Krupenko: работает в программе:
[01.07.2026 8:25] Hs On: Число XXYYZZ может начинаться нулями?
Если да, то подойдут только арифметические методы.
Если нет, то можно с помощью логических операций:
Пх0 КΛ К{х} 3 F10x × С/П,
в регистре 0 хранится число 80FF00XX, где X — любая цифра.
арифметический
00. ВП
01.
02. 4
03. K{x}
04. B^
05. ВП
06. 2
07. K[x]
08. С/П
логический
00. ИП0
01. K^
02. k{x}
03. 3
04. F10x
05. *
06. С/П
Регистр П0 содержит число маску 80FF00XX, где X любая цифра, например 80FF077 (FF это две пустышки)
В логическом методе требование не должно быть ведущих нулей то есть хранение вида 002943 как трех переменных недопустимо, решается просто храним всегда с ведущей единичкой которая не влияет на содержимое трех переменных
то есть 1002943
Код:
00. Пх0
01. К^
02. K{x}
03. Пх1
04. ×
05. С/П
00. ПхE
01. КΛ
02. К{х}
03. ПхE
04. ×
05. С/П
В регистр Е заносится значение 10FF, регистр можно любой но его ценность как регистра по которому можно сделать переход растет поэтому от 7 до Е ЕМНИП, без авто инкремента и декремента по косвенному переходу.
Внос значения 10FF в регистр
11088
В↑
11077
KV
K{x}
ВП
4
П(номер регистра)
для подготовки константы