用Visual Studio 2008编写Win32汇编程序
用Visual Studio 2008编写Win32汇编程序
Binhua Liu
本文分为以下三个部分:
1)用Visual Studio2008建立一个汇编控制台工程
2)汇编程序模板
3)汇编编写的Hello World程序
用Visual Studio2008建立一个汇编控制台工程
打开Visual Studio 2008,创建一个C++空工程
在工程中添加一个.asm文件:
在solution Explorer上点击右键,选择Add->New Item
选择C++文件,把其命名为.asm结尾的文件.
打开主菜单上的Project->Custom Build Rule。 勾选Microsoft Macro Assembler
在主菜单选择Project->Properties,在打开的对话框左侧菜单中选择Configuration Properties->Linker->System,在右侧SubSystem栏中选择Console(/SUBSYSTEM:CONSOLE)
如果代码中引用了非默认路径下的头文件,需要添加头文件路径:在主菜单中选择Project->Properties,在打开的对话框左侧菜单中选择Configuration Properties->Microsoft Macro Assembler->General,在右侧Include Paths栏中添加头文件文件夹。
如果需要添加额外的链接库,在主菜单选择Project->Properties,在打开的对话框左侧菜单中选择Configuration Properties->Linker->Input,在右侧Additional Dependencies中键入链接库名。
如果要添加的链接库不在默认路径下,需要添加链接库路径:在主菜单选择Project->Properties,在打开的对话框左侧菜单中选择Configuration Properties->Linker->General,在右侧Additional Library Directories栏中键入链接库目录名。
好了,我们已经配置好编译环境,接下来的事就是写我们的第一个汇编程序。
汇编程序模板
我们编写汇编程序时,不用每次都从头写起,可以把程序的框架保存起来,每次编写汇编时复制张贴做细微修改即可,下面即是一个框架代码:
TITLE It is a template
.386
.MODEL flat,stdcall
ExitProcess PROTO, dwExitCode:DWORD
;include Irvine.inc.data
input BYTE "Hello World",0
Len DWORD $-input-1.code
main PROCmov eax,1INVOKE ExitProcess,0
main ENDP
END main
我们简单的分析一下这段代码:
1).386表示这是一个x86汇编程序
2).MODEL flat,stdcall. flat表示采用平坦分段模式,stdcall指使用INVOKE伪指令时,采用stdcall调用模式,因为Windows API函数是使用stdcall的。
3)ExitProcess PROTO, dwExitCode:DWORD ,这是一个函数声明,ExitProcess是一个Windows API函数,用于退出进程。函数的声明也可以包括在.inc头文件中,通过如include Irvine.inc 命令引用头文件。
4).data表示数据段开始,.code为代码段开始。
5)在主程序通过调用INVOKE ExitProcess,0 来退出进程。
在32位汇编编程中,不再使用系统中断命令,而是通过Windows API来进行IO调用。要使用Windows API程序,需要在汇编代码或者.inc头文件中对要使用的API函数进行声明,编译时要链接链接库kernel32.lib (工程默认会链接该链接库,在Linker->Input->Additional Dependencies,可以查看是否包含此链接库)
汇编编写的Hello World程序
该程序在控制台上打印“Hello World”:
TITLE HelloWorld
.386
.MODEL flat,stdcallGetStdHandle PROTO, ; get standard handlenStdHandle:DWORD ; type of console handleSTD_OUTPUT_HANDLE EQU -11 ; predefined Win API constantWriteConsole EQU <WriteConsoleA>WriteConsole PROTO, ; write a buffer to the consoleoutHandle:DWORD, ; output handlepBuffer:PTR BYTE, ; pointer to bufferbufsize:DWORD, ; size of bufferpCount:PTR DWORD, ; ptr to number of bytes writtenpReserved:DWORD ; (not used)ExitProcess PROTO, dwExitCode:DWORD.data
input BYTE "Hello World",0
Len DWORD $-input-1
handle DWORD ?
actualWrite DWORD ?.code
main PROCINVOKE GetStdHandle,STD_OUTPUT_HANDLEmov handle,EAXINVOKE WriteConsole,handle,OFFSET input,Len,OFFSET actualWrite,0 INVOKE ExitProcess,0
main ENDP
END main
参考
http://timerover.infor.org/Masm615/INCLUDE/SmallWin.inc
Intel汇编语言程序设计(第四版),Kip R.Irvine
http://msdn.microsoft.com/en-us/library/ms687401(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms683231(VS.85).aspx
声明
本文为Binhua Liu原创作品。本文允许复制,修改,传递,但不允许用于商业用途。转载请注明出处。本文发表于2010年7月13日。
转载于:https://www.cnblogs.com/Binhua-Liu/archive/2010/07/13/1776852.html
用Visual Studio 2008编写Win32汇编程序相关推荐
- 【C++】利用Visual Studio 2008编写C++,Visual Studio 2008的基本使用
现在很多高校还是利用Visual C++ 6.0这一经典版本在教C++,很多人对自己第一个程序的回忆是利用Visual C++ 6.0用C语言写的Helloworld,之后再学习C++的类,不过还是在 ...
- 第五篇:Visual Studio 2008 Web开发使用的新特性
第五篇:Visual Studio 2008 Web开发使用的新特性 本篇翻译自MSDN. .NET Framwork 3.5与Visual Studio 2008 包含很多新特性.AJAX的Web开 ...
- Visual Studio 2008 和 .NET 3.5 发布了
转自:http://blog.joycode.com/scottgu/archive/2007/11/20/111568.aspx [原文地址]Visual Studio 2008 and .NET ...
- Visual Studio 2008 + Visual Assist X的CUDA2.3编译环境设置[转]
Visual Studio 2008 + Visual Assist X的CUDA2.3编译环境设置 发表时间:2010-01-21 装了这些可已在VC2008里运行SDK里边的一些例子了,但是编程很 ...
- [译]Visual Studio 2008 Code Metrics
代码度量(Code Metrics)是用来测量专业标准的软件特性. 在某些方面,它提供了量化的有用反馈给开发者. 查看代码度量值很简单:在项目或解决方案上按右键,选择"Calculate C ...
- 为Visual studio 2008 添加汇编工程模板
看Intel 汇编语言程序设计(第五版)时说可以使用visual studio进行汇编开发和编译,但visual studio 系列工具没有相应的汇编模板.经过研究发现可以手工修改,添加拥有<I ...
- [Ray Linn]用Visual Studio 2008开发IE BHO (浏览器帮助对象)之一
这篇文章是应同学们的要求写的,以前都是用VC++ 6.0+Platform SDK完成的. 迁移到 VS2008之后,原来Visual Studio 6.0里的BHO向导不复存在,因此特此不厌其烦,详 ...
- 如何更改Visual Studio 2008中类文件引用的默认名称空间?
在编写程序的时候,如果某些名称空间经常用到,每次创建一个文件的时候,都需要手工添加名称空间,是不是很烦人呢?多说人会回答:是的.如果新建文件的时候就自动加上自己需要的名称空间该多好啊.:).这个想法不 ...
- Visual Studio 2008 十大新功能
VS2005还没有最终稳定的版本,但是我想在微软的某个办公室,一个项目组正在研究发展Visual Studio 2008这个版本.我看了一下表,现在的时间是公元2006-3-9日,离微软发布V ...
最新文章
- 26期20180607 set_uid stick_bit 软硬连接
- 还应该如何实现“模板化函数指针”?
- 从实验现象详细分析BGP的路由策略与选路原则
- IOS基础之UIDynamicAnimator动力学入门-02
- [NewLife.XCode]实体工厂(拦截处理实体操作)
- Windows下启动Apache报错:ServerRoot must be a valid directory
- 目标检测(三)--DPM
- 20145202马超《java》实验5
- 百度C语言面试题2017,百度C语言面试题
- 计算机应用基础165791,[2018年最新整理]人大网大计算机应用基础试题答案.doc
- 计算机四级网络工程师
- 虚拟IP人物,同时空出现——思念党的福音
- Elasticsearch设置中文分词
- 驱动字库芯片GT23L24M0140
- css简介,基本语法
- HTML进阶- 4.6 补充一些不常用的元素
- opensource项目_Opensource.com 2014年年度阅读清单
- 【React Native】集成声网Agora语音通讯
- 国内首个“进站充电”有轨电车在南京开通试运行
- c++ SFML ftp删除文件