Список ресурсов для изучения Ассемблера / Хабр
Доброго времени суток!
Некоторым программистам иногда приходит в голову мысль «а не изучить ли мне ассемблер?». Ведь на нем пишут самые (с некоторыми оговорками) маленькие и быстрые программы, да и охота ощутить вкус низкоуровневого программирования берет свое. Ну и для общего развития не повредит.
Мысль эта не обошла стороной и меня. Вдохновившись
историей одного байта, я ринулся в бой…
… но оказалось, что найти материал по интересующей теме не так просто, как хотелось бы. Посему решено было создать на хабре пополняющийся пост-индекс статей/книг/мануалов/etc. об этом, несомненно, великом языке.
Под катом находится, собственно, список с краткими комментариями, разбитый по категориям.
UPD
В список начали добавляться ресурсы по программингу микроконтроллеров.
Для начала
Ресурсы
Книги
Для книг я выкладываю только названия, без ссылок (или с ссылкой на интернет-магазин), так как я не знаю отношения некоторых людей к скачиванию чьей-то интеллектуальной собственности.
- kpnc.opennet.ru — архив книг Криса Касперски
- Галисеев Г. В. Ассемблер для Win 32. Самоучитель
- Зубков С. В. Ассемблер для DOS, Windows и UNIX
- Кип Ирвин. Язык ассемблера для процессоров Intel = Assembly Language for Intel-Based Computers
- Калашников О. А. Ассемблер? Это просто! Учимся программировать
- Крис Касперски. Искусство дизассемблирования
- Владислав Пирогов. Ассемблер для Windows
- Владислав Пирогов. Ассемблер и дизассемблирование
- Ричард Саймон. Microsoft Windows API Справочник системного программиста
- Фрунзе А. В. Микроконтроллеры? Это же просто!
- Юров В., Хорошенко С. Assembler: учебный курс
- Абель — Ассемблер. Язык и программирование для IBM PC
- Эндрю Таненбаум — «Архитектура компьютера» — рекомендация lefty
- Чарльз Петцольд — «Код» — рекомендация lefty
- Assembly Language Step-by-step: Programming with DOS and Linux
- Юрий Ревич «Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера» — рекомендация Ryav
- Нортон П., Соухе Д. «Язык ассемблера для IBM PC» — рекомендация maotm
- Григорьев В. Л. «Микропроцессор i486. Архитектура и программирование.» — рекомендация Ghost_nsk
- Нортон П., Уилтон Р. «IBM PC и PS/2.руководство по программированию» — описана работа с прерываниями и простыми железками, рекомендация Ghost_nsk
Англоязычные ресурсы
Инструменты
Программинг микроконтроллеров
Прочее
- zx.pk.ru — форум ZX Spectrum
- bbs.pediy.com — форум по reverse engineering на китайском языке (спасибо KollinZ). Чтобы можно было понять о чем речь, можно воспользоваться кнопкой «перевести» в хроме (спасибо за совет mexanism)
- old-dos.ru — крупнейший в Рунете архив старых программ
Заключение
Надеюсь эта статья будет полезна как новичкам, так и тем, кто ищет новых знаний. Если вы знаете какие-либо интересные ресурсы по теме, смело пишите в комментарии, пост создавался, чтобы пополняться.
P.S.: И, да, я очень надеюсь не увидеть в комментариях холивар Assembler vs. %anything% (или «стоит ли изучать ассемблер?»).
6 книг по Ассемблеру на русском языке
Книга поможет овладеть базовыми знаниями по языку ассемблер. Автор разобрал широкий сегмент вопросов на простом и понятном языке. Не обращай внимания на процессор – основная суть программирования под Intel не поменялась, да и понимать инфу лучше на простых вещах. Каждый кусок текста усилен кодом, так что скучно не будет. Подойдет как для опытных программистов, так и для совсем “зеленых”.
Ассемблер для процессоров Intel PentiumЭто издание – одно из лучших для новичков. Присутствует гора примеров с кодом, которые прекрасно задокументированы. После прочтения ты узнаешь, как программировать под разными ОС, как запустить пример на ассемблере, резидентные программы и многое другое. Отлично подойдет для новичков и студентов.
Assembler на примерах. Базовый курс
В книге все начинается по закону жанра – история ВТ, математика, алгоритмы, вычислительные системы и прочее (про алгоритмизацию и выч.системы почитай отдельно – пригодится). Автор книги плавно тебя подводит к изучению языка С, поэтому указатели, память и рекурсия рассматриваются довольно часто. А еще ты узнаешь об отладке и о том, как правильно тестировать свой код.
Программирование, введение в профессию. Низкоуровневое программирование
Ассемблер важен до сих пор по нескольким причинам. Первая – он незаменим в процессе познания устройства ЭВМ. Вторая – без него затруднительно писать программу управления девайсом, в котором нет нативной ОС – магнитолы, медицинские приборы, различные микроконтроллерные системы и т. д.
Материал в книге изложен понятным языком от простого к сложному – от легких примеров до написания автономных программ для «безбиосных» систем. Закрепить теорию ты сможешь заданиями в виде лабораторных работ. Подойдет для студентов и интересующихся темой.
Программирование на ассемблере
Крутая вещь, в которой краткое и лаконичное изложение материала переплетается с практикой программирования под интегральные микросхемы. Поскольку издание предназначено для прочтения студентами направления «Вычислительная техника», то представь, каким понятным языком оно написано.
Книга прекрасно подойдет для специалистов, работающих в сфере автоматизации систем, и для простого обывателя.
Данное руководство поможет разобраться с темой разработки управляющих программ под архитектуру х86. Авторы постарались привести максимум полезной информации о связи ассемблера с другими ЯП, а также уделили должное внимание работе с прерываниями, микрокомандами, резидентными программами и т.д.
В качестве закрепления пройденной теоретической части предложены примеры-задачи, а для практической составляющей – написание кода.
Самоучитель. Ассемблер
А какую литературу по ассемблеру изучал ты?
Лучшие книги по Ассемблеру для начинающих – Библиотека программиста
Просмотров 1.8k. Обновлено
Отобрали лучшие книги по Ассемблеру для начинающих. Актуальная литература на русском языке с лучшими оценками.
Ассемблер для Windows. Владислав Пирогов
В книге описаны возможности написания программ в системе Windows на ассемблерах MASM и TASM. Прочитав ее можно научиться создавать драйвера, которые работают в режиме ядра и методы исследования программ.
Преимущества:
- информация легко воспринимается и понятна для читателя с любым уровнем программирования;
- наличие множества примеров, которые помогают разобраться с темой.
Assembler. Для DOS, Windows и Unix. Сергей Зубков
Книга предназначена как для специалистов своего дела, так и для новичков. В ней показаны все стороны создания программ на ассемблере для разных систем: DOS, Windows и Unix. В книге автор описывает следующие темы: создание резидентных драйверов, программирование периферийных устройств, управление режимами.
Преимущества:
- учебник и справочник в одной книге;
- просто и понятно описаны общие принципы.
Недостатки:
- устаревшая информация.
Ассемблер. Самоучитель. Андрей Жуков, Андрей Авдюхин
Книга написана в виде руководства для программирования на языке ассемблер. В основном она состоит из практической информации, которая сразу обучает работать в этой системе. При помощи иллюстраций раскрываются многие актуальные вопросы. Также после каждой темы приводятся контрольные вопросы, задачи и практические задания.
Преимущества:
- подробно описывается материал;
- много упражнений, которые помогают начать разрабатывать свой проект;
- контрольные вопросы дисциплинируют и помогают качественнее запомнить новый материал.
Ассемблер – это просто. Олег Калашников
Программисты почерпнут из книги много ответов на основные вопросы по работе на ассемблере. Каждая новая тема поделена на главы, в которых объясняются принципы работы, алгоритмы, дается решение частых задач и приводятся примеры с практическими упражнениями.
В книге есть обучение по созданию простого вируса и антивируса к нему, как писать резидентные программы и создавать оболочки.
Преимущества:
- книга дает понимание про работу компьютера в целом;
- дает возможность практиковаться в любой системе;
- рассказывает о работе процессора через ассемблирование более, чем подробно;
- специализированная литература, которой мало.
Недостатки:
- рассчитана не на новичков, а на тех, кто уже умеет определенный уровень программирования (начинать с этой книги нельзя).
20 уроков Ассемблера. Семён Углев
Издание состоит из экспресс-тем, в которых раскрыты основы Ассемблера. Автор написал книгу отталкиваясь от основной задумки: позволить читателю как можно быстрее изучить язык на конкретных примерах и упражнениях. Рекомендуется тем, кто хочет быстро освоить Ассемблер без углубления в тему.
Преимущества:
- помогает быстро понять основы;
- хорошая и понятная подача материала;
- полезная книга, но для экспресс-обучения.
Недостатки:
- книга не дает полной информации;
- кроме основ и некоторых общих моментов из нее ничего нельзя вынести.
Программирование микроконтроллеров Atmel AVR на ассемблер. Юрий Ревич
В книге описаны основы принципа действия, функции и программирование микроконтроллеров. Есть пошаговые инструкции, чтобы запустить их в действие. Также отдельной темой является обмен и передача данных между микроэлектроникой и компьютером. Приводится список команд для микроконтроллеров AVR.
Преимущества:
- полезная информация без воды;
- отлично обучает программированию AVR на ассемблерах;
- у автора большой практический опыт в теме;
- наглядно представлены тексты программ на языке Ассемблер.
Выводы
- Для тех, кто только начинает осваивать микропроцессорную электронику советуется прочитать книги: Assembler. Для DOS, Windows и Unix. Сергей Зубков, Ассемблер. Самоучитель. Андрей Жуков, Андрей Авдюхин, Программирование микроконтроллеров AVR на ассемблер. Юрий Ревич.
- Чтобы повысить свой уровень знаний в теме программирования на ассемблере нужно прочитать: Ассемблер – это просто. Олег Калашников, Ассемблер. Самоучитель. Андрей Жуков, Андрей Авдюхин.
- Если нет времени на углубленное изучение языка, то стоит прочитать книгу 20 уроков Ассемблера. Семён Углев.
Делитесь не попавшими в эту подборку книгами по Assembler в комментариях!
Иллюстрированный самоучитель по Assembler › Основы программирования › Подготовка и отладка программы [страница — 19] | Самоучители по программированию
Подготовка и отладка программы
Процесс подготовки и отладки программы на языке ассемблера включает этапы подготовки исходного текста, трансляции, компоновки и отладки.
Подготовка исходного текста программы выполняется с помощью любого текстового редактора, хотя бы редактора, встроенного в программу Norton Commander, или еще более удобного редактора Norton Editor. При использовании одного из более совершенных текстовых процессоров, вроде Microsoft Word, следует иметь в виду, что эти программы добавляют в выходной файл служебную информацию о формате (размер страниц, тип шрифта и др.), которая будет непонятна транслятору. Однако практически все текстовые редакторы и процессоры позволяют вывести в выходной файл «чистый текст», без каких-либо служебных символов. Именно таким режимом и надлежит воспользоваться в нашем случае.
В принципе для подготовки исходного текста можно воспользоваться любым редактором системы Windows, например, программой WordPad или Блокнотом. Однако в этом случае возникнут неприятности с русским шрифтом. Как известно, корпорация Microsoft приняла для своих русифицированных продуктов собственную кодировку русских символов, расходящуюся со стандартной, используемой в приложениях DOS. Если программу, использующую русский текст в качестве комментариев, или выводящую его на экран, подготовить в одном из редакторов Windows, то при ее просмотре и запуске в среде DOS вместо русского текста вы увидите бессмысленный набор символов. Поэтому программы, предназначенные для выполнения под управлением MS-DOS, лучше и подготавливать в среде DOS. Файл с исходным текстом должен иметь расширение .ASM.
Следующая операция состоит в трансляции исходного текста программы, т.е. в преобразовании строк исходного языка в коды машинных команд. Эта операция выполняется с помощью транслятора с языка ассемблера (т.е. с помощью программы ассемблера). Известные разработчики программного обеспечения – корпорации IBM, Borland, Microsoft и др. предлагают свои варианты трансляторов, несколько различающиеся своими возможностями и системой обозначений.
Однако входной язык любого транслятора, включающий в себя мнемонику машинных команд и других операторов и правила написания предложений ассемблера, для всех ассемблеров одинаков, поэтому при подготовке и отладке примеров данной книги можно с равным успехом воспользоваться любой из указанных программ. Мы, как уже отмечалось, использовали программы пакета TASM 5.0 (фирменные названия этих программ – Turbo Assembler, Turbo Link и Turbo Debugger, а имена соответствующих им файлов – TASM.EXE, TLINK.EXE и TD.EXE).
После трансляции образуются два файла – листинг трансляции и объектный файл с расширением OBJ. Листинг представляет собой текстовый файл, предназначенный для чтения в каком-либо редакторе, и содержит исходный текст оттранслированной программы вместе с машинными кодами команд. В случае обнаружения транслятором каких-либо ошибок, в листинг также включаются сообщения об этих ошибках.
Рассмотрим элементы листинга трансляции Примера 1.1 из предыдущей главы. На рис. 2.1 приведен несколько сокращенный текст этого листинга, из которого удалены комментарии к отдельным предложениям.
Рис. 2.1. Листинг трансляции программы 1-1.
Ассемблер MS-DOS — завершаем цикл вводных статей об ассемблере.
Прощай ассемблер MS-DOS и здравствуй Windows!
Мы закончили изучать 16 битный ассемблер MS-DOS и приступаем к изучению программирования на 32 битном ассемблере для Windows.
Нужно ли было копаться в коде мёртвой операционной системы, вместо того, чтобы сразу перейти к основам современного программирования? Для последующего успеха в изучении программирования — это необходимо. Практическое применение знаниям 16 битного ассемблера вы вряд ли найдёте в наше время. Пройденный нами этап — это основа теоретических знаний и практического понимания сути программирования через его основополагающее начало.
16 битный ассемблер — это практически первый язык программирования, возможность «на молекулярном» уровне общаться с древними машинами-динозаврами. В дальнейшем Вы поймёте, что основы работы современных процессоров мало изменились до нашего времени. Обилие ненужной информации в Интернете создаёт иллюзию сложности. В действительности — ничего сложного нет.
Вы уже начинаете понимать, что необходимо осознать саму суть написания кода. Всё запоминать не имеет смысла, для этого есть справочники и уже созданный кем-то исходники
В завершение курса 16-ти битного программирования на ассемблере, перечислим ряд учебников. Если кто-то захочет расширить свои знания или уточнить отдельные моменты написания кода для операционной системы MS-DOS, он может обратиться к ниже перечисленной литературе.
Мы бы советовали прочитать первую книгу: «20 уроков ассемблера под DOS», остальные — сверх нормы для тех, кто хочет отшлифовать пройденный материал.
Книга 1. 20 уроков ассемблера под DOS.
Книга Семёна Леонидовича Углева «20 уроков ассемблера под DOS» — просто находка для начинающих изучать ассемблер. Просто конкурент нашему циклу статей. Всё понятно, кратко и практично. Содержится основные данные, чтобы изучить ассемблер MS-DOS пошагово. Плавно переходим от простой программы к резидентной, затем пишем простой MS-DOS вирус, а затем — антивирус!
Изучаем ассемблер MS-DOS пошагово на примере написания вируса и антивируса.Книга 2. Программирование на ассемблере.
Книга В.В. Одинокова и В.П. Коцубинского «Программирование на ассемблере» — типовой учебник для студентов технических ВУЗов. Сухо и по-преподавательски. Имеются лабораторные работы для закрепления материала.
Типовой учебник для студентов ВУЗов.Книга 3. Аппаратное обеспечение IBM PC.
Книга известнейших братьев Александра и Григория Фроловых. Содержит примеры программ на ассемблере и Си.
Аппаратное обеспечение IBM PC c исходниками.Книга 4. Тонкая настройка и оптимизация MS-DOS.
Ещё одна книга братьев Фроловых. В ней нет ассемблерного кода, но содержится информация, позволяющая понять тонкости операционной системы MS-DOS. Для полноты понимания сути вопроса, пригодится для изучающих ассемблер MS-DOS.
Тонкая настройка и оптимизация MS-DOS — вспомогательная информация об операционной системе.Книга 5. MS-DOS для программиста — часть первая.
Первая часть отличнейшего учебника по программированию на ассемблере в операционной системе MS-DOS 6.22. Братья Фроловы излагают информацию интересно, толково и доступно. Весь код рабочий, как всегда.
MS-DOS для программиста. Часть 1.Книга 6. MS-DOS для программиста — часть вторая.
Вторая часть замечательного учебника для желающих на практике изучить ассемблер MS-DOS.
MS-DOS для программиста. Часть 2.Книга 7. Ассемблер и программирование для IBM PC.
Не можем пропустить самую известную книгу Питера Абеля, по которой учились программировать первые Российские или тогда Советские программисты. Распространялась в текстовом режиме. Интернета не было, поэтому переведённое произведение представляло собой особую ценность. Прочитать интересно и сейчас.
Питер Абель: «Ассемблер и программирование для IBM PC».Книга 8. The Art of Assembly Language Programming (AoA).
Переходим к рассмотрению англоязычных учебников. Начнём с «The Art of Assembly Language Programming (AoA)» от Randall Hyde. Объёмная, информация, но изложена суховато. Можно найти HTML и PDF версии на официальном сайте: https://www.plantation-productions.com/Webster/www.artofasm.com/index.html
The Art of Assembly 16 bit.Книга 9. Zen of Assembly Language.
Книга Майкла Абраша (Michael Abrash) с интрегующим названием. Вы часто будете встречать в литературе по программированию на ассемблере ссылки на Дао, Дзен и т.п. Изучая этот язык программирования у Вас появиться вначале предположение, а потом твёрдое убеждение в том, что наш Мир — всего лишь матрица, программа, набор нулей и единиц …
Дзен язака ассемблер Майкла Абраша.Книга 10. Windows Assembly Language & Systems Programming.
Автор книги — Бари Каулер (Barry Kauler). В книге рассматривается как ассемблер MS-DOS, так и 32 битный ассемблер Windows. Большое количество исходного кода прилагается. Хороший англоязычный учебник.
Windows Assembly Language & Systems Programming от Barry Kauler.Все рассмотренные книги находятся в одном архиве: СКАЧАТЬ АРХИВ.
Базовый, но тщательный учебник assembly (linux)?
Я хочу выучить какой-нибудь практический язык assembly, только что изучив основные понятия в классе. Есть ли какие-нибудь приличные книги или учебные пособия (nasm и т. д.), которые можно было бы рекомендовать?
linux assembly nasmПоделиться Источник not-too-smatr 07 мая 2009 в 20:47
7 ответов
- Linux Assembly ссылка
Я читаю книгу профессиональный язык Assembly с образцом кода, написанного для процессоров Intel IA-32. Используемый ассемблер-это ассемблер GNU. Где я могу найти эту ссылку Assembly? Например, написав Assembly для Windows, я могу найти ссылку на сайте Intel WEB. А как насчет Linux и GNU Assembler?
- Базовый учебник для node.js openCV
Я ищу базовый учебник для использования OpenCV с node.js. Я не смог найти ничего, описывающего функциональность, так что, возможно, кто-нибудь может дать мне подсказку, где я могу найти такую информацию. Надеюсь, у кого-нибудь есть идея Даниил
26
Язык PC Assembly — мой любимый ресурс по программированию assembly. Она современная, бесплатная и охватывает самые разные темы. Он использует NASM , и примеры доступны для Linux (среди нескольких других систем).
Поделиться Ayman Hourieh 07 мая 2009 в 21:03
Поделиться plan9assembler 12 июля 2009 в 11:06
7
Я согласен, что язык PC Assembly очень хорош. Другими хорошими, использующими GAS, являются:
Поделиться JF. 08 мая 2009 в 17:22
- Assembly languaje, базовый указатель
я читал пример на assembly languaje, и у меня есть немного сомнений. Мы использовали assembly только в наших программах, но последняя единица в семестре-это слияние его с turbo c (in-line assembly), и, читая код, я не совсем понимаю его: Вот часть assembly: dosseg .model small .code public…
- Программирование assembly под Linux
я пишу экзамен о arm 7 assembly, и я хотел бы написать некоторый код на моем компьютере Linux Mint. Можно ли написать какой-то базовый код (Hello World, просто циклы…) в консоли и скомпилировать его? Спасибо
2
«какой смысл изучать assembly просто так, черт возьми? »
Потому что вы научитесь HOW CPU работает и получите лучшее понимание системы. Я бы сказал, что понимание ассемблера само по себе практично.
Поделиться BoraxMan 08 марта 2010 в 06:47
2
Я рекомендую книгу Джеффа Дантеманна Assembly Language Step By Step, Третье Издание. Это было мое первое знакомство с asm, но оно приятное, читаемое, довольно современное и современное.
Поделиться jpowell 09 июля 2011 в 17:34
1
Я бы рекомендовал страницу assembly учебников по адресу http://pickatutorial.com
Надеюсь, это поможет.
Поделиться Sonia 27 октября 2010 в 14:11
Поделиться Tom 08 мая 2009 в 17:30
Похожие вопросы:
Assembly в Linux
Я читаю учебник по созданию компиляторов. В учебнике компилятор производит assembly 80X86, и я хочу знать, будут ли программы, созданные этим компилятором, работать в Intel Celeron Linux.If, а не в…
Базовый синтаксис и примеры учебник
На работе я тесно сотрудничаю с MS-Office. Мне удалось сгенерировать несколько сценариев, которые выполняют различные задачи. Хотя я могу переносить функции в VBA с некоторым трудом, я не полностью…
Учебник по булевой логике, используемый в Assembly
Есть ли где-нибудь учебник, который объясняет все тонкости булевых логических операций, которые возможны на языке assembly? Например, я понятия не имею, что делает следующий кодовый блок assembly:…
Linux Assembly ссылка
Я читаю книгу профессиональный язык Assembly с образцом кода, написанного для процессоров Intel IA-32. Используемый ассемблер-это ассемблер GNU. Где я могу найти эту ссылку Assembly? Например,…
Базовый учебник для node.js openCV
Я ищу базовый учебник для использования OpenCV с node.js. Я не смог найти ничего, описывающего функциональность, так что, возможно, кто-нибудь может дать мне подсказку, где я могу найти такую…
Assembly languaje, базовый указатель
я читал пример на assembly languaje, и у меня есть немного сомнений. Мы использовали assembly только в наших программах, но последняя единица в семестре-это слияние его с turbo c (in-line assembly),…
Программирование assembly под Linux
я пишу экзамен о arm 7 assembly, и я хотел бы написать некоторый код на моем компьютере Linux Mint. Можно ли написать какой-то базовый код (Hello World, просто циклы…) в консоли и скомпилировать…
Linux kernel assembly и логика
Мой вопрос несколько странный, но я сделаю все возможное, чтобы объяснить. Глядя на языки linux kernel, я получил C и assembly, хотя читал текст, в котором говорилось ,что вторая итерация Unix…
linux x86_64 с NASM с assembly системных вызовов
Я нашел диаграммы в интернете, показывающие различные системные вызовы для x86_64 linux nasm assembly, и там, кажется, есть 380 общих системных вызовов, однако каждая книга или учебник, которые я…
ассемблер — Самоучитель assembler — Stack Overflow на русском
ассемблер — Самоучитель assembler — Stack Overflow на русскомStack Overflow на русском — это сайт вопросов и ответов для программистов. Присоединяйтесь! Регистрация займёт не больше минуты.
Присоединиться к сообществуЛюбой может задать вопрос
Любой может ответить
Лучшие ответы получают голоса и поднимаются наверх
Вопрос задан
Просмотрен 2k раз
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.
Закрыт 5 лет назад.
Здравствуйте. Не могли ли Вы подсказать неплохой самоучитель по ассемблеру? Желательно, чтобы в конце каждой главы были упражнения, а также были куски кода с комментариями (например, hello world).
P.S. На хеше похожего вопроса не нашел, а точнее ответа на него.
задан 5 июл ’11 в 4:24
strbbstrbb1,06511 золотой знак1010 серебряных знаков2121 бронзовый знак
1Учил ассемблер по книге «Магда — Ассемблер для процессоров Intel Pentium» . Магда как автор очень понятно и доходчиво объясняет даже тяжелый материал. Также неплохие учебники:
- Голубь — Искусство программирования на Ассемблере. Лекции и упражнения
- Зубков — Assembler для DOS, Windows и UNIX
- Кулаков — Программирование на аппаратном уровне
- Ирвин — Язык ассемблера для процессоров Intel
- Марек — Ассемблер на примерах. Базовый курс
- Пирогов — Assembler. Учебный курс
- Assembler&Win32. Курс молодого бойца
ответ дан 5 июл ’11 в 17:56
gabingabin54111 золотой знак55 серебряных знаков1919 бронзовых знаков
2В свое время начинал изучение АСМа с советской брошюры (названия и автора, к сожалению, не помню) и подаренного учебника Юрова. Что-то типа этого: Виктор Юров «Assembler. Учебник для вузов». Но советская брошюра помогла понять идею ассемблера.
Nicolas Chabanovsky♦49k7070 золотых знаков246246 серебряных знаков474474 бронзовых знака
ответ дан 5 июл ’11 в 8:00
Alex39Alex393111 бронзовый знак
4Конечно, это мое мнение, но что-бы учить хлл нужно освоить низкоуровневое программирование. Мне очень понравился учебник Зубков С. — Assembler для DOS, Windows, UNIX. Примеры на TASM
, конечно, но для понимания очень годится. А если нравится другой компилятор, можно перепилить голову и конец программы, на начальной стадии обучения код везде одинаковый.
36111 золотой знак55 серебряных знаков1313 бронзовых знаков
ответ дан 27 июл ’12 в 19:11
AlexMelkAlexMelk911 бронзовый знак
Всё ещё ищете ответ? Посмотрите другие вопросы с метками ассемблер или задайте свой вопрос.
default
Stack Overflow на русском лучше работает с включенным JavaScriptВаша конфиденциальность
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей [Политикой в отношении файлов cookie] (https://stackoverflow.com/legal/cookie-policy).
Принять все файлы cookie Настроить параметры
Учебники по языку ассемблера
NASM — asmtutor.com
В этом уроке мы будем использовать sys_close для правильного закрытия активного сокетного соединения в дочернем процессе после отправки нашего ответа. Это освободит некоторые ресурсы, которые можно использовать для приема новых входящих подключений.
sys_close ожидает 1 аргумент — дескриптор файла в EBX. Затем в EAX загружается код операции sys_close, и вызывается ядро, чтобы закрыть сокет и удалить активный дескриптор файла.
Примечание: Запустите программу и используйте команду curl http: // localhost: 9001 в другом терминале или подключитесь к тому же адресу с помощью любого стандартного веб-браузера.
socket.asm; Разъем ; Скомпилируйте с помощью: nasm -f elf socket.asm ; Связать с (64-битные системы требуют опции elf_i386): ld -m elf_i386 socket.o -o socket ; Запустите с: ./socket % включают "functions.asm" РАЗДЕЛ .data ; наша строка ответа ответ db 'HTTP / 1.1 200 OK ', 0Dh, 0Ah,' Content-Type: text / html ', 0Dh, 0Ah,' Content-Length: 14 ', 0Dh, 0Ah, 0Dh, 0Ah,' Hello World! ', 0Dh, 0Ah, 0h РАЗДЕЛ .bss буфер resb 255,; переменная для хранения заголовков запросов РАЗДЕЛ. Текст global _start _Начало: xor eax, eax; инициализировать некоторые регистры xor ebx, ebx xor edi, edi xor esi, esi _разъем: толкнуть байт 6; создать сокет из урока 29 толкнуть байт 1 толкнуть байт 2 mov ecx, esp mov ebx, 1 mov eax, 102 int 80h _связывать: mov edi, eax; привязать розетку из урока 30 нажать dword 0x00000000 нажать слово 0x2923 нажать слово 2 mov ecx, esp толкнуть байт 16 толкнуть ecx толкни эди mov ecx, esp mov ebx, 2 mov eax, 102 int 80h _Слушать: толкнуть байт 1; послушайте розетку из урока 31 толкни эди mov ecx, esp mov ebx, 4 mov eax, 102 int 80h _принимать: нажать байт 0; принять розетку из урока 32 толкнуть байт 0 толкни эди mov ecx, esp mov ebx, 5 mov eax, 102 int 80h _вилка: mov esi, eax; вилка розетка из урока 33 mov eax, 2 int 80h cmp eax, 0 jz _read jmp _accept _читать: mov edx, 255; читать розетку из урока 33 mov ecx, буфер mov ebx, esi mov eax, 3 int 80h mov eax, буфер вызов sprintLF _написать: mov edx, 78; запись сокета из урока 34 mov ecx, ответ mov ebx, esi mov eax, 4 int 80h _Закрыть: mov ebx, esi; переместить esi в ebx (принятый дескриптор файла сокета) mov eax, 6; вызвать SYS_CLOSE (код операции ядра 6) int 80h; вызвать ядро _выход: вызов выйти; вызовите нашу функцию выхода
~ $ nasm -f elf socket.как м ~ $ ld -m elf_i386 socket.o -o сокет ~ $ ./socket
Новое окно терминала
~ $ curl http: // локальный: 9001 Привет мир!
Примечание: Мы правильно закрыли соединения сокетов и удалили их активные файловые дескрипторы.
Запись сборки ARM (Часть 1)
Добро пожаловать в эту серию руководств по основам сборки ARM. Это подготовка к следующей серии руководств по разработке эксплойтов для ARM. Прежде чем мы сможем погрузиться в создание шелл-кода ARM и построение цепочек ROP, нам нужно сначала осветить некоторые основы сборки ARM.
Пошагово будут рассмотрены следующие темы:
Учебное пособие по основам сборки ARM:
Часть 1: Введение в сборку ARM
Часть 2: Регистры типов данных
Часть 3: Набор инструкций ARM
Часть 4: Инструкции памяти: Загрузка и сохранение данных
Часть 5: Загрузка и сохранение нескольких частей
6: Условное выполнение и ветвление
Часть 7: Стек и функции
Чтобы следовать примерам, вам понадобится лабораторная среда на базе ARM.Если у вас нет устройства ARM (например, Raspberry Pi), вы можете настроить свою собственную лабораторную среду на виртуальной машине с помощью QEMU и дистрибутива Raspberry Pi, следуя этому руководству. Если вы не знакомы с базовой отладкой с помощью GDB, вы можете получить основы в этом руководстве. В этом руководстве основное внимание будет уделено 32-разрядной версии ARM, а примеры скомпилированы на ARMv6.
Почему ARM?
Это руководство обычно предназначено для людей, которые хотят изучить основы сборки ARM. Специально для тех из вас, кто интересуется написанием эксплойтов на платформе ARM.Возможно, вы уже заметили, что процессоры ARM повсюду вокруг вас. Когда я оглядываюсь вокруг, я могу насчитать в моем доме гораздо больше устройств с процессором ARM, чем процессоры Intel. Сюда входят телефоны, маршрутизаторы и, не говоря уже об устройствах Интернета вещей, продажи которых в наши дни, похоже, стремительно растут. Тем не менее, процессор ARM стал одним из самых распространенных ядер ЦП в мире. Это подводит нас к тому факту, что, как и ПК, устройства IoT подвержены неправильным злоупотреблениям при проверке ввода, таким как переполнение буфера.Учитывая широкое использование устройств на базе ARM и возможность неправильного использования, атаки на эти устройства стали гораздо более распространенными.
Тем не менее, у нас больше экспертов, специализирующихся на исследованиях безопасности x86, чем в ARM, хотя язык ассемблера ARM, пожалуй, самый простой из широко распространенных языков ассемблера. Итак, почему все больше людей не уделяют внимания ARM? Возможно, потому, что существует больше учебных ресурсов, посвященных эксплуатации на Intel, чем на ARM. Подумайте о великолепных руководствах по Intel x86 Exploit, написанных Fuzzy Security или Corelan Team — подобные руководства помогают людям, интересующимся этой конкретной областью, получить практические знания и вдохновение для изучения, выходящего за рамки того, что описано в этих руководствах.Если вы заинтересованы в написании эксплойтов для x86, учебники Corelan и Fuzzysec станут вашей идеальной отправной точкой. В этой серии руководств мы сосредоточимся на основах сборки и написании эксплойтов на ARM.
ПроцессорARM против процессора Intel
Между Intel и ARM много различий, но главное отличие — это набор команд. Intel — это процессор CISC (Compstruction Set Computing), который имеет более крупный и многофункциональный набор инструкций и позволяет многим сложным инструкциям обращаться к памяти.Поэтому у него больше операций, режимов адресации, но меньше регистров, чем у ARM. Процессоры CISC в основном используются на обычных ПК, рабочих станциях и серверах.
ARM является процессором RISC (вычисление с сокращенным набором команд) и, следовательно, имеет упрощенный набор команд (100 команд или меньше) и регистры более общего назначения, чем CISC. В отличие от Intel, ARM использует инструкции, которые работают только с регистрами, и использует модель памяти загрузки / сохранения для доступа к памяти, что означает, что только инструкции загрузки / сохранения могут получить доступ к памяти.Это означает, что для увеличения 32-битного значения по определенному адресу памяти на ARM потребуется три типа инструкций (загрузка, увеличение и сохранение), чтобы сначала загрузить значение по определенному адресу в регистр, увеличить его в регистре и сохранить это обратно в память из реестра.
Уменьшенный набор команд имеет свои достоинства и недостатки. Одним из преимуществ является то, что инструкции могут выполняться быстрее, что потенциально позволяет увеличить скорость (системы RISC сокращают время выполнения за счет сокращения тактовых циклов на инструкцию).Обратной стороной является то, что меньшее количество инструкций означает больший акцент на эффективном написании программного обеспечения с ограниченными доступными инструкциями. Также важно отметить, что ARM имеет два режима: режим ARM и режим Thumb. Инструкции Thumb могут быть 2 или 4 байтами (подробнее об этом в Части 3: Набор инструкций ARM).
Еще больше различий между ARM и x86:
- В ARM большинство инструкций можно использовать для условного выполнения.
- Процессоры Intel серии x86 и x86-64 используют формат с прямым порядком байтов
- Архитектура ARM была прямым порядком байтов до версии 3.С тех пор процессоры ARM стали BI-endian и имеют настройку, которая позволяет переключать endianness .
Различия не только между Intel и ARM, но и между разными версиями ARM. Эта серия руководств призвана сделать ее как можно более общей, чтобы вы получили общее представление о том, как работает ARM. Как только вы поймете основы, легко узнать нюансы для выбранной вами целевой версии ARM. Примеры в этом руководстве были созданы на 32-битной ARMv6 (Raspberry Pi 1), поэтому пояснения относятся именно к этой версии.
Названия различных версий ARM также могут сбивать с толку:
Семейство ARM | ARM архитектура |
---|---|
ARM7 | ARM v4 |
ARM9 | ARM v5 |
ARM11 | ARM v6 |
Cortex-A | ARM v7-A |
Cortex-R | ARM v7-R |
Cortex-M | ARM v7-M |
Прежде чем мы сможем погрузиться в разработку эксплойтов для ARM, нам сначала нужно понять основы программирования на языке ассемблера, для чего требуются некоторые базовые знания, прежде чем вы сможете начать их ценить.Но зачем нам вообще сборка ARM, разве недостаточно писать эксплойты на «нормальном» языке программирования / сценариев? Это не так, если мы хотим иметь возможность выполнять обратный инжиниринг и понимать программный поток двоичных файлов ARM, создавать собственный шелл-код ARM, создавать цепочки ARM ROP и отлаживать приложения ARM.
Вам не нужно знать каждую мелочь о языке ассемблера, чтобы иметь возможность выполнять обратный инжиниринг и разработку эксплойтов, но некоторые из них необходимы для понимания более широкой картины.Основы будут рассмотрены в этой серии руководств. Если вы хотите узнать больше, вы можете посетить ссылки, перечисленные в конце этой главы.
Так что же такое ассемблер? Язык ассемблера — это всего лишь тонкий слой синтаксиса поверх машинного кода, который состоит из инструкций, закодированных в двоичных представлениях (машинный код), что и понимает наш компьютер. Так почему бы вместо этого просто не написать машинный код? Что ж, это было бы занозой в заднице. По этой причине мы напишем сборку ARM, которая намного проще для понимания людьми.Наш компьютер не может запускать ассемблерный код сам, потому что ему нужен машинный код. Инструмент, который мы будем использовать для сборки кода сборки в машинный код, — это GNU Assembler из проекта GNU Binutils с именем as , который работает с исходными файлами с расширением * .s.
После того, как вы написали файл сборки с расширением * .s, вам нужно собрать его с помощью as и связать с ld:
$ как program.s -o program.o $ ld program.o -o программа
Давайте начнем с самого низа и перейдем к языку ассемблера.На самом низком уровне у нас есть электрические сигналы в нашей цепи. Сигналы формируются путем переключения электрического напряжения на один из двух уровней, например, 0 вольт («выключено») или 5 вольт («включено»). Поскольку просто посмотрев, мы не можем легко определить, какое напряжение находится в цепи, мы предпочитаем записывать шаблоны включенных / выключенных напряжений, используя визуальные представления, цифры 0 и 1, чтобы не только представить идею отсутствия или присутствия сигнал, но также потому, что 0 и 1 — цифры двоичной системы. Затем мы группируем последовательность 0 и 1, чтобы сформировать инструкцию машинного кода, которая является наименьшей рабочей единицей процессора компьютера.Вот пример инструкции на машинном языке:
1110 0001 1010 0000 0010 0000 0000 0001
Пока все хорошо, но мы не можем вспомнить, что означает каждый из этих шаблонов (0 и 1). По этой причине мы используем так называемые мнемоники, сокращения, чтобы помочь нам запомнить эти двоичные шаблоны, где каждой инструкции машинного кода дается имя. Эти мнемоники часто состоят из трех букв, но это не обязательно. Мы можем написать программу, используя эту мнемонику в качестве инструкций.Эта программа называется программой на языке ассемблера, а набор мнемоник, который используется для представления машинного кода компьютера, называется языком ассемблера этого компьютера. Следовательно, язык ассемблера — это самый низкий уровень, используемый людьми для программирования компьютера. Операнды инструкции идут после мнемоники. Вот пример:
MOV R2, R1
Теперь, когда мы знаем, что программа сборки состоит из текстовой информации, называемой мнемоникой, нам нужно преобразовать ее в машинный код.Как упоминалось выше, в случае сборки ARM проект GNU Binutils предоставляет нам инструмент под названием как . Процесс использования ассемблера, такого как как , для преобразования из языка ассемблера (ARM) в машинный код (ARM) называется сборкой.
Таким образом, мы узнали, что компьютеры понимают (реагируют) на наличие или отсутствие напряжений (сигналов) и что мы можем представлять несколько сигналов в виде последовательности нулей и единиц (битов). Мы можем использовать машинный код (последовательности сигналов), чтобы заставить компьютер реагировать определенным образом.Поскольку мы не можем вспомнить, что означают все эти последовательности, мы даем им сокращения — мнемоники и используем их для представления инструкций. Этот набор мнемоник является языком ассемблера компьютера, и мы используем программу под названием Assembler для преобразования кода из мнемонического представления в машиночитаемый машинный код так же, как это делает компилятор для языков высокого уровня.
HYMN Assembler Tutorial
HYMN Assembler Tutorial PGSS Ядро компьютерных наук КурсПРИМЕЧАНИЕ: Эта страница устарела и заменена новый, значительно усовершенствованный ассемблер.Подробности смотрите на его странице.
Для большего опыта работы с языком ассемблера, который мы обсуждали, мы есть HYMN Ассемблер. Этот ассемблер работает через Интернет, моделируя машина с помощью программы, написанной инструктором.
Как выглядит программа в HYMN Assembly?
АссемблерHYMN описан в таблице на стр. 17 примечания к курсу с примером программы на стр. 18. Эта программа, которая проверяет простоту ввода, является текстом по умолчанию при вводе ассемблер.
Программа немного изменена под этот ассемблер. Вещи существенно проще с возможностью давать имена строкам. Таким образом, когда мы ответвляемся, мы можем перейти к значимому месту; адрес 00011110, одна из строк на странице 18, просто не так описательный как NOTPRIME. Что еще более важно, с метками линий нам не нужно переписывать каждую инструкцию ветвления в программе, просто чтобы вставить новую строку.
Чтобы обозначить строку, начните ее с подписи в круглых скобках. (« (НЕПРАЙМ) LR R0, 0 »).Затем мы можем перейти к этой строке с инструкцией « BLESS R3, (NOTPRIME) ». Это демонстрируется на примере программы простоты ниже.
Ассемблер автоматически нумерует строку с адресами памяти. с шагом 0 и увеличением на 2 (поскольку HYMN имеет двухбайтовые слова) каждая строка. Эта нумерация для вас невидима. (Однако это означает, что программы ограничены 64 строками, так как n должно быть в памяти место 128.)
Вот снова текст программы.Построчное описание на странице 18 примечаний.
LR R0, 2 LR R1, 1 LRA R2, 10000000 SUB R3, R2, R0 БЛАГОСЛОВЕНИЕ R3, (НЕ ПРАЙМ) BEQUAL R3, (ISPRIME) (СЛЕДУЮЩИЙ) РАЗДЕЛ R3, R4, R2, R0 BEQUAL R4, (НЕ ПРАЙМ) ДОБАВИТЬ R0, R0, R1 МУЛЬТ R3, R0, R0 SUB R3, R3, R2 БЛАГОСЛОВЕНИЕ R3, (СЛЕДУЮЩИЙ) BEQUAL R3, (НЕ ПРАЙМ) (ISPRIME) LR R0, 1 B (ENDPROG) (НЕПРАЙМ) LR R0, 0 (ENDPROG) МАГАЗИН 10000010, R0(Здесь исправлено несколько ошибок в тексте.В тексте есть BZERO в строке 00001010, который должен быть BEQUAL. И второй и третий аргументы первой СУБ инструкция (строка 00000110) меняются местами.)
Как пользоваться ассемблером?
Чтобы запустить программу, перейдите в HYMN Assembler. Измените программу появляется в разделе « Программа ». Входные данные программы — одно целое число, который вы можете установить в поле под названием « Значение для проверки ( n ) ». Это установит для ячейки памяти 128 это значение. когда программа запущена.
Для записи доступна только одна ячейка памяти.Это ячейка памяти 130, называемая dest . Намерение состоит в том, чтобы программа поместит 1 в dest , если n простое и 0 в противном случае.
Чтобы отладить программу, установите флажок « Печать отладки выход». Это напечатает состояние HYMN перед выполнением каждого инструкция. Строка отладочного вывода содержит 10 столбцов. Первый сообщает, сколько тактов прошло с начала. Вторая — это номер строки (нумерация от 1 с шагом 1), которая вот-вот будет казнен.Следующие восемь полей содержат содержимое восемь регистров.
Если в программе есть проблема, ассемблер выдаст строку номер, в котором возникла проблема (нумерация от 1 с шагом 1) и краткое описание проблемы. Если вы нашли сообщение об ошибке непонятно, попросите друга или специалиста по интерпретации или напишите инструктору по электронной почте.
Наслаждайтесь программированием на ассемблере!
Учебное пособие по простому 8-битному симулятору ассемблера на Javascript · GitHub
Здравствуйте! Это учебное пособие по простому 8-битному симулятору ассемблера на Javascript.
CPU
В ЦП хранится несколько фрагментов памяти, которые называются регистрами . В этом случае эти регистры содержат один байт (8 бит) памяти. Таким образом, в любой момент времени каждый из этих 8-битных регистров хранит одно значение от 0
до 255
или от $ 00
до $ FF
в шестнадцатеричном формате.
Этот ЦП также имеет внутри несколько фрагментов памяти, называемых флагами , каждый из которых содержит один бит памяти и используется для представления логических значений.Таким образом, в любой момент времени каждый из этих 1-битных флагов имеет значение либо ИСТИНА
, либо ЛОЖЬ
.
Эти регистры и флаги вместе составляют внутреннее состояние ЦП в любой момент времени и имеют различные цели, которые вы увидите!
Этот процессор имеет четыре регистра общего назначения , которые называются A , B , C и D . Они называются универсальными, потому что программист сам решает, как их использовать.Часто бывает удобно и даже необходимо иметь временное пространство для хранения значений, которыми управляют, и именно здесь эти регистры пригодятся.
Этот ЦП также имеет два регистра специального назначения , называемых указателем инструкции ( IP ) и указателем стека ( SP ). Они называются указателями , потому что они содержат значение, которое представляет местоположение в ОЗУ. То есть они указывают на место в памяти.
Указатель инструкции указывает на следующую программную инструкцию в памяти, которая должна быть выполнена, а указатель стека указывает на текущую вершину стека (подробнее об этом позже).
Этот процессор имеет три флага, называемых нулевым флагом ( Z ), флагом переноса , ( C ) и … честно говоря, я понятия не имею, для чего здесь используется флаг F . XD Так что давайте пока просто проигнорируем это. Эти флаги используются для хранения результатов выполнения различных операций.Программист может прочитать эти результаты и использовать их, чтобы решить, что делать дальше. Например, при вычитании двух чисел нулевой флаг устанавливается на ИСТИНА
, если результат равен 0. Точное использование этих флагов зависит от инструкции, поэтому мы вернемся к этому позже.
Память
К этому смоделированному ЦП прикреплен блок из 256 байтов ОЗУ. Каждый из этих байтов расположен в порядке от верхнего левого угла к нижнему правому и имеет назначенный номер, который является адресом памяти этого байта.Например, на снимке экрана значение в ячейке памяти $ 00
равно $ 1F
, а значение в ячейке памяти $ 12
равно $ 06
. Программист может проинструктировать ЦП читать и записывать байтовые значения в каждый адрес памяти и из него в произвольном порядке (отсюда и название «память с произвольным доступом»).
Вход / выход
На самом деле, этот смоделированный ЦП не имеет средств ввода, но имеет некоторую форму вывода: 24-ячеечный символьный дисплей ASCII!
Этот простой символьный дисплей просто отображает символы, соответствующие закодированным значениям ASCII, присутствующим в определенной части памяти, а именно в ячейках памяти от $ E8
до $ FF
.Это пример IO с отображением в память , что означает, что к некоторой форме ввода и / или вывода системы можно получить доступ путем чтения или записи в определенные места в памяти.
Программы
Программа представляет собой последовательность инструкций , которые инструктируют ЦП, что делать. Большинство вызовов состоят из операции и одного или нескольких операндов в зависимости от операции.
Операция похожа на функцию, встроенную в ЦП и предоставленную программисту для использования сразу.У каждой операции есть краткое запоминающееся название — мнемоника . В письменном ассемблере операции обозначаются этой мнемоникой.
Операнд подобен аргументу операции. Операнд может относиться к регистру ЦП, месту в памяти или буквальному значению.
В конечном итоге ЦП понимает только числа. Когда вы нажимаете кнопку «Собрать», ассемблерный код преобразуется в числовое представление программы под названием машинный код и затем помещается в память.
Помимо мнемоники, каждая операция имеет связанное числовое представление, называемое кодом операции . Между каждой мнемоникой и каждым кодом операции существует взаимно однозначная корреляция. Когда инструкция собирается в машинный код, мнемоники систематически заменяются соответствующими кодами операций.
Режимы адресации
Режим адресации — это способ обращения к фактическому значению, используемому в качестве операнда.
Немедленная адресация — это когда значение задается сразу после задания операции.Это называется немедленной адресацией, потому что закодированное значение помещается сразу после кода операции в машинном коде.
Прямая адресация — это когда используемое значение находится где-то в памяти. Вместо прямого указания значения вместо него указывается адрес значения в памяти. Это называется прямой адресацией в отличие от косвенной адресации .
Косвенная адресация — это когда используемое значение находится где-то в памяти, а адрес этого значения — , также расположен где-то в памяти.Вместо того, чтобы указывать значение напрямую, или , определяя адрес значения в памяти, указывается адрес адреса . Это называется косвенной адресацией, потому что … ну … она скорее косвенная, вам не кажется. XD Он используется реже, чем другие, но все же полезен в ситуациях, когда вы заранее не знаете, где находится значение.
Стек
Стек — это структура данных, которая выглядит как физический стек элементов. Это структура LIFO (last in first out), означающая, что первое, что вы получаете из стека, — это последнее, что вы вставляете.Представьте себе стопку блоков. Единственный блок, который вы можете снять с вершины стека, — это последний блок, который был помещен поверх него.
Стек в памяти реализован как последовательность значений, составляющих элементы в стеке, плюс указатель стека . Указатель стека — это указатель, который всегда указывает на то, что считается вершиной стека .
Каждый раз, когда вы хотите, чтобы поместил элемент в стек (другими словами, поместите новый элемент поверх стека), вы просто копируете значение в место в памяти, на которое указывает указатель стека, а затем вы увеличить (или уменьшить, в зависимости от того, в каком направлении растет стек ) указатель стека, чтобы указать на следующее свободное пространство, место прямо над элементом, который вы только что добавили в стек.
Каждый раз, когда вы хотите, чтобы вытолкнул элемент из стека (другими словами, удалите последний элемент, который был помещен в верхнюю часть стека), вы просто перемещаете указатель стека назад вниз. Если вам нужно только что выдвинутое значение, просто укажите значение в памяти, на которое теперь указывает указатель стека.
Этот процессор имеет единственный встроенный стек! Указатель стека этого встроенного стека содержится в собственном регистре указателя стека ЦП. В этом случае стек растет вниз на , и когда ЦП сбрасывается, указатель стека инициализируется на $ E7
, что означает, что нижняя часть стека расположена в ячейке памяти $ E7
.Но эти детали не важны для фактического использования стека.
ЦП обеспечивает операции PUSH
и POP
, которые позволяют вставлять и вставлять значения в стек и из него. Программист должен решать, как использовать стек, но обычно используются для временного сохранения значений, для передачи аргументов между функциями или для отслеживания адресов возврата (подробнее об этом позже).
Выполнение программы
Когда ЦП работает, он функционирует, выполняя инструкции в памяти одну за другой.Сначала он ищет инструкцию в памяти, на которую указывает указатель инструкции. Это включает в себя код операции, а также любые значения байтов операнда, которые могут следовать в зависимости от операции. Затем он выполняет эту инструкцию, возможно, влияя на внутреннее состояние ЦП и / или содержимое памяти. Наконец, указатель инструкции устанавливается в положение, следующее сразу за только что выполненной инструкцией, и процесс продолжается.
Когда CPU сбрасывается, указатель инструкции устанавливается в 0, что означает, что первая выполняемая инструкция — это инструкция, расположенная в самом начале памяти.Когда CPU запущен, он будет продолжать работать до тех пор, пока не встретит команду halt ( HLT
), после чего он остановится. В качестве альтернативы вы можете выполнять по одной инструкции за раз (так называемый шаг ).
Язык ассемблера
Инструкция написана на языке ассемблера, начиная с мнемоники, за которой следуют любые операнды, разделенные запятыми.
Литеральные значения можно использовать в качестве операндов, просто включив числовое значение или символ ASCII, заключив его в одинарные кавычки.Это немедленное обращение.
Содержимое регистров ЦП можно использовать в качестве операндов, просто записав имя регистра ЦП. Например, A
относится к регистру A.
Значения, присутствующие в памяти, можно использовать в качестве операндов, заключив другое значение в [
и ]
. Например, значение по адресу памяти $ 20
можно использовать в качестве операнда, записав [$ 20]
. Это прямая адресация.
Вы также можете поместить имя регистра между [
и ]
, чтобы использовать его в качестве операнда для значения в памяти, расположенного по адресу, содержащемуся в этом регистре.Например, если регистр A содержит $ 5
, тогда [A]
относится к значению, находящемуся в памяти по адресу $ 5
.
Вместо того, чтобы явно указывать адреса памяти, гораздо более распространено и удобно использовать метки для отметки ячеек памяти в программном коде. Вы можете разместить метку в коде сборки, чтобы отметить собранный адрес того, что следует сразу, написав имя, за которым следует двоеточие. Например, начало:
создает метку под названием «начало».Затем вы можете использовать имя start
в любом другом месте программы вместо адреса памяти, чтобы ссылаться на это место в коде.
Вы можете включать произвольные данные в свою программу с помощью директивы DB
. Это означает байт данных и не является мнемоникой для операции ЦП, а скорее инструктирует ассемблер включить некоторые двоичные данные в этот момент, а не собирать там код. Это полезно для включения предопределенных постоянных значений в вашу программу.
Наконец, комментарии на ассемблере обычно помечаются точкой с запятой.
Привет, мир!
Пройдемся по Привет, мир! пример!
Для справки вот пример кода из симулятора:
; Простой пример ; Записывает Hello World на вывод JMP начало привет: БД "Hello World!" ; Переменная DB 0; Терминатор строки Начало: MOV C, привет; Укажите на var МОВ Д, 232; Укажите на вывод ЗВОНИТЕ печать HLT; Остановить выполнение Распечатать: ; print (C: * от, D: * до) НАЖАТЬ А НАЖАТЬ B MOV B, 0 .петля: MOV A, [C]; Получить char из var MOV [D], A; Записать на вывод INC C INC D CMP B, [C]; Проверить если конец JNZ .loop; прыгать, если нет POP B POP A RET
Как упоминалось ранее, когда CPU сбрасывается, указатель инструкции устанавливается в 0, что означает, что начало программы находится в начале файла. Итак, первая инструкция в программе такая:
Операция JMP
просто устанавливает указатель инструкции на свой операнд. То есть переходит на в заданное место в памяти и продолжает выполнение программы оттуда.В данном случае операндом является начало
, которое представляет собой метку, обозначающую эту часть кода:
начало: MOV C, привет; Укажите на var МОВ Д, 232; Укажите на вывод ЗВОНИТЕ печать HLT; Остановить выполнение
После выполнения прыжка следующая инструкция будет такой:
MOV C, привет; Укажите на var
Команда MOV
копирует свой второй операнд в место, описанное его первым операндом. То есть перемещает данных.В этом случае второй операнд — hello
, а первый операнд — C
. Это означает, что адрес памяти, помеченный меткой hello
, копируется в регистр C. привет
отмечает это в коде:
привет: БД "Hello World!" ; Переменная
Это необработанная строка «Hello World!» который будет напечатан. Итак, теперь регистр C содержит расположение строки, которую мы собираемся распечатать. Другими словами, регистр C указывает на строку.
Следующая инструкция — еще одна MOV
:
МОВ Д, 232; Указать на выход
Это помещает значение 232
в регистр D. 232
( $ E8
в шестнадцатеричной системе счисления) — это адрес в памяти отображаемого в память отображения символьного вывода. Итак, если мы запишем строку в память, начиная с этого места, она отобразится на нашем дисплее.
Напомним, что на этом этапе выполнения регистр C указывает на строку, которую мы хотим отобразить, а регистр D указывает на саму память отображения.Все, что нам нужно сделать сейчас, это скопировать строку, на которую указывает C, в место, указанное D.
Следующая инструкция — это вызов нашей функции печати:
Операция CALL
очень похожа на операцию JMP
в том, что она также переходит в другое место в памяти для продолжения выполнения. Единственное отличие состоит в том, что перед прыжком он помещает текущее значение указателя инструкции в стек. Ячейка памяти, на которую был произведен переход, должна быть началом функции (также называемой подпрограммой на языке ассемблера).
Обычно последняя инструкция в функции — это инструкция RET
. Операция RET
, как вы уже догадались, возвращает из функции. Он делает это, устанавливая указатель инструкции на адрес возврата, полученный при извлечении его из стека. Это возможно, потому что операция CALL
подталкивает адрес возврата перед переходом к функции.
Существует несколько способов передачи аргументов функциям на языке ассемблера.Здесь это делается путем предварительной загрузки регистров ЦП значениями для передачи функции. В этом случае наша функция печати принимает два аргумента: указатель на строку для печати и указатель на место в памяти для ее печати. Ожидается, что эти аргументы будут передаваться через регистры C и D соответственно. Вот почему мы ранее загружали эти регистры этими значениями!
Итак, в этом случае он вызывает функцию, помеченную меткой print
, поэтому адрес возврата помещается в стек, а затем указатель инструкции устанавливается на начало функции печати, и мы продолжаем оттуда.
Первая пара инструкций в функции печати выглядит так:
Это типичный пролог функции . Пролог функции — это некоторый начальный код в функции, который подготавливает стек и регистры ЦП к использованию.
В этом случае мы помещаем регистры A и B в стек, чтобы сохранить их значение. Мы делаем это, потому что тело этой функции будет повреждать содержимое этих регистров. Сохраняя сначала их значения, мы можем восстановить их перед возвратом из программы.Таким образом, любая часть кода, вызывающая эту функцию, не должна беспокоиться о том, что содержимое каких-либо регистров будет изменено после вызова функции.
После нажатия мы также инициализируем регистр B, чтобы он содержал значение 0
. Вы скоро поймете, почему.
После пролога функции первым делом в теле нашей функции будет цикл :
. Петля: MOV A, [C]; Получить char из var MOV [D], A; Записать на вывод INC C INC D CMP B, [C]; Проверить если конец JNZ.петля ; прыгать если не
Метка .loop
отмечает начало цикла. (Не беспокойтесь о точке в начале имени. Это просто обычный способ обозначения локальных меток , меток, релевантность которых ограничена некоторой локализованной частью кода. Например, у вас может быть много циклов в вашей программе , ни один из которых не должен ссылаться друг на друга, и вы можете не захотеть давать каждому циклу уникальное имя.)
Я заранее скажу вам, что делает этот цикл: он копирует каждый символ из исходной строки в место назначения.
Поскольку C в настоящее время указывает на исходную строку, первое, что нужно сделать, это захватить первый символ, символ по адресу указателя:
MOV A, [C]; Получить char от var
Копирует значение из памяти, на которое указывает содержимое регистра C, в регистр A.
Следующим шагом является копирование этого извлеченного символа на выходной дисплей, на который в настоящее время указывает регистр D:
MOV [D], A; Запись на выход
Копирует символ (в A) в память, на которую указывает D.
Теперь, когда мы успешно скопировали первый символ в выходной дисплей, пора перейти к следующему! Для этого нам просто нужно увеличить указатели источника и назначения на единицу, чтобы мы могли извлечь следующий символ из исходной строки и записать его в следующую ячейку в отображении символов. Операция INC
делает именно это, она увеличивает содержимое регистра на единицу:
На этом этапе мы могли бы просто использовать операцию JMP
, чтобы вернуться к началу цикла на .цикл
, чтобы скопировать остальные символы. Единственная проблема с этим состоит в том, что это приведет к созданию бесконечного цикла , поскольку не будет никакого способа узнать, чтобы остановиться, когда будет достигнут конец строки.
Вместо этого нам нужен способ вернуться к началу цикла только в том случае, если мы не закончили копирование строки. Кроме того, нам нужен способ узнать, закончили ли мы копирование строки или нет. Мы знаем это, помечая конец строки нулевым символом конца строки , который представляет собой байтовое значение 0
, помещенное непосредственно после строки в памяти.Вот почему за строковым значением в программе следует DB 0
:
привет: БД "Hello World!" ; Переменная DB 0; Терминатор строки
Теперь все, что нам нужно сделать, это проверить, является ли следующий символ 0
, прежде чем продолжить цикл. Если это не 0
, вернитесь к началу цикла. Если это 0
, то мы закончили, продолжаем выполнение программы после цикла.
Чтобы проверить, является ли следующий символ 0
, мы можем использовать операцию CMP
:
CMP B, [C]; Проверить, не закончился ли
Операция CMP
сравнивает его два операнда и соответственно устанавливает флаги ЦП.В нашем случае все, что нам нужно знать, это то, что если два операнда численно равны, нулевой флаг устанавливается на ИСТИНА
. (Логика заключается в том, что для сравнения двух чисел операция CMP
внутренне вычитает второе из первого, и если результат 0
, он устанавливает нулевой флаг. Конечно, разница составляет 0
означает, что два операнда эквивалентны.)
В этом случае нулевой флаг устанавливается на ИСТИНА
, если следующим символом в строке является 0
.(Помните, мы просто увеличили содержимое C, чтобы указать на следующий символ в строке, а в прологе функции мы инициализировали B как 0
. Это причина, по которой мы это сделали!)
Наконец, мы используем операцию JNZ
, чтобы вернуться к началу цикла , только если для нулевой флаг был установлен на ИСТИНА
:
Операция JNZ
аналогична операции JMP
, за исключением того, что она выполняет переход только в том случае, если нулевой флаг в настоящее время равен FALSE
.Другими словами, это (j) umps if (n) ot (z) ero . Если нулевой флаг в настоящее время равен FALSE
, то вообще ничего не происходит, и программа продолжает выполнение следующей инструкции.
Что в данном случае является эпилогом функции ! Эпилог функции является аналогом пролога функции. Здесь регистры стека и процессора подготовлены к возврату из функции. В нашем случае мы просто восстанавливаем ранее сохраненные значения регистров A и B, чтобы та часть кода, которая изначально вызывала эту функцию, не знала, что регистры A и B вообще использовались.Это важно, если вызывающий код использует A и B для собственных целей:
Наконец, мы возвращаем из функции с помощью операции RET
, которая, как упоминалось ранее, выталкивает адрес возврата из стека, который был первоначально выдвинут соответствующей инструкцией CALL
, а затем помещает этот выдвинутый адрес обратно в регистр указателя инструкций.
Самая последняя инструкция нашей программы — это инструкция HLT
:
Команда HLT
останавливает CPU, отмечая конец выполнения программы.
Обзор AVR и их оборудование | |||
---|---|---|---|
Симулятор для AVR код ассемблера | |||
Курсы ассемблера для начинающих в различных вариантах | по видам инструкций аппаратное и программное обеспечение для высокоуровневых уродов | ||
Что такое AVR? Для абсолютных новичков | |||
Изучение приложений | |||
71456 загрузок файлов исходного кода ассемблера в 2020 г. (195 в день) | |||
Четыре самых популярных приложения: Чтение клавиш клавиатуры Счетчик частоты Генератор сигналов Драйвер шагового двигателя ATtiny13 | Четыре последних добавленных приложения: Длинный таймер с динамиком Duo-LED + и ATtiny25 Длинный таймер с Duo-LED и ATtiny13 Генераторы синусоидальной волны с сетями R / 2R Выпрямитель AM с ATtiny25 | ||
Использование внутреннего оборудования контроллера компоненты в исходных кодах ассемблера на этом веб-сайте | Программные алгоритмы на ассемблере исходники на сайте | ||
Обучающий ассемблер | |||
Введение для начинающих на язык ассемблера AVR.Также доступен в виде полного PDF-документа для печати всего курса (Скачать, 1,1 МБ) | Микро-курс для начинающих из 14 лекций от простого к сложному с ATtiny13 и ATtiny24, аппаратным и программным обеспечением, все на макете, также доступно в один полный документ PDF | ||
Начальный курс для начинающих, знакомящий с аппаратное обеспечение AVR (в основном ATtiny24) и их программное программирование на ассемблере в 11 лекциях использует тренажер для визуализации эффектов | Начальный курс для начинающих использование симулятора для изучения эффекта инструкций ассемблера, также доступен в формате PDF | ||
Введение в двоичные числа и двоичную математику с практическими примерами кода для сложения, вычитания, умножения и деления двоичных номера любого размера | Четыре простых примера программирования с расширенными комментариями в качестве первых шаги практического введения в программирование на ассемблере: Смысл и требования, Примеры простого программирования | ||
Software-Know-How, специальный ассемблер команды: LPM, скачки стека, макросы | Все о временных петлях от микросекунд от миллисекунд и секунд до часов, дней и месяцев: все, что вам нужно, это петлю, или две, или три… | ||
Все, что вам нужно знать о прерываниях для новички, в векторах int, источниках int, выполнении int и том, как управляют int весь дизайн программы, целый новый мир, чтобы узнать о | У вас есть один, вы его используете, чувствуете зависимость? если ты хотите избавиться от препарата Arduino, вы получите помощь, чтобы избавиться от этого здесь. | ||
Инструменты для программирования на ассемблере | |||
Ассемблер командной строки с расширенной проверкой ошибок и комментированием, бесплатно для скачивания | Для удобной работы ассемблера командной строки: оконный вызывающий включая редактирование исходных и включаемых файлов, просмотр файла списка, поиск ошибок и редактирование ошибочных строк и т. д., бесплатно скачать здесь | ||
Как собрать файлы внешнего исходного кода Как преобразовать исходный код из одного в другой типа | Программное обеспечение Windows для генерации ассемблера файлы исходного кода со стандартной структурой | ||
Расширенное программирование на ассемблере | |||
Двоичное умножение, деление, преобразование подробно о числовых форматах и фиксированных десятичных дробях, аппаратное умножение | Программирование и тестирование аппаратной части Плата STK200: EEPROM, внешняя RAM, LCD-дисплей, SIO-интерфейс | ||
Приложения в ассемблере | |||
Малые приложения: ИК-устройства дистанционного управления, матрица 8 на 8 светодиодов, синхронизированные часы DCF77, декодер PCM-to-PWG, генератор частоты с терминальным управлением, цифровой генератор сигналов с регулировкой частоты / ширины импульса и ЖК-дисплеем, таймер в подарок, контроллер / драйвер шагового двигателя, акробатическая игральная кость, светодиодный секвенсор и регулятор интенсивности | Подключение двухстрочного ЖК-дисплея к четырехстрочному подключение к плате программирования STK500 с базовыми подпрограммами для управление ЖК-дисплеем и приложение для небольших часов | ||
Преобразование аналогового напряжения в цифровое с помощью платы STK500, встроенного аналогового компаратора и таймера / счетчика 1 как генератор ширины импульса | Подключение клавиатуры к AVR и зондирование с использованием соединений портов или с помощью резисторной матрицы и AD конвертер.Улучшенные версии резисторного матричного энкодера и графического там же предоставляются программные инструменты. | ||
Преобразование цифрового значения в аналоговое напряжение с помощью сеть с буферизацией R / 2R, включая генерация волн, таких как пилообразные, треугольные, синусоидальные формы и небольшой приложение для тонального плеера. Со страницами расчета фильтров R / 2R и RC и программные инструменты. | Погрузчик Accu с ATmega16 | ||
Архивированная веб-страница для чтения в автономном режиме | Вся веб-страница для скачивания, упаковано примерно 25 МБ.После загрузки распакуйте этот файл в отдельный каталог, в котором хранятся пути. | ||
Статистика на этой странице | Статистика посещений веб-сайтов, исходный код на этих страницах и частоты использования для инструкций и директив в исходном коде ассемблера |
Ассемблер введен для предоставления мнемоник или символов для команд машинного кода.Программа на языке ассемблера состоит из мнемоники, которая переводится в машинный код. Программа, которая используется для этого преобразования, известна как ассемблер . Ассемблер также называется языком низкого уровня, потому что он напрямую работает с внутренней структурой ЦП. Для программирования на языке ассемблера программист должен знать все регистры центрального процессора. Различные языки программирования, такие как C, C ++, Java и другие языки, называются языками высокого уровня, потому что они не имеют отношения к внутренним деталям ЦП. Сборка и запуск программы 8051Давайте посмотрим, как создать, собрать и запустить программу на ассемблере:
Ярлыки на ассемблере ЯзыкВсе метки, используемые на языке ассемблера, подчиняются определенным правилам, приведенным ниже:
|
Java | Универсальный, параллельный, основанный на классах, объектно-ориентированный язык высокого уровня |
C | Универсальный, процедурный, переносной, язык высокого уровня |
Python | Универсальный, структурированный, мощный язык |
C ++ | Универсальный, переносимый, произвольный, многопарадигмальный язык |
C # | Сочетает в себе мощность и гибкость C ++ с простотой Visual Basic |
JavaScript | Интерпретируемый, на основе прототипов, язык сценариев |
PHP | PHP был у руля Интернета в течение многих лет |
Ruby | Универсальный, скриптовый, структурированный, гибкий, полностью объектно-ориентированный язык |
Сборка | Максимально близко к написанию машинного кода без записи в чистом шестнадцатеричном формате |
Swift | Мощный и интуитивно понятный язык программирования общего назначения |
Groovy | Мощный, опционально типизированный и динамический язык |
Go | Скомпилированный статически типизированный язык программирования |
Паскаль | Императивный и процедурный язык, разработанный в конце 1960-х годов |
Perl | Высокоуровневый, универсальный, интерпретируемый, скриптовый, динамический язык |
R | Фактический стандарт для статистиков и аналитиков |
COBOL | Общий бизнес-ориентированный язык |
Scala | Современный, объектно-функциональный, многопарадигмальный язык на основе Java |
Fortran | Первый язык высокого уровня, использующий первый компилятор |
Scratch | Визуальный язык программирования для детей 8-16 лет |
Lua | Разработан как встраиваемый язык сценариев |
Logo | Диалект Lisp, который отличается интерактивностью, модульностью и расширяемостью |
Rust | Идеально подходит для систем, встраиваемых систем и других систем, критичных к производительности. Код |
Lisp | Уникальные особенности — отлично подходят для изучения конструкций программирования |
Ada | АЛГОЛ-подобный язык программирования, расширенный от Pascal и других |
Haskell | Стандартизированный, универсальный, полиморфно, статически типизированный язык |
Схема | Универсальный функциональный язык, унаследованный от Lisp и Algol |
Prolog | Декларативный язык логического программирования общего назначения |
Forth | Императивный язык программирования на основе стека |
Clojure | Диалект языка программирования Lisp |
Julia | Высокопроизводительный язык высокого уровня для технических вычислений |
SQL | Доступ и управление данными, хранящимися в системе управления реляционной базой данных |
Erlang | Универсальный, параллельный, декларативный, функциональный язык |
VimL | Мощный скриптовый язык редактора Vim |
OCaml | Универсальный, мощный язык высокого уровня |
Awk | Универсальный язык, разработанный для сканирования и обработки шаблонов |
Racket | Платформа для разработки и реализации языков программирования |
BASIC | Семейство универсальных языков программирования высокого уровня |
CoffeeScript | Очень лаконичный язык программирования, который транскомпилируется в JavaScript |
LaTeX | Профессиональная система подготовки документов и язык разметки документов |
Elixir | Относительно новый функциональный язык, работающий на виртуальной машине Erlang |
Dart | Оптимизированный для клиента язык программирования для быстрых приложений |
ABAP | Расширенное программирование бизнес-приложений |
F # | Универсальный, строго типизированный, мультипарадигмальный язык.Часть ML |
Chapel | Язык параллельного программирования, разрабатываемый в Cray Inc. |
Dylan | Многопарадигмальный язык, поддерживает функциональное и объектно-ориентированное программирование |
D | Язык системного программирования общего назначения с синтаксисом типа C |
Solidity | Объектно-ориентированный язык высокого уровня для реализации смарт-контрактов |
XML | Набор правил для определения семантических тегов, описывающих структуру и значение |
Vala | Объектно-ориентированный язык с автономным компилятором, который генерирует код C |
ECMAScript | Наиболее известен как язык, встроенный в веб-браузеры |
Kotlin | Статически типизированный язык программирования общего назначения с выводом типа |
TypeScript | Строгий синтаксический надмножество JavaScript, добавление дополнительной статической типизации |
Markdown | Синтаксис форматирования обычного текста, предназначенный для удобства чтения и записи |
Pike | Интерпретируемый, универсальный, высокоуровневый, кроссплатформенный, динамический язык |
HTML | Язык разметки гипертекста |
Фактор | Динамический стековый язык |
Objective-C | Язык общего назначения, который является надмножеством C |
Standard ML | Один из двух основных диалектов языка ML |
Алиса | Образовательный язык с интегрированной средой разработки |
Agda | Функциональный язык с зависимой типизацией, основанный на интуиционистской теории типов |
Значок | Язык высокого уровня общего назначения |
PureScript | Маленький строго статически типизированный язык с выразительными типами |
Tcl | Динамический язык, основанный на концепциях оболочек Lisp, C и Unix |
Eiffel | Объектно-ориентированный язык |
ClojureScript | Компилятор для Clojure, ориентированный на JavaScript |
QML | Иерархический декларативный язык для макета пользовательского интерфейса с синтаксисом JSON |
VHDL | Очень высокоскоростная интегральная схема Язык описания аппаратного обеспечения |
OpenCL | Язык открытых вычислений |
Elm | Функциональный язык, компилируемый в JavaScript |
Haml | Язык разметки абстракции HTML |
J | Язык программирования массивов на основе APL |
LabVIEW | Предназначен для того, чтобы специалисты в данной области могли быстро создавать системы питания |
Hack | Для виртуальной машины HipHop (HHVM), созданной как диалект PHP |
Imba | Полностековый язык, который компилируется в высокопроизводительный JavaScript |
V | Статически типизированный компилируемый язык для создания поддерживаемого программного обеспечения |