用Visual Studio 2015 编写 MASM 汇编程序(二)从头开发一个Win32汇编程序
一,建立一个VC的控制台类型的空工程:
1,从VS菜单中选择“文件”->“新建”->“项目”。

2,在新建项目中选择:“Visual c++”->"Win32"->"Win32控制台应用程序",随后输入工程名称,随后点击“确定”按钮。

3,随后点击“下一步”按钮。

4,随后选择“控制台应用程序”->"空项目",随后点击“完成”按钮。

到这里,我们就创建了一个VC的控制台类型的空项目。
二,编写第一个MASM的Win32汇编窗口程序。
1,在工程名称上面鼠标右键,随后在右键菜单上点击“添加”->“新建项”。

2,在“添加新项”对话框中选择“C++文件(.cpp)”,随后在下面的文件名称中输入你想要的文件名,注意文件的扩展名一定是“asm”,我使用的文件名称是“FirstWindow.asm”,随后点击“添加”按钮。

3,这是创建了我要创建的汇编程序的截图,已经创建了一个空白的汇编程序,需要在这里加入汇编程序代码。

三,对Win32汇编工程设置,编写汇编程序,编译这个汇编程序。
1,设置工程的依赖性。
A,鼠标右键工程名称,在右键菜单中选择“生成依赖项”->“生成自定义”。

B,随后选中“masm”,随后点击“确定”按钮。

2,添加汇编程序文件,编写汇编程序。
A,工程名称上面鼠标右键,在右键菜单中点击“添加”->"新建项"。

B,选择“C++文件(.cpp)”,随后在下面的名称中输入我们要使用的程序文件名称,注意这个文件扩展名必须是“asm”,我使用的文件名是"FirstWindow.asm",随后点击“添加”按钮。

C,编写汇编代码。

