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

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

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

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

Спасибо всем

Ответ 1

Общий совет:

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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