" 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格式目标文件

  第 2步链接生成3.exe文件

  /subsystem:windows 表示生成windows文件

  /libpath:d:masm7lib 表示引入库路径为:d:masm7lib

  在安装Masm32后引入库位于Masm32Lib目录下

  也可设置环境变量Lib值:在dos提示符下键入Set Lib=d:masm7lib这样“链接”就可简单写成:

  link /subsystem:windows 3.obj试想调试过程中修改源是常用事啦每次编译链接都要带/libpath:...那该有多烦人呢当然我们也可在源中直接给出引入库位置这样链接时就方便啦,如下:

  lib d:masm7libkernel32.lib

  lib d:masm7libuser32.lib

  --------------------------------------------------

  执行:在dos提示符下键入3回车出现个消息框哈哈真正Win32

  --------------------------------------------------

  深入分析:

  看下源有这么两行:call messageboxacall exitprocess大家看都知道这是子但是我们并没写这样事实上这些是API作为我们在时可能需要传送给些参数如何知道传送参数有哪些类型是什么呢?就是通过原型定义如下所示:

  ExitProcess PROTO :DWORD

  MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD

  可以看出ExitProcess有个参数MessageBoxA有 4个参数这些参数都是DWORD类型

  在Win32中参数传递都是通过堆栈来完成象MessageBoxA这个有 4个参数究竟是左边先压入堆栈还是右边先入栈呢?.model flat,stdcall给出了答案stdcall 指定参数是从右到左压入堆栈且调整堆栈是在子返回时完成在源中不需要用“add sp,值”来保持堆栈平衡对MessageBox在API手册中是这样定义:

     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

   另外像NULLMB_OK都是些常量这样常量有很多还有很多结构如果在我们开始都写这么多东西可能下子就把你吓怕啦也容易出错更不便于看主要部分hutch整理windows.inc包含了WIN32编程所需要常量和结构体定义我们可简单指令将这些常量和结构定义插入到我们文件中:

   d:masm32windows.inc

   但是windows.inc中并不包含原型声明还要从其他头文件中得到原型声明比如:messageboxa原型声明在user32.inc文件中exitprocess在kernel32.inc文件中这些头文件都放在 masm32文件夹下

   还有要用windows.inc必须使用option map:none意思是告诉 MASM 要区分符号大小写譬如:start和START是不否则个小小可能会出成百上千呀!

   其他就不再细说啦到此上面可重新修改如下:

  -----------------------------------------------------------------

  ;最终结果;32位要用flat啦!;stadcall,标准;数据区定义2个串szText  db "Hello, world!",0

  szCaption db "Win32Asm",0

  .code;代码开始执行处    /I d:masm7 表示*.inc文件位置也可设置环境变量Set =d:masm7来简化操作也可在中明确指出*.inc位置

  前面讲都是用两条指令来完成编译链接实际上用条指令也可完成如下:

  ml /coff /I d:masm7 3.asm /link /subsystem:windows /libpath:lib



  若*.inc及引入库在源中都明确指出其位置则可简化为:

  ml /coff 3.asm /link /subsystem:windows

  累先写到这儿吧!



Tags: 

延伸阅读

最新评论

发表评论