LINUX.ORG.RU

Изучение assembler для самых маленьких

 ,


1

7

Ситуация такая: в программировании я шарю чуть больше, чем никак, да и о том, как внутри компа все устроенно, примерно так же. И вот стукнуло в мою больную голову программировать на ассемблере, подобрал FASM.

Но вот проблема, так как я почти ничего не знаю, не могу понять с чего надо подступиться к этому делу. Голова пустая, но она хочет научиться

Подходи к вопросу так, как подходил бы к любому другому совершенно новому для тебя делу.
Думаешь ассемблер чем-то отличается от варки супа?
А вообще — найди старую книжку времен 086-286 (обратная совместимость у современных х86 ещё есть, а на старых процах ассортимент команд был меньше, да и с разрядностью меньше возни) и почитай. Там всё ОЧЕНЬ просто. Это самый простой язык из всех возможных.

ZweiStein ()

в программировании я шарю чуть больше, чем никак

Не знаю как сейчас, но я в свое время пошел в книжный, и начал перебирать книжки по так заинтересовавшему меня программированию. Смотрел, какая мне понравится, станет более всех понятна. Остановился на авторе Культин, что-то там про Pascal. После уже, когда первые программы запустились, ассемблер не обошел меня своим вниманием: Юров, что-то там про ассемблер.

Но там было прочитано еще куча всякого, и устройство уже устаревших тогда IBM XT, и документация по VESA, и электронная документация по x86 то ли techdoc, то ли techbook. Интернетов не было, и все это собиралось по переходящим дискетам в сборниках всяких хакерских тулзов, позже - на CD для «хакеров».

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

Deleted ()
Ответ на: комментарий от Naurim

Мне интересно, какие базовые знания должны быть перед началом обучения.

Никаких. Ассемблер являет собой довольно высокий уровень абстракции и программисту ничего не нужно знать узкоспециального программистского и уж тем более инженерно-электронного. Можно сразу переходить к практике.

ZweiStein ()
Ответ на: комментарий от Naurim

какие базовые знания должны быть перед началом обучения

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

Для меня такой перевернувший сознание программой был передранный из какой-то книжки и измененный BAT-скрипт, выводящий список DOS-игр, распаковывающий нужную из arj архива, запускающий игру, подчищающий за собой. Да, места тогда было мало, и такой костылек был в высшей степени пользовательский.

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

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Naurim

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

ps: про деньги, кстати, тоже можешь забыть, как и про солнечный свет :D

Deleted ()
Последнее исправление: rj45 (всего исправлений: 1)

NASM мимимишечка и вполне актуален. Кроме того, по NASM вроде было довольно много релевантной информации в интернете.

FASM наверное получше в качестве макроассемблера (был) и куча примеров кода в комплекте идёт, но там совершенно нет того контроля, которого ты ожидаешь.

Но скажем в форках NASM можно писать в божественном AT&T-синтаксисе (не привыкай к тому ущербному другому, он только на первый взгляд лучше), поэтому либо он, либо gas. Хотя вопрос привычки конечно, но главное не слушай фанатиков и выбирай сам.

Всё равно тебя в конечном счёте только интринсики интересуют. :)

Если бы ты _уже_ умел в си, пользы было бы не в пример больше конечно. Как вариант, найди учебник в стиле «дос-ассемблер за час», за вечер раскуришь. Запускай в dosbox.

anonymous ()
Ответ на: комментарий от Naurim

Расскажу некоторый (свой) опыт, насчёт «Начинать изучение программирования с ассемблера»

Лет 14 назад имел минимальные знания pascal, и никак не мог толком въехать как же работают (или почему не работают) всякие штуки типа указателя на функцию и т.п. Потянуло на ассемблер. «Утонул» на несколько месяцев в книжках и в ассемблерных ide-шках (всё под дос).

Выхлоп получился следующий:

  • Минусы
    • Именно написанного функционала за несколько месяцев - на уровне того что пишется на С за 3 дня начинающим разработчиком. Как консольный калькулятор несколько месяцев писать.
    • На пару лет после этого и на других языках оставалась излишняя склонность писать слишком низкоуровневый код
  • Плюсы
    • Любой выученный язык со строгой типизацией (С,С++,С#, Java и проч. ) почти не приносит вопросов «а почему здесь так?», так как про любую конструкцию с лёгкостью понимаешь в какие именно команды ассемблера она компилируется/jit-ится (точнее эквивалентные каким, так как компилятор оптимизирует).
    • При отладке/профилировании частичные проблемы с отладочными символами на какой-то кусок кода - не вызывают проблем. Даже и с символами бывает что компилятор такого наоптимизирует, что приходится восстанавливать соответствие ассемблера логики программы.
    • Зачаточное развитие умения реверсинга - код размером порядка 500 байт можно отреверсить (то есть понять задуманную логику) даже не умея пользоваться продвинутыми инструментами типа radare2. Как-то отреверсил загрузочный сектор, который оффтопик пишет для fat))

Посему сложилось впечатление, то учиться писать код на ассемблере гораздо менее продуктивно, чем учиться читать код на ассемблере. Причём если по написанию большинство доступной литературы затрагивает лишь основы x86, существующие десятилетиями, то на чтение - хоть дизассемблируй что, хоть смотри что-нибудь низкоуровневое в ядре и т.п - вполне можно встретить и «новинки».