全部汇编源码:
.
.model flat,stdcall
option casemap:none
;---------------------------------------------------------------------------------
; Include 文件定义 comment * 多行注释
include \masm32\include\windows.inc
include \masm32\include\gdi32.inc
includelib \masm32\includelib\gdi32.lib
include \masm32\include\user32.inc
includelib \masm32\includelib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\includelib\kernel32.lib
* ;当前正在引入的inc和lib
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib ;---------------------------------------------------------------------------------
; 数据段(未初始化的变量)
.data?
hInstance dd ?
hWinMain dd ? bResult dd ? ;运行结果 .const
szClassName db 'MyClass',
szCaptionMain db 'My first Window !',
szText db 'Win32 Assembly, Simple and powerful !', szRegisterSuccess db '注册窗口成功!', ;操作成功的提示信息 szAppName db 'FirstMASM', ;---------------------------------------------------------------------------------
; 代码段
.code ;---------------------------------------------------------------------------------
;windows窗口程序的入口函数
WinMainProc proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG ;得到当前程序的句柄
invoke GetModuleHandle,NULL
mov hInstance,eax ;给当前操作分配内存
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ;得到光标
invoke LoadCursor,,IDC_ARROW
mov @stWndClass.hCursor,eax ;从eax中取出光标句柄,并设置到窗口类中
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset DoMessageProc
mov @stWndClass.hbrBackground,COLOR_WINDOW +
mov @stWndClass.lpszClassName,offset szClassName invoke RegisterClassEx,addr @stWndClass ;注册窗口类 mov bResult,eax ;得到注册窗口结果 ;对注册窗口类结果判断
.if bResult==
invoke ExitProcess,NULL ;注册窗口类失败,直接退出当前程序
.else
invoke MessageBox,NULL,offset szRegisterSuccess,offset szAppName,MB_OK
.endif ;---------------------------------------------------------------------------------
; 建立并显示窗口
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
,,,,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain ; 消息循环
.while TRUE
invoke GetMessage,addr @stMsg,NULL,, .if eax ==
.break
.endif invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret WinMainProc endp ;---------------------------------------------------------------------------------
; 处理windows消息的过程,Windows的回调函数
DoMessageProc proc uses ebx edi esi hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc mov eax,uMsg .if eax == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke EndPaint,hWnd,addr @stPs
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif xor eax,eax
ret DoMessageProc endp ;---------------------------------------------------------------------------------
;程序入口点,启动WinMainProc函数
start:
call WinMainProc
invoke ExitProcess,NULL
end start
到这里,建立一个汇编工程,并且编写了汇编程序代码,但是还是不能编译,需要进一步对工程设置。
3,对"Microsoft Macro Assembler"的设置。
用Visual Studio 2015 编写 MASM 汇编程序(二)从头开发一个Win32汇编程序的更多相关文章
- (英文版)使用Visual Studio 2015 编写 MASM 汇编程序!
原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject Getting Started with MA ...
- 用Visual Studio 2015 编写 MASM 汇编程序(一)环境配置
原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject 下面内容根据上面文章翻译整理而来! 开发32位 ...
- 用Visual Studio 2015 编写驱动之前一定要注意的问题!!!
如果你确定要使用Visual Studio 2015 编写驱动,那么在你安装Visual Studio 2015 和WDK之前,一定一定要注意一件事情,那就是确保SDK和WDK版本保持一致,切记切记! ...
- ASP.NET 5系列教程 (五):在Visual Studio 2015中使用Grunt、Bower开发Web程序
基于Visual Studio 2015,你可以: 方便的管理前端包,如jQuery, Bootstrap, 或Angular. 自动运行任务,如LESS.JavaScript压缩.JSLint.Ja ...
- 用Visual Studio 2015 编写第一个UMDF驱动遇到的问题!!
前提:Visual Studio 2015已经成功安装了驱动环境,WDK都已经完全正常安装了,在Visual Studio 2015的菜单可以看到"Driver"菜单项了.这说明已 ...
- Visual Studio 2015 预览版 - 支持跨平台开发Android/iOS应用程序(内置安卓模拟器)
微软最近的惊人举动真多,对普通消费者Office 移动版宣布免费,对开发者也发布了完全免费的 VS2013 社区版! 不仅如此,就连 .Net 开发框架环境也竟然「开源」并且跨平台支持 Mac 及 L ...
- Windows 10和Visual Studio 2015 能给.Net方向的开发从业者带来什么?
.Net 多年前我们选择了你,现在在当前的移动互联网热火朝天的时代,你能给我们什么样的惊喜?面对IOS和android的势头,windows的移动端能否实现三国鼎立? windows 10 号称统一各 ...
- Visual Studio 2015 使用ODP.net进行EF开发
刚转了新公司,以前公司都是用VS+MSSQL作为开发工具的 现在新公司由于数据库是Oracle,而且新公司比较小规模,开发团队也没有什么规范 访问数据库的方式一直使用ADO.net的DataTable ...
- Visual Studio 2015 前端开发工作流
Visual Studio 2015 CTP 5,全称为 Visual Studio 2015 Community Technology Preview 5,意为社区技术预览版,之前的版本为:Visu ...
随机推荐
- maven依赖 dependency中scope=compile 和 provided区别
问题再现 上次这边朋友问我一个问题,就是他们在pom.xml中的dependency中,看到有一些是provided的情况,比如如下: <dependency> <groupId&g ...
- 压测引起的 nginx报错 502 no live upstreams while connecting to upstream解决
对系统的某个接口进行极限压测,随着并发量上升,nginx开始出现502 no live upstreams while connecting to upstream的报错,维持最大并发量一段时间,发现 ...
- [Design Patterns] 02. Structural Patterns - Facade Pattern
前言 参考资源 史上最全设计模式导学目录(完整版) 只把常用的五星的掌握即可. 外观模式-Facade Pattern[学习难度:★☆☆☆☆,使用频率:★★★★★] 深入浅出外观模式(一):外观模式概 ...
- mac下安装face_recognition
安装依赖库: 1.安装cmake (是一个跨平台的安装工具) brew install cmake 2.安装boost.boost-python(C++的程序库) brew install boost ...
- [LeetCode] 445. Add Two Numbers II 两个数字相加之二
You are given two linked lists representing two non-negative numbers. The most significant digit com ...
- Kubernates之从pod中拷贝文件到宿主机
想从k8s的pod中拷贝文件到宿主机,kubectl 的cp命令,但是网上搜索了下,感觉有点乱,自己记录下. hadoop这个namespace下,有个hadoop-hadoop-yarn-rm-0的 ...
- ref,out,int参数复习
ref 结构是值类型,按值传递.通过关键字ref,也可以通过引用传递结构. public static void ChangeA(ref A a) { a.X = ; } //如果A是结构类型,就添加 ...
- lay-verify进行非必填项校验
它默认都验证了! 需要调整源码!form.js,layui.all.js this.config = { verify: { required: [/[\S]+/, "必填项不能为空&quo ...
- Java/C++ 学习资源推荐
列举一下我所知道的一些学习资源,希望能对大家有所帮助 Java学习资源资源: 1.尚学堂 Java300集 链接:https://study.163.com/course/introduction.h ...
- 阿里P8架构师谈:阿里双11秒杀系统如何设计?
秒杀是电商业务里的标志性事件,这样的典型高并发场景会遇见什么样的挑战呢,然后又是如何来解决的呢? 秒杀活动场景 淘宝双11秒杀场景,大量的用户短时间内涌入,瞬间流量巨大(高并发),比如:1000万人同 ...