用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汇编程序相关推荐

  1. 【C++】利用Visual Studio 2008编写C++,Visual Studio 2008的基本使用

    现在很多高校还是利用Visual C++ 6.0这一经典版本在教C++,很多人对自己第一个程序的回忆是利用Visual C++ 6.0用C语言写的Helloworld,之后再学习C++的类,不过还是在 ...

  2. 第五篇:Visual Studio 2008 Web开发使用的新特性

    第五篇:Visual Studio 2008 Web开发使用的新特性 本篇翻译自MSDN. .NET Framwork 3.5与Visual Studio 2008 包含很多新特性.AJAX的Web开 ...

  3. Visual Studio 2008 和 .NET 3.5 发布了

    转自:http://blog.joycode.com/scottgu/archive/2007/11/20/111568.aspx [原文地址]Visual Studio 2008 and .NET ...

  4. Visual Studio 2008 + Visual Assist X的CUDA2.3编译环境设置[转]

    Visual Studio 2008 + Visual Assist X的CUDA2.3编译环境设置 发表时间:2010-01-21 装了这些可已在VC2008里运行SDK里边的一些例子了,但是编程很 ...

  5. [译]Visual Studio 2008 Code Metrics

    代码度量(Code Metrics)是用来测量专业标准的软件特性. 在某些方面,它提供了量化的有用反馈给开发者. 查看代码度量值很简单:在项目或解决方案上按右键,选择"Calculate C ...

  6. 为Visual studio 2008 添加汇编工程模板

    看Intel 汇编语言程序设计(第五版)时说可以使用visual studio进行汇编开发和编译,但visual studio 系列工具没有相应的汇编模板.经过研究发现可以手工修改,添加拥有<I ...

  7. [Ray Linn]用Visual Studio 2008开发IE BHO (浏览器帮助对象)之一

    这篇文章是应同学们的要求写的,以前都是用VC++ 6.0+Platform SDK完成的. 迁移到 VS2008之后,原来Visual Studio 6.0里的BHO向导不复存在,因此特此不厌其烦,详 ...

  8. 如何更改Visual Studio 2008中类文件引用的默认名称空间?

    在编写程序的时候,如果某些名称空间经常用到,每次创建一个文件的时候,都需要手工添加名称空间,是不是很烦人呢?多说人会回答:是的.如果新建文件的时候就自动加上自己需要的名称空间该多好啊.:).这个想法不 ...

  9. Visual Studio 2008 十大新功能

        VS2005还没有最终稳定的版本,但是我想在微软的某个办公室,一个项目组正在研究发展Visual Studio 2008这个版本.我看了一下表,现在的时间是公元2006-3-9日,离微软发布V ...

最新文章

  1. 26期20180607 set_uid stick_bit 软硬连接
  2. 还应该如何实现“模板化函数指针”?
  3. 从实验现象详细分析BGP的路由策略与选路原则
  4. IOS基础之UIDynamicAnimator动力学入门-02
  5. [NewLife.XCode]实体工厂(拦截处理实体操作)
  6. Windows下启动Apache报错:ServerRoot must be a valid directory
  7. 目标检测(三)--DPM
  8. 20145202马超《java》实验5
  9. 百度C语言面试题2017,百度C语言面试题
  10. 计算机应用基础165791,[2018年最新整理]人大网大计算机应用基础试题答案.doc
  11. 计算机四级网络工程师
  12. 虚拟IP人物,同时空出现——思念党的福音
  13. Elasticsearch设置中文分词
  14. 驱动字库芯片GT23L24M0140
  15. css简介,基本语法
  16. HTML进阶- 4.6 补充一些不常用的元素
  17. opensource项目_Opensource.com 2014年年度阅读清单
  18. 【React Native】集成声网Agora语音通讯
  19. 国内首个“进站充电”有轨电车在南京开通试运行
  20. c++ SFML ftp删除文件

热门文章

  1. Hadoop_10_HDFS 的 DataNode工作机制
  2. SharePoint 2013 基础版 离线安装步骤
  3. C#快速找出磁盘内的所有文件
  4. HDU X问题 中国剩余定理--求满足条件的个数
  5. 分享最新40款免费的 WordPress 主题(上篇)
  6. VMWare 全屏后最小化死机
  7. 让你的IE浏览器支持HTML5标准方法代码
  8. java 静态导入_Java中静态导入的使用
  9. python带我起飞_Python带我起飞:入门、进阶、商业实战
  10. css3切角文本框_CSS3:linear-gradient切角画册