Ответ 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
. (Краткий пример можно найти здесь.)