Зачем нужен ассемблер на примере. Соглашения о вызовах в разных архитектурах

Поділитися
Вставка
  • Опубліковано 19 січ 2024
  • Зачем нужен ассемблер. Соглашения о вызовах для разных архитектур.
    Видео-ответ на комментарии к ролику с решением задачи, решение которой так никто и не предложил (без использования ассемблера, в т.ч., ассемблерной вставки в программу на C, задачу не решить): • Блок управления двигат...
    Специфичные задачи, которые можно решить с использованием ассемблера. Соглашения о вызовах для архитектур: x86, x64, arm, mcs-51
    В видео решается задача:
    Как вызвать из языка более высокого уровня подпрограмму из встроенного начального загрузчика, расположенного во внутреннем ПЗУ микроконтроллера, с передачей аргумента, не прибегая к языку низкого уровня (ассемблеру)? Причем, подпрограмма (функция) в этом встроенном загрузчике не соответствует соглашению о вызовах функций (регистры, стек, возвращаемое значение и т.п., если понимаете, о чем я).
    Внимание! Уточнение!
    9:45 Обратите внимание, что компилятор сгенерировал инструкцию LJMP (переход по абсолютному 16-битному адресу), а не инструкцию LCALL (вызов подпрограммы по абсолютному 16-битному адресу). Почему он так сделал? А потому что программа состояла всего из двух инструкций, оканчивающихся именно вызовом подпрограммы. Если бы после вызова нашей подпрограммы следовали бы еще инструкции, то компилятор сгенерировал бы для вызова подпрограммы инструкцию LCALL. При этом, генерируя инструкцию LJMP, компилятор подразумевает, что выход из основной программы будет осуществлен по завершению подпрограммы по инструкции RET (возврат из подпрограммы). На 12:43 я немного накосячил, "под впечатлением от этой инструкции", сгенерированной компилятором, поэтому в своей вставке на ассемблере также автоматически указал инструкцию LJMP. Однако, если речь идет именно о вызове подпрограммы по адресу, а не переходе по адресу, то, как вы понимаете, инструкция должна быть LCALL.
    Еще один важный и имеющий непосредственное отношение к теме момент. Вызов внешних подпрограмм "по классике" для языка С-51 предлагается делать по такой "схеме":
    typedef void my_func(unsigned char);
    my_func* send_byte = (my_func*)SEND_BYTE_SP0;
    send_byte(65);
    Т.е. объявляется тип, затем объявляется переменная-указатель данного типа с инициализацией в ней адреса подпрограммы. И в заключении осуществляется вызов подпрограммы. Прекрасно, но посмотрим, что выдаст на выходе компилятор... Остальное читайте в закрепленном комментарии, т.к. ютуб в описании делает ненужные хэштеги из констант ассемблера.
    #ассемблер
    #микроконтроллер
    #программирование

КОМЕНТАРІ • 51

  • @VadRov
    @VadRov   +10

    Внимание! Уточнение!

  • @user-ps6cf7ry5q

    Ничего не понятно, но очень интересно )

  • @VasyaPupkinus

    Это прекрасно❤

  • @aleksandrshtonda5133

    Код ассемблера намного меньше затрагивает ресурсы железа, надежен как АК и всякие левые прерывания не случаются при исполнении. В противовес: пишем ВСЕ ручками.

  • @sergatmel8242

    Спасибо. Полезно.

  • @avr_stm_pro2955

    Спасибо 👍

  • @alexshu1609

    Требую БОЛЬШЕ подробностей и нюансов !!!!!! Больше БОЛЬШШШЕЕЕ ВОДЫЫЫЫЫ )))))

  • @TheT735

    Бывает ощущение, что на асме программы понятнее и проще, чем на том же С :)

  • @Serch_404

    Здравствуйте, а можете пожалуйста дать, для молодых, список литературы по которой можно дорасти до вашего уровня понимания. В частности: где можно подробнее почитать о "соглашении о вызовах" и впринцепе литературу по асемблерам (х86, ARM). И может какую другую литературу, на ваш взгляд. Или, лично Я бы с большим удовольствием посмотрел видео где вы расскажете про литературу и дадите свои комментарии на её счёт.

  • @user-ci4fz9co3b

    Не кто не спорит асм знать это хорошо, сам когда то писал подпрограммы которые вызывались из основной программы на "С" для AVRок. Сейчас для отладки STM бывает заглядываю, что там компилятор наворотил .Наверное для автомобильного блока управления на асме писать сам бог велел. Там, как я понимаю, низкоуровневый ногодрыг, датчики, форсунки и т.д. А вот допустим написать программу где есть пользовательский интерфейс, сложные структуры данных, разветвленная логика, математика, ну в принципе можно и на асме, на спор наверное.

  • @DrLithium

    Так их этих высокоуровневых нублоидов! Не щадить и открывать глаза "умникам". Они видимо уже давно возомнили себя гуру, но позабыв выучить азы! )

  • @WWolf_13

    В Си для управления соглащениями есть ключевые слова __cdecl, __stdcall и __fastcall

  • @CoBaldr

    Можно же просто обертку написать😊

  • @vsosacordeev

    Однако регистры не сохранил в стек , перед вызовам, своей функции, пиши пропало!))