дизассемблерный листинг простейшей 64-битной программы
Формально, это типичный com-файл, вот только запустить его не удастся (во всяком случае, ни одна популярная ось его не "съест") и необходимо замутить законченный ELF или PE, в заголовке которого будет явно прописана нужна разрядность.
Начиная с версии 1.64 ассемблер FASM поддерживает специальную директиву "format PE64", автоматически формирующую 64-разрядный PE-файл (директиву "use64" в этом случае указывать уже не нужно), а в каталоге EXAMPLES можно найти готовый пример PE64DEMO в котором показано как ее использовать на практике.
Ниже приведен пример x86-64 программы "hello, world" с комментариями:
; пример 64-битного PE
файла
; для его выполнения необходимо иметь Windows XP 64-bit edition
; указываем формат
format PE64 GUI
; указываем точку входа
entry start
; создать кодовую секцию с атрибутами на чтение и исполнение
section '.code' code readable executable
start:
mov r9d,0 ; uType
== MB_OK (кнопка по умолчанию)
; аргументы по соглашению x86-64
; передаются через регистры, не через стек!
; префикс d задает регистр размером в слово,
; можно использовать и mov r9,0, но тогда
; машинный код будет на байт длиннее
lea r8,[_caption] ; lpCaption передаем смещение
; команда lea
занимает всего 7 байт,
; а mov reg, offset
- целых 11, так что
; lea намного более предпочтительна
lea rdx,[_message] ; lpText передаем смещение выводимой строки
mov rcx,0 ; hWnd передам дескриптор окна-владельца
; (можно так же использовать xor rcx,rcx