Assembler в 30 строк на Excel

    В заголовке порядок слов не перепутан.



    Живет в Венгрии юный программист Адам Кишш. Он участвует в чем-то типа онлайн-олимпиады KöMaL. Для решения заданий по информатике предлагается использовать несколько обычных языков программирования: С, С++, Python и некоторые другие. В одном из заданий требовалось написать Сапер и бота для игры в него. Такая задача очень легко решается средствами табличного процессора — того же Excel, например, и пачки макросов. Однако же, макросы использовать нельзя. Адам выкрутился необычным способом: реализовал в книге Excel простенький виртуальный компьютер, который программируется на Ассемблере — Excembler.

    Формально, это подходит под требования олимпиады. Макросы не используются, только встроенные логические функции. Файл «компьютера» доступен для скачивания, но он на венгерском. Гугл транслейт плюс здравый смысл вроде позволили разобраться. Реализован некий простейший придуманный ассемблер. Возможно, кто-то из читателей укажет прототип. Вкратце опишу, что получилось. На первом листе собственно код программы и результат выполнения. В цветных столбцах состояние регистров перед выполнением соответствующей операции, слева код и аргументы. Смысл столбца OUT-assist до конца не ясен, похоже там отслеживаются изменения регистра результата. Лист Out — результаты, лист Data — входные данные. Их можно адресовать по номеру строки и столбца и загружать в регистр LD командой LOAD. Command set — справка по системе команд. Надеюсь, что перевел правильно. Examples — несколько примеров. Было не вполне понятно, откуда они загружают данные. Надо смотреть непосредственно по коду. Например, LOAD 2,3 — это запрос ячейки Data!B3, если ничего не напутал.

    Вывод: интересная игрушка на поиграться вечерком

    Библиография:
    www.komal.hu/verseny/feladat.cgi?a=feladat&f=I358&l=en задание олимпиады
    hackaday.io/project/3680-exembler собственно проект. Почти пустой, но там можно скачать экселевский файлик на венгерском
    hackaday.com/2014/12/25/writing-a-virtual-machine-in-excel новость на Хакдее
    www.dropbox.com/s/xjk5sqtarsgvnex/exembler_v0.2.xlsx?dl=0 (возможно криво) переведенная таблица
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 29
    • –29
      А теперь вопрос: неужели получившаяся программа получилась более простой, чем на традиционных языках программирования?
      • +47
        Проще всего — не жить.
        • +1
          Цель была другая :)
        • –8
          Если я правильно понял, то у него нет меток никаких, записываются абсолютные адреса переходов. Тогда это не язык ассемблера, а самый обычный машинный код (только что идентификаторы команд текстовые, а не числовые) и его интерпретатор.
          • +22
            Это ассемблер.
            • –13
              Удачи вам в программировании на «ассемблере» без символьных адресов. Вставка/удаление инструкций приведет к необходимости правки всех адресов переходов.
          • +1
            По-вашему, разница между языком ассемблера и машинными кодами лишь в наличии относительной адресации? И добавление к машинным кодам оной делает из них ассемблер? Процитировав вас же, пожелаю вам удачи в программировании на таком ассемблере.
            • +8
              Я говорю не про относительную адресацию, а про символьную адресацию (переход по метке, именование регионов данных). Я утверждаю, что программирование на языке ассемблера без символьной адресации — это то же самое, что программировать в машинных кодах.
              • –3
                И в чем принципиальное отличие между меткой и относительной адресацией? Вы же сами говорили о проблеме присутствия лишь абсолютной адресации.
                • +5
                  Есть у вас замечательный цикл на три экрана ассемблера с отрицательным относительным переходом в конце. Хотите вставить инструкцию в середину цикла? Тогда вам придется пересчитывать отнсительный адрес перехода. Каноническая упрощенная реализация ассемблера в первом проходе как раз собирает информацию о метках, чтобы вторым проходом генерить все переходы.
                  • +1
                    Первые свои программы на ассемблере я писал на листочке в клеточку. Компьютера у меня тогда не было. Трассировал тоже в голове. Когда дошло дело до железа перевел все (уже отлаженное в голове и многократно правленное) из мнемоник в хексы, расставил адреса и вбил через шестнадцатеричную клавиатуру программатора в ПЗУ.

                    не путайте чтоль язык и инструмент его реализующий.
              • +7
                И да, я считаю что разница между ними в следующих вещах. Ассемблер дает:
                1. мнемонические имена для команд, регистров
                2. генерация нетривиальных комманд (режими адрессации, префиксы и т.д.)
                3. символы (адресация, переходы, загрузка данных)

                Первые два пункта — не беда, немного практики и просто наизусть уже запоминаешь, что значит 0x55 (push rbp для x86_64).

                А вот последний пункт — это фатальная проблема при разработке сколько-нибудь сложных программ. Потому что отсутствие, например, переходов по символам, делает невозможным какое-либо редактирование программы (читай «очень-очень-очень сложным»).
                • +2
                  Я согласен с Вами. и вот почему.
                  Язык ассемблера должен быть понятен человеку, но еще не машине.
                  Для выполнения на машине, он должен быть оттранслирован.

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

                  В листе Excel — машиной является процессор выражений листа и условия в ячейках, написанные автором.
                  Я могу с чистой совестью утверждать, что первые четыре столбца понятны этой машине.

                  Поскольку дополнительного преобразования (изменения структуры программы, блоков, разворачивание процедур, подстановки адресов) не делается, то назвать это Ассемблером будет громко.
                  • 0
                    В дополнение этому, я не вижу здесь никаких команд, которые будут понятны только ассемблеру, и при этом не будут являться выходным машинным кодом. Вроде директив.
                • +6
                  И кто-нибудь уже ответит мне, чем же по вашему отличается данный Exembly (авторское название проекта) от интерпретатора машинного кода кроме наличия мнемонических имен для команд и регистров?
                  • –3
                    «Мнемонические имена для комманд и регистров» — и есть язык ассемблера.
              • –4
                Даже не знаю, гением его назвать или все-таки дураком.
                Неужели, не было более простого решения для этой задачки?
                • 0
                  А кому интересны простые решения? Это олимпиада, а не бизнес соревнование по принципу «быстрей, технологичней, дешевле»
                  • +1
                    Ну так на олимпиаде нужно решать задачи максимально быстро и рационально, как раз-таки.

                    Почему-то я не слышал, чтобы кто-нибудь на олимпиадах быструю сортировку на асме писал.

                    Это мне напомнило случай, когда я был на олимпиаде школьников. Тогда я после окончания спросил у парня, который сидел рядом (он, кстати, стал победителем), как решать одну из задач. Он начал мне рассказывать про хеш-функции о многих других вещах, о которых я понятия не имел.

                    Разумеется, мой алгоритм и рядом не стоял.

                    Так вот после окончания олимпиады на разборе этой задачи был показан алгоритм, схожий с моим, и была фраза:
                    Еще ее, конечно, можно было решить с помощью хеш-функций, <много умных слов>, но это уже излишние усложнения и трата времени.
                    • +1
                      Ну это зависит от конкурсных условий конкретной олимпиады. Если нет ограничения по времени, но есть масса других, а в приоритет идет оригинальный подход, то почему бы и нет?
                • +1
                  Когда-то я на память знал содержимое 6 байтного reboot.com для MS-DOS…
                  • 0
                    EA 00 F0 00 00 (пять байтов, полез в таблицы посмотреть опкод)? Чем CD 18 плох (помню по памяти)?
                  • 0
                    Зачем целых 6 байт? Насколько я помню, нужно было два:

                    CLI (FA)
                    HLT (F4)
                    • 0
                      Это во-первых не ребут, во-вторых HLT на 8086 не было.

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое
                  Интересные публикации