用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 ...
随机推荐
- Kali Linux之速会BEEF & XSS攻击
beef 安装指南:https://github.com/beefproject/beef/wiki/Installation 升级ruby指南:https://www.cnblogs.com/waw ...
- ThreadLocal:的面试
ThreadLocal: 为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变 ...
- 微信小程序开发——使用第三方插件生成二维码
需求场景: 小程序中指定页面需要根据列表数据生成多张二维码. 实现方案: 鉴于需要生成多张二维码,可以将生成二维码的功能封装到组件中,直接在页面列表循环中调用就好了.也可以给组件添加slot,在页面调 ...
- [转]图片Premultiplied Alpha到底是干嘛用的
Premultiplied Alpha 这个概念做游戏开发的人都不会不知道.Xcode 的工程选项里有一项 Compress PNG Files,会对 PNG 进行 Premultiplied Alp ...
- xmlns:amq="http://activemq.apache.org/schema/core"报错
如题,项目集成ActiveMQ是配置文件报错 原因是:Spring命名空间配置错误,缺少相应的spring-bean.很显然,引用不到就是没有jar包啊. 我的解决办法,早pom.xml引用依赖 &l ...
- Mysql查询的执行顺序
顺序: FROM JOIN ON WHERE GROUP BY (从此处开始可以使用select中指定的别名) AVG.SUM.MAX HAVING SELECT DISTINCT ORDER BY ...
- 采用EasyDSS视频点播服务器搭建企业私有化的音视频多媒体、短视频、视频服务网站与管理后台
最近有越来越多的用户咨询关于视频点播的功能,主要需求就是集中于如何搭建专属的私有化视频点播平台: 实现的功能类似于,对应自身拥有的视频文件,需要发布到一个网站,其他用户都可以实现点播观看. 针对于类似 ...
- java获取当前项目路径System.getProperty("user.dir")
System.getProperty("user.dir") 就是项目的文件夹绝对路径
- Appium移动端自动化测试--录制测试用例并运行
目录 文章目录如下 录制用例并执行 1.使用Appium desktop录制用例 2.安装Pythony依赖Appium-Python-Client 3.增加隐式等待增强稳定性 4.重新运行 文章目录 ...
- Linux中的两个经典宏定义:获取结构体成员地址,根据成员地址获得结构体地址;Linux中双向链表的经典实现。
倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offse ...