Каков наилучший способ узнать Ассамблею? В частности, для тех, кто имеет опыт работы на динамических языках

Я уже давно использую Python, и мне абсолютно нравится удобство использования и гибкость, но я действительно хочу приблизиться к аппаратным средствам для какой-то математики, в которой я работаю. Я также заинтригован тем, что так близко к аппаратным средствам, абсолютно ничего не позволяю вам использовать все, что у него есть.

Я исследовал для введения в Assembly, и для меня они идут намного быстрее, чем нужно. Они прыгают прямо в регистры и операции, не объясняя, что они собой представляют, и почему они имеют значение.

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

Ответ 1

Как говорили другие, начиная с языка более низкого уровня, такого как C/С++ - это хорошее начало. Ознакомьтесь с их функциями, такими как указатели, ссылки, битмаски и т.д., а затем попробуйте assembly.

Один учебник, который мне очень нравится, - это Руководство по сборке ПК (PDF можно найти здесь). Пока вы не создадите и не запустите простую программу и не отлаживаете ее, будет сложно понять сборку.

Что еще более важно, зная ваш Von Neumann компьютерная архитектура и другая справочная информация чрезвычайно важна: дизайн процессора, дизайн памяти, архитектура шины, различные кэши, система двоичных номеров и операции и т.д. Невозможно понять сборку без четкого понимания используемой вами математики и аппаратного обеспечения, на котором вы программируете, потому что вы настолько близки к аппаратным средствам при программировании на этом уровне.

Во многих случаях легче учиться на более простом процессоре. Сначала я учился на симуляторе Java, который использовал более простую производную от набора команд x86, с меньшим количеством регистров, а затем перешел к программированию на Motorola MC68HC12 проектной панели.

Ответ 2

Лично я считаю забавным работать с сборкой на ретро-компьютерах, таких как c64 или Apple II. Это как голые кости, но функциональные, как вы можете идти. Как только вы почувствуете себя комфортно, вы сможете прыгать до сборки x86.

Ответ 3

Помимо упомянутых руководств и ссылок, я бы посоветовал сначала познакомиться с C, так как это не будет таким большим прыжком, как Python для ассемблера. C также находится как можно ближе (по производительности и аппаратной близости) к ассемблеру с меньшей кривой обучения.

Как только вам станет комфортно с C, получите базовое понимание инструкций и регистров для вашей архитектуры, затем запустите отладчик (GDB на Linux и WinDbg или OllyDebug в Windows) над некоторыми базовыми приложениями C, чтобы посмотреть, как они работают на этом уровень.

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

И.. вы всегда можете встроенная сборка в C.

Ответ 4

Я посетил курс в моем университете, где мы написали сборку MIPS. Это RISC-процессор, который делает человеческое усилие немного более гуманным. И, правда, сказать, это весело и не все, что сложно, как только вы получите это.

К сожалению, я не помню книги, которые мы использовали в этом курсе, но я уверен, что у Amazon есть хорошие предложения.

Попробуйте SPIM в качестве платформы моделирования.

Ответ 5

Даниэль Огер прав.

В зависимости от вашего наклона, нахождения эмулятора CP/M Z80 или 6502 Apple] [эмулятор - хорошая ставка.

"В тот же день мы все узнали ассемблера, потому что это был фактически практический язык для использования. Нет кеша, нет прогностического исполнения и т.д. У вас есть несколько регистров, несколько десятков инструкций и т.д. И большая программа (по моим стандартам!) Составляла 8 или 10 килобайт.

Ответ 6

Как говорили другие, начиная с языка более низкого уровня, такого как C/С++, это хороший старт. Ознакомьтесь с их функциями, такими как указатели, ссылки, битмаски и т.д., А затем попытайтесь выполнить сборку.

Это должен быть первый шаг. После этого вы можете использовать книгу, например Write Great Code, том 2: размышление о низком уровне, запись высокого уровня. Он показывает вам, как код высокого уровня транслируется компилятором в сборку.

Ответ 7

MIPS, MIPS, MIPS, MIPS, MIPS. Это то, что я говорю.

MIPS - это самый простой, самый чистый и самый элегантный набор инструкций, который когда-либо разрабатывался по моему мнению. Это в основном "оригинальный RISC". Если у вас есть маршрутизатор на основе MIPS или другое устройство для взлома, напишите для него код.

Еще одна очень чистая и даже более простая архитектура - AVR, которая представляет собой 8-битную архитектуру, используемую в микроконтроллерах от Atmel. Очень ортогональный и простой в освоении и использовании.

Очевидно, что если вам нужно выполнить определенную работу в сборке (например, оптимизировать критический по времени код), изучите язык ассемблера для любой архитектуры, которую вы используете... скорее всего, x86. Узел x86 является мощным, но довольно грязным.

Ответ 8

@Крис Фурнье предоставил отличный ответ о том, как изучать Ассамблею. Я не могу обеспечить ничего лучшего, что он уже сделал, но еще несколько ссылок:

  • Art of Assembly - это отличный ресурс для обучения сбору.
  • Стив Гибсон - У человека есть навыки со сборкой. Он написал свой инструмент SpinRite только в Assembly. Это ссылка на некоторые ресурсы, которые он рекомендует, а также некоторые примеры программ, которые он написал в сборке.

Ответ 9

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

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