Советы по изучению сборки и документации по Linux x86-64

У кого-нибудь есть документация, касающаяся изучения основ сборки Linux x86-64? Я не уверен, стоит ли изучать его как есть или сначала изучать x86, а потом изучать его, но, поскольку у меня есть компьютер x86-64, а не x86, я думал вместо этого изучать x86-64;)

Может быть, кто-нибудь мог бы дать мне какой-то стимул и указания относительно того, что, как и с какой документацией узнать

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

Спасибо всем

3 ответа

Общий совет:

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

Прочтите хорошую книгу по ассемблеру x86, чтобы понять основы (регистры, условные переходы, арифметику и т. Д.). Я читал " Искусство сборки " Рэндалла Хайда, когда только начинал.

http://asm.sourceforge.net/ выглядит так, как будто у него есть несколько хороших учебных пособий, которые вы, возможно, захотите проработать. Но если вы собираете в 64-битном режиме, имейте в виду, что соглашение о вызовах для функций C и системных вызовов отличается.

Вам понадобятся справочные руководства по процессорам. Лично я предпочитаю AMD. Вы хотите тома 1 и 3 из руководства по процессору. Другие тома также могут представлять интерес.

64-битный конкретный совет

64-битная сборка x86 почти такая же, как 32-битная сборка x86, поскольку 64-битная x86 в основном обратно совместима с 32-битной. Вы получаете доступ к 64-битным регистрам и нескольким другим функциям, некоторые неясные инструкции больше не действительны, а остальные такие же, как 32-битные.

Однако в 64-битном Linux соглашение о системных вызовах совершенно другое. В зависимости от вашего ядра 32-битные системные вызовы могут быть или не быть доступны. Хуже всего то, что соглашение о 64-битном вызове плохо документировано. Я только понял это, изучив глубины исходного кода glibc.

Чтобы избавить вас от необходимости выяснить это нелегко, номера системных вызовов приведены в исходном коде Linux под arch/x86/include/asm/unistd_64.h, Номер системного вызова передается в rax регистр. Параметры в rdi, rsi, rdx, r10, r8, r9, Вызов вызывается с syscall инструкция. syscall перезаписывает rcx регистр. Возвращение в rax, (Краткий пример можно найти здесь.)

Посмотрите здесь, это лучшее место для разработки Linux Assembly, вы найдете ресурсы, документы и ссылки.

Каноническая ссылка на x86 - это, вероятно , Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32. У меня все еще есть пара томов этой серии, начиная с того времени, когда P III был новым. Также есть Руководство программиста по архитектуре AMD64, которое может быть интересным, потому что Intel не полностью последовала примеру AMD в дизайне x86-64, но я не читал его.

Справочник по кодам операций и инструкциям X86 в точности соответствует объявленному: коды операций и инструкции x86(-64) и ничего более. Удобно, если вы хотите быстро найти какую-то конкретную инструкцию.

Другие вопросы по тегам