Pull to refresh

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>

И выглядит опять же симпатично, можно всё, что угодно, хоть поясняющие картинки с иллюстрациями прямо в код вставлять:

К докторам... к докторам... :)

Ну, меня, как работающего на LabVIEW с возможностью вставлять анимированные гифки прямо в код (блок-диаграмму) программы в общем сложно удивить:

Если ограничить кругозор ОС Windows

Но вообще стоило бы заметить, что продукт, о котором идёт рассказ, работает также и в Linux.

Да, это так, просто в этом месте я писал про MASM/FASM/NASM, плюс ниже в примерах использовал WinAPI/SEH. А так верно, им действительно можно собрать бинарник для Linux, даже 16 бит для древнего DOS можно. Я, возможно, набросаю пример и обновлю статью, спасибо за замечание.

Архив euroasm.zip содержит исполняемые файлы euroasm.exe (для Windows) и euroasm.x (для Linux). Версия для DOS, к сожалению, отсутствует.

Да, €ASM может создавать программы для Linux, Windows, DOS, BIOS и даже BOOT-секторов, но сам ассемблер должен работать на 32-разрядной системе Windows или Linux.

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...

Sign up to leave a comment.

Articles