GoAsm не такой распрстранённый ассемблер, но, например,
XBLite(клон
XBasic) транслирует именно в
GoAsm.
Специфичность этого ассемблера, например, в том, что
- порядок вычислений слева направо без учёта приоритетов, как в С--
2 + 3 * 4 будет вычислено как (2 + 3) * 4, результат 20; - не нужно объявлять внешние символы как extern, например, успешно скомпилируется
mov eax, [X]
даже если X нигде не объявлено, это только линкер потом скажет что-то типа "undefined reference"
Поэтому можно спокойно написать нигде не объявляя процедуру DrawWindowCode:
Invoke DrawWindow, [Window.Left], [Window.Top], [Window.Right], [Window.Bottom], Offset szHello, WINDOW_COLOR, WS_SKINNED_FIXED | WS_COORD_CLIENT | WS_CAPTION, CS_MOVABLE
из плюсов: меньше писать кода
из минусов: нет контроля передаваемых параметров - так как ассемблер разработан специально для Windows, то считается, что все процедуры StdCall(а для 64 bit FastCall).
- для улучшения читаемости кода используются так называемые индикаторы направления, используемые совместно с jump-инструкциями
Code:
JZ >forward_label
JMP <backward_label
- безымянная метка это просто двоеточие, также используется индикатор направления
Code:
CMP EAX,EDX
JZ >
CALL PROCESS
:
RET
Для сборки нужно
GoAsm,
LD,
OBJCOPY,
KolibriOS.Lib.
GoAsm можно скачать тут
http://www.godevtool.comKolibriOS.Lib можно взять из темы
Delphi7 examples viewtopic.php?f=33&t=3469Только почему-то линкер выдаёт warnings:
Quote:
LD: Warning: type of symbol `GetSkinHeight' changed from 8192 to 32
LD: Warning: type of symbol `WaitEvent' changed from 8192 to 32
LD: Warning: type of symbol `BeginDraw' changed from 8192 to 32
LD: Warning: type of symbol `DrawText' changed from 8192 to 32
LD: Warning: type of symbol `GetButton' changed from 8192 to 32
Скриншот тестового приложения:
Attachment:
GoAsm1.PNG [ 3.3 KiB | Viewed 13008 times ]
Attachment:
test(GoAsm+KolibriOS.Lib).7z [1.46 KiB]
Downloaded 414 times