Архитектура x86-64 под скальпелем ассемблерщика


Листинг 8 пример вызова API-функции с пятью параметрами по соглашению x86-64


Смещение пятого аргумента относительно верхушки стека требует пояснений. Почему оно равно 20h? Ведь адрес возврата занимает только 8 байт. Какая су… сущность съела все остальные? Оказывается, они "резервируются" для первых четырех аргументов, переданных через регистры. "Зарезервированные" ячейки содержат неинициализированный мусор и по-буржуйски называются "spill", что переводится как "затычка" или "потеря".

Вот минимум знаний, необходимых для выживания в мире 64-битной Windows при программировании на ассемблере. Остается разобрать самую малость. Как эти самые 64-бита заполучить?! Для перевода FASM'а в x86-64 режим достаточно указать директиву "use64" и дальше шпрехать как обычно.

Ниже идет пример простейшей x86-64 программы, которая не делает ничего, только возвращает в регистре RAX значение "ноль".

 

; сообщаем FASM'у, что мы хотим программировать на x86-64

use64

 

xor r9,r9            ; обнуляем регистр r9

mov rax,r9           ; пересылаем в rax,r9 (можно сразу mov rax,0, но неинтересно)

ret                  ; выходим туда откуда пришли




Начало  Назад  Вперед