大会 - >桂?

Nat*_*sha 9 assembly user-interface

有没有办法将TASM ASSEMBLY中编程的应用程序链接到Windows窗体应用程序或任何类型的GUI?

谢谢

joh*_*und 12

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

您可以在Windows,Linux或任何其他具有图形用户界面的操作系统的程序集中创建GUI应用程序.

您甚至可以使用TASM创建它们,但我不确定这是如何完成的.请注意,您将需要支持32位/ 64位保护模式指令的TASM版本以及可以将TASM生成的目标文件链接到PE可执行文件(Windows的可执行格式)的链接器.

所以,如果你不受TASM的约束,那么有更容易的选择.从2000年开始,人们就积极地为Windows和其他32位平台的程序集编程.选择的组装商是FASM,NASMMASM32.

第一个 - FASM - 是我最喜欢的,因为:

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

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

  3. 编译非常快速,甚至是巨大的项目 - 500K loc源编译2..3秒.

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

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

  6. 它是用FASM编写的,可以自我编译和自给自足.正因为如此,FASM在新平台上非常容易移植,是OS开发人员的首选编译器.例如,KolibriOS完全用汇编语言编写,并使用FASM作为汇编程序.

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

用汇编编写的GUI应用程序往往尺寸非常小,界面响应非常灵敏,速度快,资源友好.

作为这样一个应用程序的一个例子,我可以指向我的项目Fresh IDE - 它是一个用于FASM编程的高级Visual RAD IDE.它功能非常丰富,但可执行文件的大小只有250kB.

最后两个代码示例:

  1. 使用高级FASM宏系统的非常简单的"Hello world"示例:

    include 'win32ax.inc' 
    
    .code
      start:
            invoke  MessageBox,HWND_DESKTOP,"Hellow world!", "Hello!", MB_OK
            invoke  ExitProcess,0
    
    .end start
    
    Run Code Online (Sandbox Code Playgroud)
  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'                                                                                                                                                                                                                              
    
    Run Code Online (Sandbox Code Playgroud)

  • "价值"是什么意思?它有效,即可行吗?当然如此.这值得做吗?我不同意. (2认同)

Bas*_*ard 2

您可以将汇编与 C(可能还有几乎其他语言)混合使用。最通用的方法是用汇编语言编写一个 DLL,然后从 GUI 程序中调用该 DLL。在 C 语言中,只要遵循 C 约定,您还可以直接将程序与汇编程序生成的目标文件链接。

本教程很好地解释了 C 约定,但使用了 NASM: http: //drpaulcarter.com/pcasm/

你应该注意到 TASM确实已经过时了,我怀疑除了老师之外很少有人还在使用它。