GPFault ()

Тебе это не нужно, выше были проявления адекватности, но не полные и зачастую с абсолютно неверными предпосылками и выводами.

Как правильно говорил пацаны выше - на ассемблере не нужно уметь писать. Это детский садик, который никому не нужен. Его нужно учится читать, но тут есть фундаментальная недосказанность.

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

Любые попытки что-то учить/понимать без этого навыка - целиком и полностью бесполезны. Этот навык является общий для любого вида деятельности.

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

В 99% случаев, если у тебя нет явно предрасположенности к подобному виду деятельности - тебе нет смысла охватывать всё поле «задача -> asm» сразу. Нужно начать хотя-бы с самого примитивного - решение на базе комбинаций готовых решений. Потом заменяешь одно решение своим, потом два, а потом все. К тому же каждое решение состоит из комбинации своих/чужих готовых решений, и цепочка подобного может быть очень длинной. И чем глубже ты в этом дереве решений, тем более ты умеешь в программирование.

Это и есть то самое программирование, без которого ты не сможешь ничего делать. Эта задача твоя основная, а всё остальное - уже детали.

LjubaSherif ()

Если хочешь изучить ассемблер, начинать с современного x86 — плохая идея. Куда лучше начать с 8051. Запускать на симуляторе (благо их много) или если совсем основательно подходить к проблеме — взять плату с отладчиком.

CYB3R ★★★★★ ()
Ответ на: комментарий от Naurim

Самый лучший вариант для изучения ассемблера - поставить MSDOS+NC и начать изучение, например, с книги Тома Свана «освоение турбо ассемблер». Там подробно и популярно все расписано.

Но учти, там графики практически нет. Про окна, немного в конце написано. Все остальное - консоль. Кстати - из-за этого, большинство бросает ассемблер через пару недель после начала изучения. Хотя очень зря. Пол-года практики на ассемблере, дадут нормальную базу для изучения, в дальнейшем, любого языка.

Учить ассемблер на современных ОС - последнее дело. Нормальной информации(с пояснениями и исходниками) найти практически невозможно. Даже если найдешь готовые исходники, без знания основ - замучаешься разбираться.

Виктор

maltsevvv ()

Я бы порекомендовал начать с этих двух статей:
1) http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
эта статья покажет какими командами создать простой ELF-файл для linux
2) http://asm.sourceforge.net/articles/startup.html
эта статья покажет, как парсить параметры командной строки и переменные окружения. В принципе этого уже достаточно, чтобы сделать CGI-приложение для web.
дальше есть варианты.
3.1) изучить сокеты для linux, многопоточность, разобраться с реализацией FastCGI
3.2) изучить программирование видеопроцессоров (SPIR-V), чисто теоретически это позволит писать быстрые расчёты чего-нибудь.
3.3) webassembly, javascript, webgl
это если хочется делать браузерные игры.
3.4) система команд в виртуальной машине из Ethereum (модно и блокчейно)
Казалось бы, какое отношение к ассемблеру имеют два последних пункта? Ну даже не знаю как объяснить, я так вижу.

Einstok_Fair ★★ ()
Ответ на: комментарий от maltsevvv

Вся эта общая информация про регистры написана в каждом учебном курсе (со ссылками с ключевыми словами Intel Instruction Set Architecture Manual), а конкретные важные практические вопросы, да ещё с привязкой к linux найти непросто. Даже в этой теме как только не изворачивались - и DOS советовали и Windows.

Einstok_Fair ★★ ()
Ответ на: комментарий от Einstok_Fair

В линуксе не принято писать на ассемблере. Потому что ты будешь дёргать си из своего говнокода (ядро, или libc, не важно) и делать это на порядки хуже чем есть уже с си. В досе есть сервисы биос на одном прерывании, и удобное управление графонием на другом, и кроме того у тебя полный прямой доступ к железкам. Жизнь никогда не была проще, чем с досом.

anonymous ()
Ответ на: комментарий от anonymous

Не мешай людям делать глупости, уникум. Они проживут счастливую жизнь, в отличии от тебя)

Эт точно. Только глупости добавляют смысла в мою унылую жизнь =))

Deleted ()
Ответ на: комментарий от anonymous

В досе есть сервисы биос на одном прерывании, и удобное управление графонием на другом

сисколлы линукса ну ничем не отличаются, та же загрузка в регистры, тот же вызов (ну другой, но это неважно).

В линуксе не принято писать на ассемблере.

Героя «не принято» остановит.

и кроме того у тебя полный прямой доступ к железкам.

Ненужно.

Жизнь никогда не была проще, чем с досом.

Сейчас такая жизнь должна быть в OpenBIOS. И она не сложнее чем с DOS-ом.

Einstok_Fair ★★ ()
Последнее исправление: Einstok_Fair (всего исправлений: 1)

Но вот проблема, так как я почти ничего не знаю, не могу понять с чего надо подступиться к этому делу

Вместо того, чтобы бездумно тыкать fasm, прочитай лучше Таненбаума «Архитектура компьютера».

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)

Начинай с Юрова и DOS. Пиши простейшие программы. АСМ - дело долгое и сложное. Он очень хорош для общего развития, чтобы прокачаться. Например, просмотреть листинги на godbolt.

former_anonymous ★★ ()