Comments 16
И не говорите мне после этого, что HTML - не "язык программирования общего назначения". Насколько я понял по исходникам, EuroAssembler написан на HTML и собирается на PHP:
https://euroassembler.eu/download/euroasm.20250318.zip -> generate.zip -> generate.php ( подробнее https://euroassembler.eu/easource/ )
*
...хотя ходит слушок, что всё у них там в Эуропе через одно место делается.
Ну да, это такая "изюминка". Хотя при сборке можно обйтись и без PHP, а что касается HTML — то парсер просто игнорирует все теги, код можно вставлять в <pre>...</pre>, так что вот такой "код" — вполне себе валидный и компилябельный исходник:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Hi Habr</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel='stylesheet' href='euroasm.css' type='text/css'/>
</head>
<body>
<h2 id="test-application">Test Application</h2>
<p>Program options:</p>
<pre>
EUROASM CPU=x64
hi_habr PROGRAM Format=PE, Width=64, Entry=Start
</pre>
<p>Include File for <a href='https://euroassembler.eu/maclib/winabi.htm#StdOutput'>StdOutput</a> Macro:</p>
<pre>
INCLUDE winabi.htm
</pre>
<p>Program code:</p>
<pre>
Start: StdOutput =B"Hi, Habr!", Eol=yes
TerminateProgram
ENDPROGRAM
</pre>
<p>Output:</p>
<samp>Hi, Habr!</samp>
</body>
</html>И выглядит опять же симпатично, можно всё, что угодно, хоть поясняющие картинки с иллюстрациями прямо в код вставлять:
Если ограничить кругозор ОС Windows
Но вообще стоило бы заметить, что продукт, о котором идёт рассказ, работает также и в Linux.
Да, это так, просто в этом месте я писал про MASM/FASM/NASM, плюс ниже в примерах использовал WinAPI/SEH. А так верно, им действительно можно собрать бинарник для Linux, даже 16 бит для древнего DOS можно. Я, возможно, набросаю пример и обновлю статью, спасибо за замечание.
Архив euroasm.zip содержит исполняемые файлы euroasm.exe (для Windows) и euroasm.x (для Linux). Версия для DOS, к сожалению, отсутствует.
Добро пожаловать, Павел! Я имел ввиду, что можно выставить опции
PROGRAM FORMAT=COM,MODEL=TINY,WIDTH=16Как в примере https://euroassembler.eu/prodos16/com.htm.
Fasm, Nasm прекрасно работают под Linux. И только продукт M$ поддерживает только windows.
EuroAssembler
Громкое имя для пет-проекта.
Ну, это как евродвушка: почти настоящий ассемблер :D
Ну как почти... смотрите, если предпоследний пример с SEH переложить на FASM, просто для сравнения, то оно будет как-то вот так, почти один-в-один:
format PE64 CONSOLE
entry start
include 'seh64.inc'
start:
SUB RSP,8*(4+1)
LEA RCX,[hello]
call [printf]
.try handler
MOV ECX,0x40000000 ; Instructions Counter
RDPMC ; Read Performance-Monitoring Counter
.end
safe_place:
LEA RCX, [finish]
call [printf]
XOR ECX,ECX
call [ExitProcess]
handler:
SUB RSP,8*(4+1)
MOV qword [R8+CONTEXT64.Rip],safe_place
LEA RCX,[exception]
call [printf]
XOR EAX,EAX
ADD RSP,8*(4+1)
retn
section '.data' data readable writeable
hello db "Hello, SEH!",10,0
finish db "Sucessfully finished",10,0
exception db "Instruction caused exception",10,0
data seh
end data
section '.idata' import data readable
library kernel32,'KERNEL32.DLL', msvcrt, 'msvcrt.dll'
import kernel32, ExitProcess,'ExitProcess'
import msvcrt, printf, 'printf'И всё бы ничего, но видите в начале "include 'seh64.inc'"? — чтобы это заработало, там ещё простыню макросов придётся наваять:
содержимое seh64.inc
include 'INCLUDE\win64a.inc'
macro enqueue list,item
{ match any,list \{ list equ list,item \}
match ,list \{ list equ item \} }
macro dequeue list,item
{ done@dequeue equ
match first=,rest,list
\{ item equ first
list equ rest
restore done@dequeue \}
match :m,done@dequeue:list
\{ item equ m
list equ
restore done@dequeue \}
match ,done@dequeue
\{ item equ
restore done@dequeue
\} }
macro queue list,index,item
{ local copy
copy equ list
rept index+1 \{ dequeue copy,item \} }
macro data directory
{ done@data equ
match =3,directory
\{ local l_infos,_info,_end
l_infos equ
align 4
match list,l_handlers
\\{
irp _handler,list
\\\{ local rva$
rva$ = rva $
enqueue l_infos,rva$
db 19h,0,0,0
dd _handler,0
\\\}
\\}
data 3
match list,l_begins
\\{
irp _begin,list
\\\{
dequeue l_ends,_end
dequeue l_infos,_info
dd _begin
dd _end
dd _info
\\\}
\\}
restore done@data
\}
match ,done@data
\{ data directory
restore done@data \} }
l_begins equ
l_ends equ
l_handlers equ
macro .try handler
{ local ..try
__TRY equ ..try
local ..end
__END equ ..end
local ..catch
__CATCH equ ..catch
__TRY:
if ~ handler eq
virtual at handler
__CATCH:
end virtual
end if }
macro .catch
{ jmp __END
__CATCH: }
macro .end
{ __END:
enqueue l_begins,rva __TRY
enqueue l_ends,rva __END
enqueue l_handlers,rva __CATCH
restore __TRY
restore __END
restore __CATCH }
seh equ 3
CONTEXT64.Rip = 0F8hТак что местами евроассемблер весьма удобная штука.
Не знал про euroasm вообще. За обзор спасибо, особенно за примеры с ELFX и сборкой под две ОС из одного исходника
Антивирусы уже лет 15 минимум блокируют все нестандартные .exe. Тот же pellesC,masm, fasm, да и древние студии - на форумах постоянно жалобы на фолс позитив детект. С этим ничего не поделать, только вступать в нудную переписку (+ покупать серт , хотя и это не панацея).
Я всю статью думал, что же мне это напоминает... Потом вспомнил, был школьник, фанатик И. Маска, "написал" свой "ассемблер" на js... Назывался (его поделка) asmx...

Об ассемблере EuroAssembler, о котором вы, возможно, не слышали