Nat*_*sha 9 assembly user-interface
有没有办法将TASM ASSEMBLY中编程的应用程序链接到Windows窗体应用程序或任何类型的GUI?
谢谢
joh*_*und 12
您可以在Windows,Linux或任何其他具有图形用户界面的操作系统的程序集中创建GUI应用程序.
您甚至可以使用TASM创建它们,但我不确定这是如何完成的.请注意,您将需要支持32位/ 64位保护模式指令的TASM版本以及可以将TASM生成的目标文件链接到PE可执行文件(Windows的可执行格式)的链接器.
所以,如果你不受TASM的约束,那么有更容易的选择.从2000年开始,人们就积极地为Windows和其他32位平台的程序集编程.选择的组装商是FASM,NASM和MASM32.
第一个 - FASM - 是我最喜欢的,因为:
它可以直接编译成可执行文件.只有在您确实需要时才使用链接器是可选的.
FASM的语法受TASM IDEAL模式语法的影响.
编译非常快速,甚至是巨大的项目 - 500K loc源编译2..3秒.
具有非常强大的宏预处理器,使复杂项目变得简单.
支持多个操作系统的编程.
它是用FASM编写的,可以自我编译和自给自足.正因为如此,FASM在新平台上非常容易移植,是OS开发人员的首选编译器.例如,KolibriOS完全用汇编语言编写,并使用FASM作为汇编程序.
FASM拥有非常活跃和友好的社区.它正在积极开发中,每个发现的bug都会消失几个小时.
用汇编编写的GUI应用程序往往尺寸非常小,界面响应非常灵敏,速度快,资源友好.
作为这样一个应用程序的一个例子,我可以指向我的项目Fresh IDE - 它是一个用于FASM编程的高级Visual RAD IDE.它功能非常丰富,但可执行文件的大小只有250kB.
最后两个代码示例:
使用高级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)主窗口更复杂的模板应用程序:
; 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)您可以将汇编与 C(可能还有几乎其他语言)混合使用。最通用的方法是用汇编语言编写一个 DLL,然后从 GUI 程序中调用该 DLL。在 C 语言中,只要遵循 C 约定,您还可以直接将程序与汇编程序生成的目标文件链接。
本教程很好地解释了 C 约定,但使用了 NASM: http: //drpaulcarter.com/pcasm/。
你应该注意到 TASM确实已经过时了,我怀疑除了老师之外很少有人还在使用它。