Страница 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 (4.5 КБ) 9122 просмотра
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
Перенёс посты в эту тему из-за чего стал ТС.
Если что, попрошу 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