汇编 -> 图形界面?

12

有没有办法将用 TASM 汇编语言编写的应用程序与 Windows 窗体应用程序或任何类型的图形用户界面链接起来?

谢谢


2
使用标准WinAPI创建您的UI。任何Windows C++都会为您提供简单的示例,以便创建窗口并处理消息循环。 - slugster
如果你真的需要从一段代码中获得疯狂的性能,并且相信自己可以击败优化的C编译器,那么最好只在关键部分使用汇编语言编写,而将GUI界面使用更加友好的编程语言来实现。 - Matti Virkkunen
2个回答

18

汇编语言开发GUI应用程序是值得的!

您可以为Windows、Linux或任何其他具有图形用户界面的操作系统创建GUI应用程序。

即使使用TASM,也可以创建它们,尽管我不确定该如何实现。请注意,您需要支持32位/64位保护模式指令的TASM版本,以及能够将TASM生成的目标文件链接到PE可执行文件(Windows的可执行文件格式)的链接器。

因此,如果您不受TASM的限制,则有更简单的替代方案。自2000年代初以来,有人积极地为Windows和其他32位平台编写汇编代码。选择的汇编器是FASMNASMMASM32

首选的第一个-FASM-是我的最爱,因为:

  1. 它可以直接编译成可执行文件。使用链接器是可选的,只有在真正需要时才需要使用。

  2. FASM的语法受到TASM IDEAL模式语法的影响。

  3. 即使是庞大的项目 - 500K loc源代码也可以在2..3秒内编译。

  4. 具有非常强大的宏预处理器,使复杂项目变得容易。

  5. 支持为多个操作系统编程。

  6. 它是用FASM编写的,是自编译和自给自足的。因此,FASM非常易于在新平台上移植,是操作系统开发人员的首选编译器。例如KolibriOS完全用汇编语言编写,使用FASM作为汇编器。

  7. FASM拥有非常活跃和友好的社区。它正在积极开发中,每发现一个错误就会在几小时内消失。

用汇编语言编写的GUI应用程序往往非常小巧,界面反应迅速,快速且资源友好。

作为这种应用的例子,我可以向您介绍我的项目Fresh IDE - 这是一个高级的视觉RAD IDE,用于FASM编程。它非常功能丰富,但可执行文件的大小仅为250kB。
最后附上两个代码示例:
  1. Very simple "Hello world" example using advanced FASM macro system:

    include 'win32ax.inc' 
    
    .code
      start:
            invoke  MessageBox,HWND_DESKTOP,"Hellow world!", "Hello!", MB_OK
            invoke  ExitProcess,0
    
    .end start
    
  2. More complex template application with main window:

    ; 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'                                                                                                                                                                                                                              
    

6
“Worths” 的意思是什么?它的意思是可行,也就是可以做到吗?当然可以。它值得去做吗?我不同意。 - Matti Virkkunen
1
@MattiVirkkunen 这意味着使用汇编语言制作应用程序可以以比其他语言更少的努力提供软件产品的最佳质量(高速度,低资源使用率)。如果您愿意接受次优质量,那么一些其他语言可以提供更便宜的开发。此外,您可以在其他语言中提供最佳质量,但这将比在汇编语言中更困难。 - johnfound

2
您可以将汇编语言与C(以及可能是其他语言)混合使用。 最通用的方法是编写一个汇编语言的DLL,然后从GUI程序中调用此DLL。 在C中,只要遵循C约定,您也可以直接将程序链接到由汇编器生成的目标文件。 这个教程做了一个很好的工作,解释了C约定,但使用了NASM:http://drpaulcarter.com/pcasm/。 您应该注意,TASM已经非常过时了,我怀疑除了老师之外,很少有人仍在使用它。

我可以确认,您也可以使用汇编器生成的[某些]目标文件与Delphi编译器/链接器进行链接。 - PhiS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接