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

         

дизассемблерный листинг простейшей 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



Содержание раздела