Подтвердить что ты не робот

Изучите язык с использованием малины Pi?

Я немного искал, но не смог найти окончательного ответа на этот вопрос, поэтому я надеюсь, что смогу получить ваше мнение.

Я хотел бы узнать язык ассемблера (ARM) - будет ли малина Pi хорошим выбором для этого?

Из того, что я вижу, кажется, что есть несколько нежных учебных пособий для того, чтобы делать такие вещи, как создание светодиодной вспышки и т.д., поэтому с точки зрения новичков это не слишком страшно, и на самом деле это выглядит очень весело.

Если я начал с малины Pi, а затем перешел на использование дизассемблеров, чтобы накопить мои знания, я нахожусь на хорошем пути или начинаю с неправильной ноги?

Спасибо за ваши комментарии.

4b9b3361

Ответ 1

Да и нет. Если это ваш первый язык ассемблера, ARM - хороший (x86 - плохой), чтобы начать (есть и другие хорошие). Сначала я рекомендую учиться с использованием симулятора набора инструкций. Это может улучшить представление о том, что происходит, и даст вам больше шансов на успех (меньше шансов отказаться от разочарования). Как только вы намочите ноги инструментами, создайте голые металлические программы и т.д., Тогда малина pi - неплохая платформа. периферийные устройства, хотя и плохо документированные, очень просты в использовании (по сравнению с другими подобными платформами) достаточно сообщества и примеры для компенсации документации. малина pi может считаться не кирпичной с точки зрения ARM. Превращение платы, пытающейся сделать вашу первую мигающую программу, может быть довольно неприятной.

У меня есть несколько примеров на github.com/dwelch67 thumbulator - симулятор набора инструкций для большого пальца, который для любого программиста C должен быть понятен и позволить вам изучить, что происходит. amber_samples - это другой подход, это клон arm2 (за исключением нескольких исключений, вы можете видеть, что прямая связь между arm2 и современным arm4 и выше, которые лицензированы на руку. должен быть плавным переходом между ними. нужен симулятор, в моем примере используется верификатор, но icarus verilog должен работать так же легко. Где вы получаете видимость, наблюдая за выполнением программой в процессоре, наблюдая за шинами и т.д., выборки команд, циклы памяти и т.д.

Я большой сторонник написания дизассемблера как способ узнать новый (мне) набор инструкций. набор инструкций ARM является фиксированной длиной слова (32 бит) и очень легко разбирается. чистые инструкции большого пальца фиксируются на 16 бит и даже проще разбирать. У большого пальца есть выдвижения большого пальца, хотя и это делает его сложнее, поэтому я бы избежал их вначале. С помощью наборов инструкций с фиксированной длиной слова вы можете безопасно пройти через двоичное изображение и разобрать, когда идете от начала до конца. данные будут выглядеть странно, но инструкции будут в нужном месте. С переменной длиной слова вы не можете просто начинать с самого начала и разбирать линейно (с использованием расширений thumb2 означает переменную длину инструкции), у вас может быть трехбайтная команда, затем один байт данных, затем другой байт инструкции, линейно, что байт данных будет дизассемблирован как инструкция, и если это произойдет, чтобы декодировать как многобайтную инструкцию, то теперь вы не синхронизированы. Единственный правильный способ разобрать двоичную длину переменной длины инструкции - это следовать всем путям кода в порядке выполнения и от того, что разобрать то, что вы можете (без эмуляции всех возможных путей кода вы не сможете отличить все инструкции от данных), разборка длины переменной команды, безусловно, является передовой темой, сначала создайте силу на ассемблере. Возможно, даже создайте симулятор набора инструкций для набора переменных переменной длины слова перед тем, как заняться дизассемблером (вы должны в принципе расшифровать свой путь через двоичный файл, а не полностью декодировать, но частично декодировать, чтобы сделать дизассемблер для набора переменных переменной длины слова. извините за длинное описание там.

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

Существует пример университетского университета, который держит вашу руку с помощью простых мигающих светодиодных примеров, а затем в видеоэлементов. а также других лиц, разместивших ссылки на свои примеры в разделе "Голый металл" дискуссионных форумов. чтобы почувствовать "как это сделать на языке ассемблера", напишите небольшие C-функции, скомпилируйте (с оптимизацией), затем разоберите. Я специально говорю о коде вроде a + b, а не о коде типа printf(). Изучается язык ассемблера, набор инструкций, который является специфическим для семейства процессоров. то я буду спорить ПОСЛЕ ТОГО, ЧТО изучают системные вызовы или вызовы библиотеки. "Как напечатать строку", например, как аппаратное обучение, система (rom-монитор/отладчик), так и библиотека (библиотека C или другие языки высокого уровня, вызовы функций и соглашения, чтобы использовать их библиотеки, которые сами могут назвать многие другие библиотеки, вызывающие много нежелательных связей). поэтому использование C для изучения "языка ассемблера" означает отсутствие вызовов библиотеки, отсутствие memcpy no printf и т.д., но это зависит от вас, хотя, если вы используете вызовы системы и библиотеки, тогда вам нужно написать свой код asm для запуска в этой системе или ссылке с теми вызовами, которые могут сами иметь системную зависимость. Подумайте об изучении языка C на языке высокого уровня или Python и т.д., Изучая язык, объявляя переменные, изучающие операторы для добавления, вычитания, xor и т.д. Как использовать указатели и массивы и т.д. В какой-то момент вы изучаете библиотеку C вызовы, printf(), strcpy(), malloc и т.д. YMMV, узнайте затем язык, затем система вызывает отдельно или изучает langauge BY, чтобы учиться взаимодействовать с системными вызовами (изучать их вместе).

Если вы решили изучить asm как часть системы, я рекомендую оставаться в Linux, создавать простые простые функции C, компилировать и дизассемблировать, изучать соглашение о вызове для компилятора и использовать справочные материалы для поиска инструкций как вы видите их, созданные компилятором. научитесь создавать эту функцию с нуля с помощью asm и связывать ее с программой C, а затем модифицировать эту функцию. Это совершенно другой подход, чем то, что я описывал выше. вызванный возможностью неудачи, но, безусловно, изучает примерный подход.