Примечание. Этот пост основан на моем предыдущем посте. Если вы новичок в ассемблере, сначала прочтите его.
Создав простую программу Haiku Hello, World на ассемблере x86, а затем сделав некоторый шеллкод для Haiku, следующим шагом в моем путешествии по изучению ассемблера будет создание простого приложения Hello, World на ассемблере x64. Сборка.
Я все еще использую Haiku Beta1, но на этот раз я использую версию x86_64.
При написании сборки Haiku, которая вызывает внешние функции, большая разница между x86 и x86_64 заключается в том, что аргументы передаются в стеке для x86, тогда как для x86_64 они передаются в регистрах. При попытке выяснить, какие регистры использовать, некоторые поисковые запросы и пробы показали, что регистры, которые нужно использовать, совпадают с теми, которые используются в Linux и *BSD:
Стандартные вызовы функций:
- Целые числа и адреса памяти: RDI, RSI, RDX, RCX, R8 и R9.
- Аргументы с плавающей запятой: XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6 и XMM7.
- Дополнительные аргументы передаются в стеке
Системные вызовы:
- Для системных вызовов вместо RCX используется регистр R10.
Помимо передачи аргументов, еще одно различие между 32-битным и 64-битным процессором в Haiku заключается в том, что вместо прерывания 99
используется код операции syscall
, а номер системного вызова помещается в регистр rax
.
Имея эту информацию, последнее, что нам нужно проверить, это то, что номера системных вызовов для Haiku x86_64 такие же, как и для Haiku x86.
Файл с номерами системных вызовов syscalls.S.inc
создается с помощью следующей команды:
git clone https://git.haiku-os.org/haiku cd haiku ./configure --target-arch x86_64 cd src/system/libroot jam
Выполнив команду, мы видим, что номера системных вызовов такие же, как и для Haiku x86, которую я загрузил в эту суть Github.
Теперь у нас должно быть все необходимое для переноса нашей программы «Hello, World» на x86_64, и после внесения необходимых изменений получаем вот что:
И когда мы запускаем его, он печатает «Hello, world from Haiku x64 syscall».