Есть ли каноническая книга по сборке x86? [закрыто]

25

Есть много книг по сборке. Тем не менее, они обычно имеют дело с ISA, о которых мне все равно, например, MIPS или ARM. Я не имею дело с этими архитектурами; у меня нет причин пытаться их изучать.

Но сборочные книги по x86 кажутся ... несуществующими.

Например, я пытаюсь создать игрушечный компилятор, генерирующий исполняемые файлы Windows Portable.

Существует ли книга, которая является стандартом де-факто для описания лучших практик, методологий проектирования и другой полезной информации о сборке x86? Что из этой книги делает ее особенной?

Билли ОНил
источник
Какой опыт сборки у вас есть? Вы когда-нибудь пытались использовать GCC без оптимизации для компиляции простых программ на C в ассемблер, а затем преобразовать код обратно в программу на C?
Брайан
10
@ Брайан: Мне нужно знать сборку, прежде чем я смогу это сделать.
Билли ONEAL
Я видел копию набора команд x86. Это 2 тома и, вероятно, самая большая книга, которую я когда-либо видел. Веселитесь :)
AngryBird
2
Билли, если ты вообще не знаешь сборок, тогда любой из них будет неплохо начать с общих идей. Сборка очень близка к архитектуре, поэтому инструкции по сборке в значительной степени отражают особенности архитектуры. Я начал с сборки x86 и прочитал «Язык ассемблера для компьютеров на базе Intel» Кипа Ирвина. Книга была в паре с онлайн-классом в общественном колледже. Я не уверен, какой вы ученик, но я считаю, что инструкции лучше всего подойдут для обучения.
Брайан
@Brian: Что вы подразумеваете под "любой из них"? Я не понимаю, что такое «они» - какая-нибудь книга? Любой ассемблер? Любой ISA? Я уже играл с ассемблером MIPS; Я не могу найти что-нибудь на x86, хотя.
Билли ONEAL

Ответы:

18

Я использовал язык ассемблера для процессоров x86 в качестве учебника, когда учился в колледже, и мне было очень легко его понять. У меня есть более старое четвертое издание, и я сравнил его с шестым изданием и не заметил особых изменений, так что вы, вероятно, могли бы купить более старую копию дешевле. Люди жалуются на то, что он использует свою собственную библиотеку для ввода / вывода, но он рассказывает вам, как сделать это «трудным» способом в последних главах.

dboss
источник
1
Очень хорошая книга!
Кодер
Я прочитал 5-е издание книги Ирвина, когда она называлась «Язык ассемблера для компьютеров на базе Intel». :)
Брайан
1
Я думаю, что это довольно плохое предположение, так как большая часть второго издания посвящена собственной эзотерической системе High Level Assembly авторов, которая, по сути, является подделанной версией C. Я никогда не читал первое опубликованное издание. Версия DOS, которую вы можете найти на его сайте бесплатно и которая никогда не была опубликована, тем не менее, является отличным вариантом для чтения. Также около 50% больше и не имеет ничего о HLA (которая является общей тратой времени).
Эван Кэрролл,
1
@EvanCarroll Я в замешательстве. Вы изменили ссылку на неправильную книгу, а затем раскритиковали книгу, на которую изменили ссылку. Это было непреднамеренно?
Мерлин Морган-Грэм
1
полностью моя ошибка @ MerlynMorgan-Грэхем, хорошо, что ты и поймал, и исправил.
Эван Кэрролл
18

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

Здесь: Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32

Jesper
источник
9

Программирование Art of Assembly - превосходный ресурс, в котором много говорится о программировании для x86.

Документация x64 ABI также полезна. Я пытался найти ссылку на версию, которая была на веб-сайте AMD, но, похоже, я больше не могу ее найти, поэтому думаю, что это нужно сделать.

Что-то, что может помочь [немного] во время обучения, вместо того, чтобы пытаться написать законченное приложение с нуля на ассемблере, вместо этого написать большую часть этого на C (или любом другом скомпилированном языке на самом деле), а затем вызвать кусок кода на ассемблере из что. Как только вы это сделаете, переверните его, напишите программу на ассемблере и вызовите из этого некоторые функции языка Си.

Изменить: Исправлена ​​опечатка.

Orclev
источник
1
Еще одно предложение: написать простую программу на C, скомпилировать ее в сборку, очистить, чтобы ваш ассемблер мог собрать ее, а затем улучшить версию сборки. Это хороший способ быстро выполнить некоторые минимальные функции (чтение с клавиатуры, запись на консоль).
TMN
4

Очень хорошая книга для изучения сборки x86 - Pentium Processor Optimization Tools . Несмотря на то, что основное внимание в книге уделяется оптимизации ассемблерного кода, она в процессе обучения учит сборке Pentium, а также является хорошим справочником.

Это долго из печати, но не трудно найти использованный.

Он поставляется с дискетой, содержащей «оптимизатор кода сборки». Он на самом деле не оптимизирует ваш код, но вместо этого создает закомментированный листинг, который указывает, где лежат неэффективности, такие как задержки конвейера.

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

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

Майк Кроуфорд
источник
На самом деле не для исполнения; просто хочу иметь возможность генерировать двоичные файлы. Все равно посмотрю :)
Billy ONeal
2
Вам также нужно будет научиться использовать определенный ассемблер, а не только коды операций сборки. Каждый ассемблер делает вещи совершенно по-своему. Если вы собираетесь писать много ассемблерного кода, используйте masm в том виде, в каком он был разработан с учетом человеческого кодирования. Если вы просто собираетесь писать небольшие фрагменты встроенной сборки, вы можете использовать gcc с GNU в качестве (также называемой газовой) встроенной сборки. Синтаксис GNU as 'полностью отличается от синтаксиса masm. Как было написано в первую очередь для использования в качестве серверной части для gcc, для генерации исполняемого кода, и поэтому не предоставляет многих функций, которые нужны человеческим кодировщикам.
Майк Кроуфорд
1

Почему бы не попробовать викибук - http://en.wikibooks.org/wiki/X86_Assembly . Это дает хорошее вводное начало для языка ассемблера.

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

Филип Окли
источник