Советы по изучению сборки и документации по 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) и ничего более. Удобно, если вы хотите быстро найти какую-то конкретную инструкцию.