Как уменьшить количество сериалов

Тема в разделе "Arduino & Shields", создана пользователем Vector2019s, 9 июл 2021.

  1. a1000

    a1000 Гуру

    Ну давайте разбурёмся. Чем, по вашему, процессорная инструкция ASM отличается от "машинной команды"?
     
  2. parovoZZ

    parovoZZ Гуру

    Ничем.
     
  3. a1000

    a1000 Гуру

    Ну вот и вся правда.:)
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Мне здесь не в чем разбираться.

    Текст на языке ассемблера - это ТЕКСТ и инструкция cli (например) там выглядит как три символа 'c', 'l' и 'i', (или, если желаете, 0x63, 0x6C и 0x69). Машинная же команда cli состоит из двух байтов (если мы говорим об AVR - 0xF8 и 0x94. Чем, по-Вашему, они различаются?

    Компилятор никогда не переводит с ЯВУ в текст на языке ассебмлера.

    У Вас в голове каша и Вы эти понятия смешали в кучу. Язык ассемблера и система машинных команд - это совсем не одно и тоже. Иначе нахрена бы делать несколько разных ассемблеров для одного процессора? И наоборот - один ассемблер для разных процессоров с разными системами команд?

    Язык ассемблера - это язык со структурами данных, макросами и т.п., а система команд - это просто система команд. Не путайте их.
     
    Последнее редактирование: 13 июл 2021
    SergeiL и Airbus нравится это.
  5. Asper Daffy

    Asper Daffy Иксперд

    Правда в том, что паровоз не понимает, о чём говорит. Вы тоже. :)
     
    SergeiL нравится это.
  6. parovoZZ

    parovoZZ Гуру

    можно пример такого.
     
    a1000 нравится это.
  7. a1000

    a1000 Гуру

    Вас не переубедить, но вставлю пару фраз. Вы упускаете понятие мнемоника. Это символьное представление машинной команды. Ни кто и никогда не переводит символы мнемоники в ascii коды, как сделали вы. Это лишено всякого смысла. Символьное представление машинной команды переводится в два байта последовательности нулей и единиц. Для приведенноё вами инструкции cli это будет 1001010011111000. И если мы напишем большими буквами CLI, то не смотря на то, что в ascii кодах это будет выглядеть совсем по другому, во флеш память микроконтроллера всёравно запишится 1001010011111000.
    И вы абсолютно правы
    Он сразу компилирует в код машинной команды. Но из кодов машинных команд лекго востанавливаются текстовый ассемблерный код.
    Ну и насчёт
    Нет в ассемблере никаких структур ранных. есть "железные" регистры памяти в которых хранятся последовательности нулей и единиц. И только программист знает что это, число в прямом или дополнительном коде, код ascii, флаг и т.д. Ну а про макросы почитайте сами.
     
    Ariadna-on-Line и parovoZZ нравится это.
  8. parovoZZ

    parovoZZ Гуру

    и никакого контроля выполнения там тоже нет. Ассемблер перевёл в машинные коды, линкёр слинковал и им обоим посрать, что там вообще творится в коде.
     
    Ariadna-on-Line нравится это.
  9. Asper Daffy

    Asper Daffy Иксперд

    А Вы сами не знаете?

    Для x86: TASM, MASM, WASM, A86 (это только самые популярные)
    Для AVR: AVRASM, AVRA, GNU As (если ещё, но эти самые можные)

    Для остальных процессоров гуглите сами.
     
  10. parovoZZ

    parovoZZ Гуру

    Подождите, ассемблерные инструкции описаны в даташите. Причём здесь компиляторы?
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Конечно! Вот представьте, что я бы начал Вас переубеждать в чём-то элементарном из Вашей профессии, при этом ещё и путаясь в терминологии (а Вы делаете именно это). См. моё "финальное замечание" в конце поста.
    Именно это я и написал в посте #20 (перечитайте), а Вы зачем-то стали возражать.
    Точно нет? А если найду? :)
    Если нет, то вот это что?

    Код (C++):
    ;
    ; Определяем структуру TwoNumbers
    ;
    .struct 0
        TwoNumbers:
            TwoNumbers.numberA:
            .space 1
            TwoNumbers.numberB:
            .space 1
    ; конец определения struct TwoNumbers
    ;

    .section .text
    .global getSum

    ;
    ;    Прототип функции
    ; uint8_t getSumAsm(const TwoNumbers * const twoN );
    ;
    getSum:
        movw    r30, r24    ; параметр - указатель на структуру -> Z
        ldd    r24, Z + TwoNumbers.numberA ; numberA -> r24
        ldd    r23, Z + TwoNumbers.numberB ; numberB -> r23
        add     r24, r23    ; складываем и возвращаем
        ret
    ;

    Кстати, можете положить это файл (только расширение должно быть именно ".S" (чувствительно к регистру!) в папку ASM_Structure вместе с файлом

    Код (C++):

    struct TwoNumbers {
        uint8_t numberA;
        uint8_t numberB;
    };

    extern "C"  uint8_t getSum(const TwoNumbers * const twoN);

    void setup(void) {
        Serial.begin(115200);
        Serial.println("The fun begins!");
        TwoNumbers tn = { 13, 12 };
        const uint8_t res = getSum(& tn);
        Serial.print("Result is: ");
        Serial.println(res);
    }

    void loop(void) {
        delay(100500);
    }
     

    и запустить в Ардуино - посмотрите как работает.

    Кстати, это написано для GNU ассемблера для AVR. В другом популярном ассемблере для того же процессора (AVRASM2) нет директивы .struct, там то же самое нужно было бы писать через директиву .org. Это к тому, что для одного и того же процессора существует масса ассемблеров, хотя система команд одна и та же. Уже это говорит, что а ассемблерах есть что-то, кроме тупых мнемоник.
    Почитайте. И, когда почитаете, разберитесь. что делает вот эта конструкция

    Код (C++):
    .macro  nops amount
        .if \amount > 0
            nop
            nops (\amount-1)
        .endif
    .endm
     

    И какое отношение она имеет к
    Кстати, это написано для GNU ассемблера для AVR. В AVRASM2 это писалось бы гораздо проще. Это ещё раз к тому же, что в ассемблерах есть много чего, кроме железных регистров.

    Давайте договоримся на будущее. Если Вам непонятно то, что я говорю, Вы спрашивайте. Можно переспросить, если опять непонятно, я буду честно стараться объяснять. Переубеждать же меня и делать безапелляционные заявления, как Вы делаете сейчас (или делали в теме про глобальный static) не надо. Спорить и холиварить я не буду (как не стал в теме про static - не вижу в этом смысла), просто не спросив, а припечатав меня фразой типа "нет там" Вы теряете шанс узнать что-то новое.

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

    Поэтому, давайте не будем спорить. Если Вам кажется что-то неправильным - спросите в чём там дело, я всегда готов объяснить, привести примеры и т.п. Те, кто меня знают давно (и здесь и на ардуино.ру) именно так и поступают.
     
    Последнее редактирование: 14 июл 2021
    Andrey12, KindMan и SergeiL нравится это.
  12. Asper Daffy

    Asper Daffy Иксперд

    Вы опять путаете. В даташите описаны машинные команды! Это совсем не тоже самое, что команды ассемблера! Ассемблерные инструкции описаны в описании ассемблеров. Там инструкции типа .equ, .struct, .section, .if,.else,.extern,.global, ... причём тут даташит?
     
  13. a1000

    a1000 Гуру

    Вообще-то это директивы. Это не транслируется в код. Это совсем для другого.
     
  14. Asper Daffy

    Asper Daffy Иксперд

    А я где-то говорил, что это транслируемый код? Это директивы ассемблера. Видите, там (в ассемблере) оказывается не только железные регистры, а ещё до хрена чего, включая и структуры данных. А Вы говорили - нет :)
     
  15. Asper Daffy

    Asper Daffy Иксперд

    parovoZZ,

    Давайте я помогу Вам из этой каши вылезти.

    Практики часто сокращают терминологию для краткости (типа, и так понятно) и говорят формально неправильно, но при этом друг друга понимают. Например, формально неправильно говорить (но все говорят) «программа на ассемблере». Правильно «программа для ассемблера» или «программа на языке ассемблера». Но до тех пор, пока все друг друга понимают, беды в такой неправильности нет.

    Но когда в отрасль приходят новые люди, неспециалисты, они часто воспринимают эту терминологию буквально и из-за перепутанной терминологии у них начинается путаница в понятиях. Именно так произошло с «управляемыми баллистическими ракетами» и с тем же ассемблером. И Вы просто путаете понятия - ассемблера и набора машинных инструкций. Для Вас набор инструкций и есть ассемблер, а это не так.

    Давайте я дам Вам правильную терминологию и это поможет Вам расставить по полочкам и сами понятия.

    Ассемблер – программа, переводящая тест со своего входного языка в машинные команды (стандарт ISO/IEC/IEEE 24765, определение 3.168).

    Язык ассемблера – входной язык ассемблера (см. выше).

    Т.е. ассемблер – это не язык, это программа. В языках высокого уровня такая программа называется компилятором.

    Теперь смотрите, я могу придумать любой язык ассемблера с блэкджеком и шлюхами всякими там структурами, условной компиляцией, макросами и т.п. Какой-то из таких языков будет более удобным, какой-то менее, но все они будут языками ассемблера.. При этом машинные команды одни и те же (именно они описаны в даташите) и именно в них в итоге всё будет транслироваться.

    Стало понятнее?
     
    Andrey12, SergeiL, parovoZZ и ещё 1-му нравится это.
  16. Asper Daffy

    Asper Daffy Иксперд

    Кстати, а почему никто не посоветовал ТС самое просто решение?
    Выключить телевизор!
     
    Andrey12 и parovoZZ нравится это.
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Вообще-то хекс-файл это еще не самое дно. На самом дне - файл.bin. Поищите hextobin, bintohex converter-ы.
    2. Мнемоники инструкций и ассемблерный код это одно и то же. В ассемблере (в компиляторе) просто автоматизированы некоторые рутинные операции по вычислению смещений для ссылок, переходов и тд. и сами операции переходов по ним. Все остальные языки программирования (и последующие варианты языка ассемблера) - просто дальнейшее избавление от рутинных операций, рутинные комбинации команд заменяются одним термином и тд.
    ПС. Когда в ассемблере наработаешь для себя набор нужных тебе процедур - программирование становится малоотличимым от ЯВУ.
     
    Последнее редактирование: 14 июл 2021
    a1000 нравится это.
  18. Asper Daffy

    Asper Daffy Иксперд

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

    Код (C++):

    ;
    ; Определяем структуру TwoNumbers
    ;
    .struct 0
        TwoNumbers:
            numberA:
            .space 1
            numberB:
            .space 1
    ; конец определения struct TwoNumbers
    ;

    .section .text
    .global getSum

    ;
    ;    Прототип функции
    ; uint8_t getSumAsm(const TwoNumbers * const twoN );
    ;
    getSum:
        movw    r30, r24    ; параметр - указатель на структуру TwoNumbers -> Z
        ldd    r24, Z + numberA ; numberA -> r24
        ldd    r23, Z + numberB ; numberB -> r23
        add     r24, r23    ; складываем и возвращаем
        ret
    ;
     

    то будет понятнее.

    Не знаю, на вкус и цвет. Мне мой вариант кажется более понятным.
     
    Andrey12 нравится это.
  19. b707

    b707 Гуру

    Asper Daffy так их :)

    А еще мне кажется, что большинство тех. кто по любому поводу кричит о преимуществах асма - обычно просто плохо знает Си...:)
     
    Andrey12 нравится это.
  20. Asper Daffy

    Asper Daffy Иксперд

    Обычно, не только Си, но и ассемблер тоже. Просто, в определённых кругах модно так кричать.