Примечание. Этот пост основан на моем предыдущем посте. Если вы новичок в ассемблере, сначала прочтите его.

Создав простую программу 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».