Необычный синтаксис fasm
Решил немного разгрузить мозги чем-то другим, отличным от рабочих вопросов. И вот мой выбор пал на тему "ассемблер" :) В свое время плотно прогал на Turbo Pascal 5.5 + TASM, но это было ооочень давно. В основном это касалось работы с видеоадаптером CGA. А когда появились EGA/VGA - актуальность начала падать. Ну это так, предисловие что-ли. Сейчас решил немного окунуться "в современность". Ассемблеров тьма, мне приглянулся fasm. Написал простенькую прогу для теста:
format PE64 console
include "C:/Tools/Fasm/INCLUDE/win64ax.inc"
.data
Message db 'Hello World!',0
Message.length = $ - Message
HandleFile dq ?
.code
proc PrintFunc
stdcall [WriteConsole], [HandleFile], Message, Message.length, 0, 0
ret
endp
start:
sub rsp, 40 ; резервирование в стеке (4 * 8) + 8
and spl, -16 ; и выравнивание на 16
stdcall [GetStdHandle], STD_OUTPUT_HANDLE
mov [HandleFile],rax
stdcall PrintFunc, HandleFile
stdcall [ExitProcess],0
.end start
Где-то по докам, где-то по примерам из сети. Но обратил внимание на странное оформление секций, процедур. Вот и возник ряд вопросов:
- Это фишки собственных макросов
fasm'а? - А как такое же написать, к примеру, для
nasm? - А такое же, написанное для п.2 потом сам
fasmкомпильнет? - Какова ценность вот такого "синтаксиса" (вдруг потом понадобится
gas'ом компилировать)?