Страница 1 из 9

Программистские задачки и хитрости

Добавлено: 15 ноя 2019, 23:24
Serg
Professor Lampochkin писал(а):Шина совместима с Электроника-60, как я понял, ближайший доступный "родственник" НЦ-31 -компьютеры БК :)
Только в НЦ (в отличии от БК) в 2 раза больше регистров из которых 2 регистра сегментные (РБД1, РБД2), и соответственно, чуть другая система команд.
Наконец-то понял, причем тут восьмеричная система- легко в уме переводить в двоичную и "собирать" команды по таблицам !!!
БК - это дальний младший родственник семейства PDP-11, Электроника-60 - клон PDP-11/06).
И система счисления восьмеричная именно по тому, что поля команд занимали по 3 бита. Студентам предлагал получить зачёт сразу за семестр за написание программы, которая чистит всю память, программа должна состоять из одной ассемблерной инструкции. :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 16 ноя 2019, 15:38
Professor Lampochkin
T00T писал(а):Делал на AtMega, но проще наверное уже на плисине. Хотя проект можно доделать.
На AtMega доступнее, а с учётом готовности на 90% грех не доделать ! :)
UAVpilot писал(а):Студентам предлагал получить зачёт сразу за семестр за написание программы, которая чистит всю память, программа должна состоять из одной ассемблерной инструкции.
Что-то вроде movsb ? Признавайтесь ! :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 16 ноя 2019, 23:00
Serg
Professor Lampochkin писал(а):Что-то вроде movsb ? Признавайтесь ! :)
Нет. :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 17 ноя 2019, 12:43
Professor Lampochkin
UAVpilot писал(а):Нет.
Тогда, наверное, команда перехода на стандартную подпрограмму очистки памяти, расположенную в ПЗУ ? :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 17 ноя 2019, 18:39
Serg
Professor Lampochkin писал(а):Тогда, наверное, команда перехода на стандартную подпрограмму очистки памяти, расположенную в ПЗУ ? :)
Тоже нет. :) Никакие подпрограммы не используются. Для работы нужны только процессор и очищаемая память.
Эта программа даже сама себя модифицирует, чтобы правильно выполнить задачу. :)

P.S. Из пяти курсов (по ~60 чел) такой зачёт получили только 6 человек... :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 17 ноя 2019, 22:54
Professor Lampochkin
UAVpilot писал(а):Из пяти курсов (по ~60 чел) такой зачёт получили только 6 человек...
Ого..
Пойду достану БКшку и почитаю мануалы...
P.S.В кодах для БК писать пока что не приходилось :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 17 ноя 2019, 23:55
merkwurdigliebe
mov -(pc),-(pc) ?

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 18 ноя 2019, 00:01
Serg
merkwurdigliebe писал(а):mov -(pc),-(pc) ?
Нет, эта просто ничего не сделает. :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 18 ноя 2019, 01:59
merkwurdigliebe
да ну ладно ;) не поленился, скачал эмулятор ДВК:
dvk.png
dvk.png (4.5 КБ) 8746 просмотров

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 18 ноя 2019, 02:42
Serg
Не очень понял скриншот. Насколько помню (более 30 лет всё таки прошло) эта команда саму себя запишет в ячейку, в которой она и находится, этим всё и закончится.

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 18 ноя 2019, 03:11
merkwurdigliebe
ага, давно это было :)

скриншот:
смотрим адрес 100000 (/), записываем туда опкод mov -(r7),-(r7) - 014747
смотрим память выше с адреса 77770 - что-то там есть
запускаем с адреса 100000 (G) - оно виснет, прерываем кнопкой HALT эмулятора
снова смотрим память с адреса 77770 - теперь она заполнена опкодом этой команды

