【API】NASM编写Win32图形界面程序的方法
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>NASM汇编Win32图形界面程序</title>
<style type="text/css">
span {
font-family: '宋体';
font-size: 9pt;
color: #000000;
}
.sc0 {
}
.sc1 {
color: #008000;
}
.sc2 {
color: #FF0000;
}
.sc3 {
color: #FF0000;
}
.sc4 {
color: #000080;
}
.sc5 {
}
.sc6 {
color: #000080;
}
.sc8 {
color: #0000FF;
}
.sc9 {
color: #0080FF;
}
.sc10 {
color: #000080;
}
</style>
<div style="float: left; white-space: pre; line-height: 1; background: #FFFFFF; "><span class="sc0">编译的方法:
</span><span class="sc2">1</span><span class="sc0">、将源码复制下来,保存到记事本,存为后缀</span><span class="sc5">.ASM</span><span class="sc0">(其实</span><span class="sc5">.TXT</span><span class="sc0">也行,只是显得不专业。)
</span><span class="sc2">2</span><span class="sc0">、使用</span><span class="sc5">NASM</span><span class="sc0">进行编译,注意要给参数“</span><span class="sc4">-</span><span class="sc5">f</span><span class="sc0"> </span><span class="sc5">win32</span><span class="sc0">”。得到</span><span class="sc5">OBJ</span><span class="sc0">文件。
</span><span class="sc2">3</span><span class="sc0">、使用</span><span class="sc5">LINK</span><span class="sc0">进行链接。链接的时候需要用到的两个库:</span><span class="sc5">kernel32.lib</span><span class="sc0">和</span><span class="sc5">user32.lib</span><span class="sc0">。
本帖的附件包含了这两个文件。也可以从</span><span class="sc5">VC6</span><span class="sc0">的</span><span class="sc5">Lib</span><span class="sc0">文件夹找到。
</span><span class="sc2">4</span><span class="sc0">、链接后得到的</span><span class="sc5">EXE</span><span class="sc0">可以直接双击运行。效果和</span><span class="sc5">VC</span><span class="sc4">++</span><span class="sc0">编写的一样。
区别在于,汇编编写的程序非常小,只有</span><span class="sc2">3KB</span><span class="sc0">左右。
</span><span class="sc1">;外部函数(从Lib中引用)</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__GetModuleHandleA@4</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__LoadCursorA@8</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__RegisterClassExA@4</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__CreateWindowExA@48</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__ShowWindow@8</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__GetMessageA@16</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__TranslateMessage@4</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__DispatchMessageA@4</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__UnregisterClassA@8</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__ExitProcess@4</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__UpdateWindow@4</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__DefWindowProcA@16</span><span class="sc0">
</span><span class="sc9">extern</span><span class="sc0"> </span><span class="sc5">__imp__PostQuitMessage@4</span><span class="sc0">
</span><span class="sc1">;输出函数</span><span class="sc0">
</span><span class="sc9">global</span><span class="sc0"> </span><span class="sc5">_EntryPoint</span><span class="sc0">
</span><span class="sc9">global</span><span class="sc0"> </span><span class="sc5">_WndProc@16</span><span class="sc0"></span><span class="sc1">;允许别的C/C++模块调用WndProc</span><span class="sc0">
</span><span class="sc1">;宏定义</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">WM_DESTROY</span><span class="sc0"> </span><span class="sc2">0x0002</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">IDC_ARROW</span><span class="sc0"> </span><span class="sc2">32512</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">CW_USEDEFAULT</span><span class="sc0"> </span><span class="sc2">0x80000000</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">WS_CAPTION</span><span class="sc0"> </span><span class="sc2">0x00C00000</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">WS_SYSMENU</span><span class="sc0"> </span><span class="sc2">0x00080000</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">WS_THICKFRAME</span><span class="sc0"> </span><span class="sc2">0x00040000</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">WS_MINIMIZEBOX</span><span class="sc0"> </span><span class="sc2">0x00020000</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">WS_MAXIMIZEBOX</span><span class="sc0"> </span><span class="sc2">0x00010000</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">WS_VISIBLE</span><span class="sc0"> </span><span class="sc2">0x10000000</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">WS_OVERLAPPEDWINDOW</span><span class="sc0"> </span><span class="sc5">WS_VISIBLE</span><span class="sc4">|</span><span class="sc5">WS_CAPTION</span><span class="sc4">|</span><span class="sc5">WS_SYSMENU</span><span class="sc4">|</span><span class="sc5">WS_THICKFRAME</span><span class="sc4">|</span><span class="sc5">WS_MINIMIZEBOX</span><span class="sc4">|</span><span class="sc5">WS_MAXIMIZEBOX</span><span class="sc0">
</span><span class="sc9">%define</span><span class="sc0"> </span><span class="sc5">SW_SHOWNORMAL</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span><span class="sc1">;代码段</span><span class="sc0">
</span><span class="sc4">[</span><span class="sc9">section</span><span class="sc0"> </span><span class="sc10">.text</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc1">;---===***###<<<入口点>>>###***===---</span><span class="sc0">
</span><span class="sc5">_EntryPoint</span><span class="sc4">:</span><span class="sc0">
</span><span class="sc1">;获取hInstance</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__GetModuleHandleA@4</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">mov</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">wcex.hInstance</span><span class="sc4">],</span><span class="sc8">eax</span><span class="sc0">
</span><span class="sc1">;填写WNDCLASSEX</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">IDC_ARROW</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__LoadCursorA@8</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">mov</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">wcex.hCursor</span><span class="sc4">],</span><span class="sc8">eax</span><span class="sc0">
</span><span class="sc1">;注册窗口类</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">wcex</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__RegisterClassExA@4</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc1">;创建窗口</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0"> </span><span class="sc1">;lpParam</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc10">dword</span><span class="sc4">[</span><span class="sc5">wcex.hInstance</span><span class="sc4">]</span><span class="sc0"></span><span class="sc1">;hInstance</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0"> </span><span class="sc1">;hMenu</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0"> </span><span class="sc1">;hWndParent</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">666</span><span class="sc0"> </span><span class="sc1">;Height</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">888</span><span class="sc0"> </span><span class="sc1">;Width</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">CW_USEDEFAULT</span><span class="sc0"> </span><span class="sc1">;Y</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">CW_USEDEFAULT</span><span class="sc0"> </span><span class="sc1">;X</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">WS_OVERLAPPEDWINDOW</span><span class="sc0"> </span><span class="sc1">;dwStyle</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">szWindowName</span><span class="sc0"> </span><span class="sc1">;lpWindowName</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">szClassName</span><span class="sc0"> </span><span class="sc1">;lpClassName</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0"> </span><span class="sc1">;dwExStyle</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__CreateWindowExA@48</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">mov</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">hWnd</span><span class="sc4">],</span><span class="sc8">eax</span><span class="sc0">
</span><span class="sc1">;显示窗口</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">SW_SHOWNORMAL</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc8">eax</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__ShowWindow@8</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc1">;刷新窗口</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc10">dword</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">hWnd</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__UpdateWindow@4</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc1">;消息循环</span><span class="sc0">
</span><span class="sc5">.msgloop</span><span class="sc4">:</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">msg</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__GetMessageA@16</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">or</span><span class="sc0"> </span><span class="sc8">eax</span><span class="sc4">,</span><span class="sc8">eax</span><span class="sc0">
</span><span class="sc6">jz</span><span class="sc0"> </span><span class="sc5">.loopout</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">msg</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__TranslateMessage@4</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">msg</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__DispatchMessageA@4</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">jmp</span><span class="sc0"> </span><span class="sc5">.msgloop</span><span class="sc0">
</span><span class="sc5">.loopout</span><span class="sc4">:</span><span class="sc0">
</span><span class="sc1">;取消注册</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc10">dword</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">wcex.hInstance</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc5">szClassName</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__UnregisterClassA@8</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc1">;退出程序</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__ExitProcess@4</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc6">ret</span><span class="sc0">
</span><span class="sc1">;WndProc消息处理函数</span><span class="sc0">
</span><span class="sc5">_WndProc@16</span><span class="sc4">:</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc8">ebp</span><span class="sc0">
</span><span class="sc6">mov</span><span class="sc0"> </span><span class="sc8">ebp</span><span class="sc4">,</span><span class="sc8">esp</span><span class="sc0">
</span><span class="sc5">.destroy</span><span class="sc4">:</span><span class="sc0">
</span><span class="sc6">cmp</span><span class="sc0"> </span><span class="sc10">dword</span><span class="sc4">[</span><span class="sc8">ebp</span><span class="sc4">+</span><span class="sc2">12</span><span class="sc4">],</span><span class="sc5">WM_DESTROY</span><span class="sc1">;处理WM_DESTROY</span><span class="sc0">
</span><span class="sc6">jnz</span><span class="sc0"> </span><span class="sc5">.default</span><span class="sc0">
</span><span class="sc6">push</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc6">call</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__PostQuitMessage@4</span><span class="sc4">]</span><span class="sc1">;PostQuitMessage(0);</span><span class="sc0">
</span><span class="sc6">xor</span><span class="sc0"> </span><span class="sc8">eax</span><span class="sc4">,</span><span class="sc8">eax</span><span class="sc0"> </span><span class="sc1">;返回0</span><span class="sc0">
</span><span class="sc6">pop</span><span class="sc0"> </span><span class="sc8">ebp</span><span class="sc0">
</span><span class="sc6">ret</span><span class="sc0"> </span><span class="sc2">16</span><span class="sc0">
</span><span class="sc5">.default</span><span class="sc4">:</span><span class="sc0"> </span><span class="sc1">;其它消息</span><span class="sc0">
</span><span class="sc6">pop</span><span class="sc0"> </span><span class="sc8">ebp</span><span class="sc0">
</span><span class="sc6">jmp</span><span class="sc0"> </span><span class="sc4">[</span><span class="sc5">__imp__DefWindowProcA@16</span><span class="sc4">]</span><span class="sc1">;return DefWindowProc(hWnd,Msg,wParam,lParam);</span><span class="sc0">
</span><span class="sc1">;数据段</span><span class="sc0">
</span><span class="sc4">[</span><span class="sc9">section</span><span class="sc0"> </span><span class="sc9">.data</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc5">szClassName</span><span class="sc0"> </span><span class="sc9">db</span><span class="sc0"> </span><span class="sc3">"CLASS_HELLO"</span><span class="sc4">,</span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">szWindowName</span><span class="sc0"> </span><span class="sc9">db</span><span class="sc0"> </span><span class="sc3">"Hello world!"</span><span class="sc4">,</span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">wcex</span><span class="sc4">:</span><span class="sc0"> </span><span class="sc1">;WNDCLASSEX结构</span><span class="sc0">
</span><span class="sc5">.cbSize</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">48</span><span class="sc0">
</span><span class="sc5">.style</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">.lpfnWndProc</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc5">_WndProc@16</span><span class="sc0">
</span><span class="sc5">.cbClsExtra</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">.cbWndExtra</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">.hInstance</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">.hIcon</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">.hCursor</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">.hbrBackground</span><span class="sc0"></span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">6</span><span class="sc0">
</span><span class="sc5">.lpszMenuName</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc5">.lpszClassName</span><span class="sc0"></span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc5">szClassName</span><span class="sc0">
</span><span class="sc5">.hIconSm</span><span class="sc0"> </span><span class="sc9">dd</span><span class="sc0"> </span><span class="sc2">0</span><span class="sc0">
</span><span class="sc1">;自动分配段</span><span class="sc0">
</span><span class="sc4">[</span><span class="sc9">section</span><span class="sc0"> </span><span class="sc10">.bss</span><span class="sc4">]</span><span class="sc0">
</span><span class="sc5">hWnd</span><span class="sc0"> </span><span class="sc9">resd</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span><span class="sc5">msg</span><span class="sc4">:</span><span class="sc0">
</span><span class="sc5">.hwnd</span><span class="sc0"> </span><span class="sc9">resd</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span><span class="sc5">.message</span><span class="sc0"> </span><span class="sc9">resd</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span><span class="sc5">.wParam</span><span class="sc0"> </span><span class="sc9">resd</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span><span class="sc5">.lParam</span><span class="sc0"> </span><span class="sc9">resd</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span><span class="sc5">.time</span><span class="sc0"> </span><span class="sc9">resd</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span><span class="sc5">.ptx</span><span class="sc0"> </span><span class="sc9">resd</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span><span class="sc5">.pty</span><span class="sc0"> </span><span class="sc9">resd</span><span class="sc0"> </span><span class="sc2">1</span><span class="sc0">
</span></div> 要达到华丽效果,估计太复杂了。 需要更多实例 关键是这个思路太有价值了,谢谢分享。
页:
[1]