Это видео недоступно.
Сожалеем об этом.
Сложен ли ассемблер? Команды ассемблера для микропроцессора Z80. Примеры программ в соотношении с C
HTML-код
- Опубликовано: 25 мар 2022
- Сложен ли ассемблер? Команды ассемблера для микропроцессора Z80. Примеры программ сложения, вычитания, умножения, циклы, условия.
Ассемблер относится к языкам программирования низкого уровня. Его команды прямо соответствуют отдельным машинным командам. Главным недостатком ассемблера является существенная платформенная зависимость: языки ассемблера для различных аппаратных платформ несовместимы, хотя могут быть в целом подобны. Основное преимущество заключается в том, что с помощью ассемблера можно писать быстрые и оптимально потребляющие ресурсы программы, которые по максимуму используют платформу, для которой написана программа.
В видео рассказываю о инструкциях Z80. Привожу примеры программ: сложения, вычитания, умножения и деления на 2, в том числе с использованием команд сдвига, циклов, ветвлений, множественного выбора, копирования блоков памяти, поиска символа в строке и др. Соотношу примеры с операторами и функциями языка программирования C (Си).
Поддержать канал yoomoney.ru/to...
Канал на Дзене: zen.yandex.ru/...
Группа в ВК: vadrov
ассемблер, ассемблер Z80, инструкции Z80, команды Z80, микропроцессор, микропроцессор Z80, программа на ассемблере, программа Z80, сложение на ассемблере, вычитание на ассемблере, умножение на ассемблере, деление на ассемблере, выбор на ассемблере, циклы на ассемблере, условия на ассемблере, копирование на ассемблере, поиск на ассемблере, соотношение ассемблера и Си
#z80
#assembler
#программирование
Резервные явки, если явка на ютуб будет провалена:
Канал на Дзене: zen.yandex.ru/vadrov
Группа в ВК: vk.com/vadrov
В Z80 одна из лучших мнемоник, что мне приходилось видеть и использовать(правда лет 20 последний раз). После этого программировал на многих разных контроллерах на ассемблере, такого локаничного подхода к мнемоники как на любимом зилоге уже не встречал нигде.
Согласен. Но мне еще и ARM-овская мнемоника понравилась. Здорово в голове "оседает". С момента изучения ассемблера Z80 прошло больше 25 лет, но все еще помню систему команд, а для некоторых команд даже префиксы и шестнадцатеричные коды (начинал с машинных кодов). 🙂
Полная хрень Z80! Самая продуманная система комманд PDP-11 все остальное БАРАХЛО!
Грамотно. Только для ldir регистровые пары для источника и приёмника нужно поменять местами.
Сергей, да, все правильно. Я заболтался. )) В команде LDIR HL определяет начальный адрес источника, а DE - начальный адрес приемника. Именно поэтому на 49:03 я сначала начал формировать пример с источника в HL под будущий переход этого примера на LDIR, а потом перенес источник в DE, глядя на расстановку адресов в memcpy... И вышла оплошность. Спасибо за внимательность. 👍
15:21 Если проверяемый командой BIT бит сброшен, то флаг нуля будет установлен, т.е. бит Z флагового регистра будет установлен, а не сброшен. Типа, ноль. Если проверяемый бит установлен, то флаг нуля будет сброшен. Типа, не ноль.
Ну и по конструкции switch/case вы привели не совсем корректный аналог на ассемблере. switch/case был введен в языки высокого уровня как раз для того, чтобы реализовать возможность процессоров табличного перехода, иначе хватало бы портянки из ifов. Табличный переход - это когда на этапе компиляции или вами вручную создается таблица адресов начала кода обработки каждого case, на один из которых затем одной инструкцией по вычисленному адресу происходит переход. В современных процессорах есть для этого одна инструкция, например jmp dword ptr [addrTable + ecx*4], но вот JP (HL) у Z80, несмотря на ее многообещающий синтаксис, увы, сама по себе не предоставляет весь этот комплексный функционал вычитывания адреса из пары ячеек с адресом HL, и к ней требуется дополнительный код, который тем не менее будет отрабатывать быстрее, чем ваша портянка сравнений и условных переходов при некотором количестве вариантов case. Суть идеи в том, чтобы сразу переходить к исполнению нужной секции кода, затрачивая на это небольшое и фиксированное количество тактов, а не идти к ней по долгой цепочке проверок с непредсказуемым количеством затраченных тактов на эти операции.
Например, LD BC,tableAddr; загружаем адрес начала таблицы переходов в BC, в таблицу прекомпилируем адреса меток для каждой секции case, т.е. tableAddr defw case_0, case_1,... case_n, далее то, что в параметре switch, считаем в HL, удваиваем ADD HL,HL, добавляем одно к другому ADD HL,BC, загружаем адрес из таблицы с вычисленным смещением LD E,(HL); INC HL; LD D,(HL); EX DE,HL; и совершаем один переход с помощью JP (HL). Для несуществующих и запредельных значений и секции default можем добавить перед этим одно сравнение и один условный переход на метку default, и в таблице забиваем для неперечисленных значений адресом метки default. Ваша же связка из сравнений cp NN и условных переходов jr z,... - это не совсем то, что задумывалось авторами switch/case. Чем это тогда отличается от портянки ifoв? Ничем... Вы привели медленный деоптимизированный вариант, к которому приходит компилятор, когда бездари используют switch/case неправильно. Мой вариант - 50 тактов (если обрабатываем дефолты, то чуть больше) для любого кейса, хоть сотню их заведите, а ваш вариант: 14 тактов для первого же кейса, для второго - 33 такта, для третьего - уже 52 такта, уже, очевидно, что неправильный путь избрали, он валиден только для пары кейсов в свиче. И это на Z80.
На x86 потери от несделанных переходов вообще практически нет из-за предсказания ветвлений, и там мой вариант станет еще более эффективным, еще и одной инструкцией переходы делаю, а ваш вариант будет еще менее эффективным. Поэтому я посчитал важным сделать такое замечание, чтобы вы встали на путь истинный, и не учили людей плохому. Понимание этой механики дает возможность писать эффективный код и на любом языке высокого уровня...
@@cafedead , замечание правильное. Но народ я не учу, так как не учитель. Оптимизация кода, о которой Вы упоминаете - это совсем другой уровень в познании ассемблера, потому что для начала необходимо этот самый ассемблер изучить. Всё правильно, но всему, как говорится, своё время.
Стоит ли учить в 2024 году ассемблер? подскажите
Всё зависит от того, чем Вы хотите заниматься и как глубоко хотите зайти в этом занятии. Знание языка ассемблера может потребоваться для оптимизации некоторых участков кода, критичных к быстродействию. Хорошо помогает знание ассемблера и при отладке программ, в изучении кода на выходе компилятора с целью последующей его (кода) оптимизации.
Доброе время суток вам! Что ж, ошибку признаю, всё сказаное вами выше верно... Очень много времени прошло с 94 года, возможно я перестал улавливать разницу между 8080, КР580ВМ80А и Z80
Вы совершенно неправы. Вы, очевидно, путаете ассемблер z80 с другим ассемблером (для другого cpu) . Посмотрите спецификацию на процессор z80. Именно на неё я ссылаюсь в видео, говоря о системе команд. С ассемблером z80 я знаком с 1993 года, писал на нём множество программ, в т. ч. игровых, в т. ч. свой ассемблер и дизассемблер. Таких ошибок, как Вы указываете, я точно не допустил бы.
Я когда то изучал на базе 580 процессора. Но на практике наверно удобнее программировать на С со вставками ассемблера если нужно ускорить повторяющуюся часть кода.
В настоящее время, да. А в то "далекое" время сред разработки и С-компиляторов толковых для Z80 не было. Писать приходилось на чистом ассемблере. С для ZX-Spectrum был, но писать на нем было каторгой. Даже можно сказать, это был не С, а демо-С. Сейчас же, конечно, раздолье для разработки программ под старые платформы. А сейчас оптимизаторы с компиляторами такие умные, что редко приходится писать ассемблерные вставки. Да, и не популярно сейчас это. Сейчас опять мода на интерпретаторы, типа python. Железо стало мощнее, а программисты ленивее. 😉
@@VadRov Си работает очень медленно. Я попробовал программу энкодера на языке Си для микроконтроллера 328P , сбой происходил даже на очень медленной скорости датчика. Тогда я написал программу на ассемблере, и энкодер работал без сбоя на тысячах оборотах датчика. При таких маленьких объёмах адресуемой памяти, только ассемблер.
@@VadRov были компиляторы с встроенного в спектрум бейсика, делающие из этого машинный код. Те, которые только с целыми числами, вполне себе годно компилировали код, можно было что-то сделать на этом.
@@cafedead , да, было такое. Ещё был такой пакет Lazer basic (если правильно помню). Применялся специально для разработки игр. Там был соответствующий набор процедур.
А что за среда разработки/отладки применена в видео?
Макс, обычный текстовый редактор, встроенный в Total Commander. А для компиляции использую SjASMPlus.
@@VadRov спасибо за ответ!Очень интересное видео!Лайк и подписка!
Объясняешь наверное хорошо.
Но нет словаря.
Аккумулятор, операнд итд.
Я вроде догадываюсь о чем речь идет.
Но картина получается размытая.
Ты рассказываешь для тех кто уже в теме.
Оно им точно будет интересно?
Новичкам точно ничего не понятно.
И ...
Наверное лучше бы было визуализировать выполнение команд, а не на заголовок смотреть.
Замечание справедливое отчасти (наверное, Вы не промотали видео дальше к примерам записи команд и т.п.). Что касается словаря, то такое понятие, как "операнд", например, не может не знать человек, который даже сколь либо мало знаком с программированием вообще. Кроме того, далее это понятие раскрывается. Аналогично и про регистр аккумулятора. Далее речь о нем, в т.ч., с примерами идет. Что касается вообще изучения ассемблера, то 1 часа видео не то, чтобы мало, а вообще не о чем. Видео для общего развития. Цель видео показать соотношение языка низкого уровня с языком высокого уровня. Поэтому вначале общий и краткий обзор команд с пояснением их смысла, чтобы затем, при демонстрации соотношения языков программирования, было понятно о чем речь. Вообще, изучение ассемблера должно начинаться с изучения архитектуры микропроцессора. Это еще несколько часов видео. Поэтому лично я считаю, что цель видео, четко обозначенная в его названии, точно достигнута. По крайней мере, после просмотра этого видео полностью (именно полностью), можно сделать вывод, нужно ли конкретному зрителю изучение ассемблера или нет.
Upd. И, да, при общем обзоре команд делать графические, например, демонстрации, то видео выйдет не менее, чем на 10 часов. Потому что их также пришлось бы пояснять.
У этого процессора есть куча недокументированных команд, к слову. Некоторые ассемблеры их понимают.
Что там сложного в ассемблере? Тем более, Z80? Ну, кроме режима мультизадачности (условной)
Ну, так и посыл видео в том, что ничего сложного. А вот насчет сравнения "тем более, z80". Не согласен. Возможно, z80 будет проще других ассемблеров по системе команд, но вот если, допустим, есть задача некоторого среднего уровня сложности, то ее будет значительно проще и быстрее реализовать на том же ассемблере ARM, чем ассемблере Z80.
Зачем он сейчас нужен ассемблер Z80? В 90х на ассемблере Z80 кодил, сейчас прошлый век металлолома: ) Сейчас микроконтроллеры в сотни раз мощнее! :)))
Не важно, какой ассемблер ( для какого процессора/ядра) . Это просто пример, чтобы показать, что ничего сложного в ассемблере нет. Что касается z80, то на этом ядре и сейчас производятся микроконтроллеры.
Эта мощность успешно компенсируется быдлокодингом, которого сейчас процентов 99. Например вот эта страница ютюба, только HTML больше 4х мегабайт текста :)
Но главное преимущество ассемблера это точность. Всегда знаешь сколько тактов займет операция та или иная.
@@aleksandr4626 Ну, СИ удобнее, да и кусок ассемблера можно впихнуть, если необходимо.
@@aleksandr4626 Да. Реально быдлокодинг. Это нивелирует возможности современного железа. А всё потому, что современные программисты вообще не задумываются как это работает. Для них архитектура ЭВМ - это чёрный ящик.
ну лично для меня это возможность просто и быстро познакомиться с ассемблером напрямую. без всяких операционных систем, подключения непонятных библиотек и т.п. а дальше я уверен, проще будет уже под дос, виндой и андроидом. ну и плюс я всегда хотел узнать как кодить на ассемблере на спектруме. на бейсике делать что-либо нормальное было нереально, и для меня это была магия
Я думал будет программка умножения двух чисел...
Дмитрий, можно даже деления и извлечения квадратного корня, вычисления факториала и возведения в степень, а также синусы, косинусы, тангенсы-котангенсы... Все это просто сделать на ассемблере, а, главное, исполняться будет быстрее, чем подпрограмма "калькулятор" в ПЗУ Спектрума, реализующая те же функции. В рамках одного видео всего не рассмотреть.