Сборка-> Gui? - PullRequest
       26

Сборка-> Gui?

9 голосов
/ 14 апреля 2010

Есть ли способ связать приложение, запрограммированное в TASM ASSEMBLY, с приложением Windows Form или любым другим графическим интерфейсом?

Спасибо

Ответы [ 2 ]

12 голосов
/ 07 марта 2014

Разработка приложений с графическим интерфейсом на языке ассемблера!

Вы можете создавать приложения с графическим интерфейсом в сборке для Windows, для Linux или для любой другой ОС с графическим интерфейсом пользователя.

Вы можете создавать их даже с помощью TASM, хотя я не уверен, как именно это должно быть сделано. Обратите внимание, что вам потребуется версия TASM, которая поддерживает инструкции в 32-битном / 64-битном защищенном режиме, а также компоновщик, который может связывать объектные файлы, созданные TASM, в исполняемые файлы PE (исполняемый формат для Windows).

Итак, если вы не связаны с TASM, есть гораздо более простые альтернативы. С начала 2000-х годов люди активно программируют на ассемблере для Windows и других 32-битных платформ. Выбор сборщиков: FASM , NASM и MASM32 .

Первый - FASM - мой любимый, потому что:

  1. Может компилироваться непосредственно в исполняемые файлы. Использовать компоновщик необязательно, только если он вам действительно нужен.

  2. Синтаксис FASM зависит от синтаксиса режима TASM IDEAL.

  3. Компилирует очень быстро, даже огромные проекты - 500K loc источник компилируется за 2,3 секунды.

  4. Имеет очень мощный макро-препроцессор, который облегчает сложные проекты.

  5. Поддерживает программирование для нескольких ОС.

  6. Он написан на языке FASM, самодостаточен и самодостаточен. Из-за этого FASM очень легко переносим на новых платформах и является предпочтительным компилятором для разработчиков ОС. Например, KolibriOS полностью написан на ассемблере и использует FASM в качестве ассемблера.

  7. FASM имеет очень активное и дружелюбное сообщество. Он находится в активной разработке, и каждая найденная ошибка исчезает на несколько часов.

Приложения с графическим интерфейсом, написанные на ассемблере, имеют тенденцию быть очень маленькими по размеру, с очень отзывчивым интерфейсом, быстрым и дружественным к ресурсам.

В качестве примера такого приложения я могу указать вам на мой проект Fresh IDE - это продвинутая Visual RAD IDE для программирования FASM. Он очень многофункциональный, но размер исполняемого файла составляет всего 250 КБ.

В конце два примера кода:

  1. Очень простой пример "Hello world" с использованием расширенной системы макросов FASM:

    include 'win32ax.inc' 
    
    .code
      start:
            invoke  MessageBox,HWND_DESKTOP,"Hellow world!", "Hello!", MB_OK
            invoke  ExitProcess,0
    
    .end start
    
  2. Более сложное шаблонное приложение с главным окном:

    ; Template for program using standard Win32 headers
    
    format PE GUI 4.0
    entry start
    
    include 'win32w.inc'
    
    section '.text' code readable executable
    
      start:
    
            invoke  GetModuleHandle,0
            mov     [wc.hInstance],eax
            invoke  LoadIcon,0,IDI_APPLICATION
            mov     [wc.hIcon],eax
            invoke  LoadCursor,0,IDC_ARROW
            mov     [wc.hCursor],eax
            invoke  RegisterClass,wc
            test    eax,eax
            jz      error
    
            invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
            test    eax,eax
            jz      error
    
      msg_loop:
            invoke  GetMessage,msg,NULL,0,0
            cmp     eax,1
            jb      end_loop
            jne     msg_loop
            invoke  TranslateMessage,msg
            invoke  DispatchMessage,msg
            jmp     msg_loop
    
      error:
            invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK
    
      end_loop:
            invoke  ExitProcess,[msg.wParam]
    
    proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
            cmp     [wmsg],WM_DESTROY
            je      .wmdestroy
      .defwndproc:
            invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
            jmp     .finish
      .wmdestroy:
            invoke  PostQuitMessage,0
            xor     eax,eax
      .finish:
            ret
    endp
    
    section '.data' data readable writeable
    
      _class TCHAR 'FASMWIN32',0
      _title TCHAR 'Win32 program template',0
      _error TCHAR 'Startup failed.',0
    
      wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
    
      msg MSG
    
    section '.idata' import data readable writeable
    
      library kernel32,'KERNEL32.DLL',\
              user32,'USER32.DLL'
    
      include 'api\kernel32.inc'
      include 'api\user32.inc'                                                                                                                                                                                                                              
    
1 голос
/ 14 апреля 2010

Вы можете смешивать ассемблер с C (и, возможно, почти с другим языком). Наиболее общим способом было бы написать DLL в сборке, а затем вызвать эту DLL из программы с графическим интерфейсом. В C вы также можете напрямую связать программу с объектным файлом, созданным ассемблером, при условии соблюдения соглашений C.

Этот учебник хорошо объясняет соглашения C, но использует NASM: http://drpaulcarter.com/pcasm/.

Вы должны заметить, что TASM действительно датирован, и я подозреваю, что немногие люди все еще используют его помимо учителей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...