при выполнении команды PC указывает на следующее слово. первый аргумент -(PC) уменьшает PC на 2 и считывает содержимое по этому адресу, т.е. опкод самой команды. второй аргумент опять уменьшает - на предыдущее слово и записывает туда опкод. и выполнение продолжается с этой предыдущей ячейки. и так задним ходом до нулевого адреса, потом переполнение, прерывание при попытке записи в 177776, не помню по какому вектору, адрес обработчика - 014747, снова прерывание по нечетному адресу, и по кругу... наверное как-то так :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 18 ноя 2019, 04:27
Serg
А мне помнилось, что -(PC) не меняет сам PC... Ну не суть.
Как-то так, но нужно нулями. :)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 19 ноя 2019, 18:43
merkwurdigliebe
ну я сдаюсь. с интересом жду разгадки. но, по-моему, что-то тут нечисто ;)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 19 ноя 2019, 23:22
Serg
Всё очень просто: JSR -(PC) или 004747 в кодах в первой ячейке памяти (адрес 000000) - вызов самое себя как подпрограмму, адрес возврата, т.е. 000000 записывается в стек, который по дефолту начинается с конца памяти. В конце концов стек заполнит всю память и по нулевому адресу запишется 000000, что процессор на очередном такте воспримет как HALT... :)

Можно попробовать вспомнить ещё задачек, даже безотносительно конкретных процессоров... Если интересно, то в отдельную тему, и это туда перенести можно.

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 20 ноя 2019, 00:58
merkwurdigliebe
видимо jsr pc,-(pc). ага, прикольно.
только юзерский стек в rt-11 по дефолту начинался c адреса 1000, перед пользовательской программой. и чет я не уверен, что даже после аппаратного сброса процессора SP устанавливался на конец памяти. откуда процессор может знать где она заканчивается? и если в эмуляторе двк при загруженной rt-11 нажать холт - SP=121422. что совсем не конец.
так что не совсем чисто, сорри ;)

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 20 ноя 2019, 14:36
Serg
Это безотносительно ОС, курс по архитектуре PDP-11 (СМ ЭВМ).
Да и курс по ОС был не по RT-11, а по RSX-11M.

После сброса SP=0157777 (дальше регистры периферии), PC=0. А для пользовательских задач в RT-11 так, как указано в параметрах сборки "ядра", по дефолту там действительно было 01000.

Re: NC-31 ищу компаньона (программирование и электроника)

Добавлено: 20 ноя 2019, 18:40
Professor Lampochkin
UAVpilot писал(а):Всё очень просто: JSR -(PC) или 004747 в кодах в первой ячейке памяти (адрес 000000) - вызов самое себя как подпрограмму, адрес возврата, т.е. 000000 записывается в стек, который по дефолту начинается с конца памяти. В конце концов стек заполнит всю память и по нулевому адресу запишется 000000, что процессор на очередном такте воспримет как HALT...
Гениально ! :)
Эх,жаль зачёт не получил... :)
UAVpilot писал(а):Можно попробовать вспомнить ещё задачек, даже безотносительно конкретных процессоров... Если интересно, то в отдельную тему, и это туда перенести можно.
Создал тему http://www.cnc-club.ru/forum/viewtopic.php?f=38&t=26121
Ждём там обещанные задачи :)

PDP-11 и другие. Программирование.

Добавлено: 20 ноя 2019, 19:10
Professor Lampochkin
UAVpilot писал(а):Можно попробовать вспомнить ещё задачек, даже безотносительно конкретных процессоров... Если интересно, то в отдельную тему, и это туда перенести можно.
http://www.cnc-club.ru/forum/viewtopic. ... 53#p538153

Хотим еще задачек ! :)

Re: Программистские задачки и хитрости

Добавлено: 20 ноя 2019, 21:50
Serg
Перенёс посты в эту тему из-за чего стал ТС. :oops:
Если что, попрошу Nick'а как-нибудь вернуть авторство, сам не могу. Ну чтобы усугубить поменял и название темы. :) Предлагайте лучшие варианты.

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

Есть некий абстрактный процессор с простым набором команд. Есть два регистра, содержащие некие значения. Нужно поменять местами их значения затратив на это не более 3 инструкций/команд. Никакие другие регистры, аккумуляторы, память и т.п. не доступны. Команды обмена значениями регистров нет.

Re: Программистские задачки и хитрости

Добавлено: 21 ноя 2019, 00:56
calabr
UAVpilot писал(а):Есть некий абстрактный процессор с простым набором команд. Есть два регистра, содержащие некие значения. Нужно поменять местами их значения затратив на это не более 3 инструкций/команд. Никакие другие регистры, аккумуляторы, память и т.п. не доступны. Команды обмена значениями регистров нет.
2 регистра rX и rY
1) rX = rX XOR rY
2) rY = rX XOR rY
3) rX = rX XOR rY