教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
firefox火狐浏览器下载
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
精彩图库
  当前位置: 库库中文网 · 系统编程教程 · 汇编语言 · 汇编语言技巧教程

hello,world!win32汇编小程序

学院最新推荐文章
教程推荐
『hello,world!win32汇编小程序』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2006-8-2 
"hello,world!"win32汇编小程序

 
"hello,world!"win32汇编小程序szText    db "Hello, world!",0
szCaption db "Win32Asm",0

        .code
start:
        push MB_OK
        lea eax,szCaption
        push eax
        lea eax,szText
        push eax
        push NULL
        call messageboxa
        xor eax,eax
        push eax
        call exitprocess
        end start
--------------------------------------------------
编译链接:
    分下面两步进行:
        ml   /c /coff 3.asm  
        link /subsystem:windows /libpath:d:masm7lib 3.obj
        
    第一步编译生成3.obj文件
    /c 表示只编译,不链接
    /coff 表示生成COFF格式的目标文件
    
    第二步链接生成3.exe文件
    /subsystem:windows 表示生成windows文件
    /libpath:d:masm7lib 表示引入库的路径为:d:masm7lib。
    在安装Masm32后,引入库位于Masm32Lib目录下。
    
    也可设置环境变量Lib的值:在dos提示符下键入Set Lib=d:masm7lib,这样“链接”就可简单写成:
    link /subsystem:windows 3.obj,试想一下,在程序调试过程中,修改源程序是常用的事啦,每次编译链接都要带/libpath:...那该有多烦人呢。当然,我们也可在源程序中直接给出引入库的位置,这样,链接时就方便啦,如下:
    
    includelib d:masm7libkernel32.lib
    includelib d:masm7libuser32.lib
--------------------------------------------------
执行:在dos提示符下键入3,回车,出现一个消息框,哈哈,真正的Win32程序!

      

--------------------------------------------------
深入分析:
    看一下源程序,有这么两行:call messageboxacall exitprocess。大家一看都知道,这是子程序调用,但是我们并没写这样的子程序,事实上,这些是API函数。作为函数,我们在调用时可能需要传送给函数一些参数,程序怎么知道传送的参数有哪些,类型是什么呢?就是通过函数原型定义,如下所示:
    ExitProcess PROTO :DWORD
    MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
    可以看出,ExitProcess有一个参数,MessageBoxA有四个参数,这些参数都是DWORD类型。
    
    在Win32中,参数的传递都是通过堆栈来完成的。象MessageBoxA这个函数有四个参数,究竟是左边的先压入堆栈还是右边的先入栈呢?.model flat,stdcall给出了答案。stdcall 指定参数是从右到左压入堆栈的,且调整堆栈是在子程序返回时完成的。在源程序中不需要用“add sp,值”来保持堆栈平衡。对MessageBox,在API手册中是这样定义的:
        int MessageBox(
            HWND hWnd,          // handle of owner window
            LPCTSTR lpText,     // address of text in message box
            LPCTSTR lpCaption,  // address of title of message box
            UINT uType          // style of message box
            )
      ;所以会有我们的程序段:    看看上面的程序,不难想到,假如在写程序时,少往堆栈里压入一个数据,那将是一个致命的错误。能不能将这种检查参数个数是否匹配的工作交给计算机来完成呢?这是可以的,INVOKE指令可以帮助我们完成这样的工作。假如你的参数个数不正确,连接器将给出错误提示。所以,极力建议你使用invoke代替call来调用子程序,当然,这不是绝对的。使用invoke上面的指令就可简写成下面的样子,看起来简炼多啦,查错也方便啦!
        invoke messageboxa, NULL,addr szText,addr szCaption,MB_OK

   另外,像NULL,MB_OK都是一些常量,这样的常量有很多,还有很多的结构,如果在我们的程序中一开始都写这么多的东西,可能一下子就把你吓怕啦,也容易出错,更不便于看程序的主要部分。hutch整理的windows.inc包含了WIN32编程所需要的常量和结构体的定义,我们可简单的用一个include指令将这些常量和结构的定义插入到我们的文件中:
        include d:masm32includewindows.inc
  
   但是windows.inc中并不包含函数原型的声明,还要从其他的头文件中得到函数原型的声明,比如:messageboxa的原型声明在user32.inc文件中,exitprocess在kernel32.inc文件中。这些头文件都放在 masm32include文件夹下。
  
   还有,要用windows.inc,必须使用option casemap:none,它的意思是告诉 MASM 要区分符号的大小写,譬如:start和START是不一样的。否则,一个小小的程序,可能会出成百上千的错误呀!
  
   其他的,就不再细说啦,到此,上面的程序可重新修改如下:
-----------------------------------------------------------------
;最终的结果;32位程序,要用flat啦!;stadcall,标准调用;数据区,定义2个字符串szText    db "Hello, world!",0
szCaption db "Win32Asm",0

        .code;代码开始执行处        /I d:masm7include 表示*.inc文件的位置,也可设置环境变量Set include=d:masm7include来简化操作,也可在程序中明确指出*.inc的位置。
        
    前面讲的都是用两条指令来完成编译链接,实际上用一条指令也可完成,如下:
    ml /coff /I d:masm7include 3.asm /link /subsystem:windows /libpath:lib
    若*.inc及引入库在源程序中都明确指出其位置,则可简化为:
    ml /coff 3.asm /link /subsystem:windows
    
    累,先写到这儿吧!
----------------------------怜香整理于 2003/02/12 -----------------

作者:vargas 来源:ProEngineer
】【关闭窗口
·上页:
·下页:
相关文章
     系统编程教程 - 汇编语言技巧教程
普通教程透过汇编另眼看世界之类成员函数
普通教程MASM5命令行
普通教程透过汇编另眼看世界之DLL导出函
普通教程透过汇编另眼看世界之多继承下地
普通教程鼠标屏幕取词地原码! 贴出来讨论
普通教程与afreez全部学习DirectFB之:编
普通教程汇编语言小节(1)
普通教程汇编语言小结(2)
普通教程ATM教学文章:数据链路层
普通教程hello,world!win32汇编小程序
普通教程重读《设计模式》之学习笔记(六
普通教程敏捷设计办法地一点思考
精彩图片汇集
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Virus. Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光