飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8418|回复: 26

一步步跟我学Win32ASM(可视化编程)

[复制链接]

该用户从未签到

发表于 2006-9-12 16:25:05 | 显示全部楼层 |阅读模式
【文章标题】一步步跟我学Win32ASM(可视化编程)
【文章作者】hacker0058
【作者主页】hacker0058.ys168.com
【文章出处】www.chinapyg.com


1.前言:

      Win32ASM的编译器最常用的有两种:Borland公司的Tasm5.0和Microsoft的Masm6.11以上版本,两种编译器各有自己的优缺点
      
      
   但Masm在代码的优化上面好象比Tasm做得好,Masm和Tasm的宏语法有很多的不同,我的这个教程是以Masm格式写的。



2. Masm32的环境架设

  <1>下载与安装

      现在Masm32的最新版本是9.0的,我们可以在这里下载: http://www.pediy.com/tools/Compilers/masm32/m32v9r.zip
  
  要说明的是Masm32必须安装在磁盘分区跟目录,最好不要放在系统盘,以免重装系统时数据丢失!具体安装我就不多说了.

   <2>可视化编程
   
        Masm32是命令行的程序,每次写程序都要在命令行里输入这些重复的命令确实很累,能不能像VC那样可视化编程呢?
      
    答案是肯定的, RadASM就是这样的一个一个汇编集成开发工具,虽然名字是这么叫,其实它也是个通用的IDE,不但能做为常用的
   
    Masm,,Nasm,Tasm等编译器的IDE,还能做为VC,BC,LCC,html等的IDE,  下载地址: http://www.pediy.com/tools/Compilers/RadASM/HA_RadASM_2.2.0.9.rar

       下载会来是个压缩包,直接解要到与Masm32相同的磁盘分区,如: "D:\" ,解压完后打开所在文件夹,找到名为"masm.ini"的配

     置文件,搜索"Paths"找到下面的内容:
      
       [Paths]
       $A=C:\Masm32
       $B=$A\Bin
       $D=$R\AddIns
       $H=$A\Help
       $I=$A\Include
       $L=$A\Lib
       $P=$R\Masm\Projects
       $S=$R\Masm\Sniplets
       $T=$R\Masm\Templates
       $M=$R\Masm\Macro
       $E=C:\OllyDbg

     把上面$A后面的改为Masm32的实际安装文件夹,这里改为:D:\Masm32,如果你装了OD调试器把最后一行改为OD所在文件夹,这样以后的编
     
译的程序就可以直接在调试器中运行,保存文件,OK,一切就序,现在可以开始用汇遍实现可视化编程!

    另外还有一点,如果装有VC的话,Masm32可能会把库文件或头文件放到VC的文件夹里(可以用Windows自带的搜索功能找到这些文

件)这一点要注意!如果出现这种情况,自己把库文件(*.LIB)或(*.INI)头文件分别COPY到Masm32下的的lib和include目录即可!





3.基本框架

   我发现Iczelion的Win32汇编教程的说的非常详细,我就直接引用了:

   下面的程序段是一个框架, 若您现在还不知道这些指令的确切意义的话,没关系, 随后我就会给大家详细解释。

.386
.MODEL Flat, STDCALL
.DATA
    <Your initialized data>
    ......
.DATA?
   <Your uninitialized data>
   ......
.CONST
   <Your constants>
   ......
.CODE
   <label>
    <Your code>
   .....
    end <label>


框架就这么简单,好,我现在就给您解释:


.386

这是一个汇编语言伪指令,他告诉编译器我们的程序是使用80386指令集编写的。您还可以使用 .486、.586, 但最安全的还是使用.386。对

于每一种CPU有两套几乎功能相同伪指令: .386/.386P、 486/.486P、 586/.586P。 带P的指令标明您的程序中可以用特权级指令。特权级

指令是保留给操作系统的,如虚拟设备驱动程序。在大多数时间,您的程序都无须运行在RING0层,故用不带后缀P的伪指令已足够了。


.MODEL FLAT,STDCALL

.MODEL 是用来指定内存模式的伪指令,在Win32下,只有一种内存模型,那就是FLAT。 STDCALL 告诉编译器参数的传递约定。参数的传递约

定是指参数传达时的顺序(从左到右或从右到左)和由谁恢复堆栈指针(调用者或被调用者)。在Win16下有两种约定:C 和 PASCAL。C 约定规

定参数传递顺序是从右到左,即最右边的参数最先压栈,由调用者恢复堆栈指针。

例如:为调用函数 foo ( int first_param, int second_param, int third_param ); 按C约定的汇编代码应该是这样的:

push [third_param]
push [second_param]
push [first_param]
call foo
add esp, 3 * 4 ;调用者自己恢复堆栈指针


PASCAL约定和C约定正好相反,它规定参数是从左向右传递,由被调用者恢复堆栈。Win16采用了PASCAL约定, 因为PASCAL约定产生的代码量

要小。当不知道参数的个数时,C约定特别有用。如在函数wsprintf () 中, wsprintf预先并不知道要传递几个参数,所以它不知道如何恢

复堆栈。STDCALL是C约定和PASCAL约定的混合体,它规定参数的传递是从右到左,恢复堆栈的工作交由被调用者。Win32只用STDCALL约定,

但除了一个特例,即:wsprintf。

.DATA .DATA? .CONST .CODE

上面的四个伪指令是"分段"(SECTION)伪指令。我们上面刚讲过Win32下没有"段"(SEGMENT)的概念,但是您可以把您的程序分成不同的"分段

", 一个"分段"的开始即是上一个"分段"的结束。WIN32中只有两种性质的"分段":DATA和CODE

其中DATA"分段"又分为三种:

.DATA 其中包括已初始化的数据。

.DATA? 其中包括未初始化的数据。比如有时您仅想预先分配一些内存但并不想指定初始值。使用未初始化的数据的优点是它不占据可执行文

件的大小,如:若您要在 .DATA? 段中分配10,000字节的空间,您的可执行文件的大小无须增加10,000字节,而仅仅是要告诉编译器在装

载可执行文件时分配所需字节。

.CONST 其中包括常量定义。这些常量在程序运行过程中是不能更改的。 应用程序并不需要以上所有的三个"分段", 可以根据需要进行定义

.CODE 这是代码"分段"。

<译者注:实际上,分段并不是象在 Dos 下一样,为不同的段分别指出不同的段寄存器,因为 Windows 下只有一个 4GB 的段,Windows 程

序中的分段表现在当程序装载时,赋予不同的分段不同的属性,比如说当你的程序加载时,对于 Ring3 程序来说,.code 段是不可写的,而

.data 段是可写的,如果你尝试象在 Dos 下一样写自己的代码部分,你会得到一个蓝屏错误>


<label>
end <label>
是用来唯一标识您的代码范围的标签, 两个标签必须相同,应用程序的所有可执行代码必修在两个标签之间。



4.第一个程序



  打开RadASM,文件→新建工程,调出工程向导,如下图所示:

xd.JPeG


  在工程名称里输入一个名称,比如"MyBox",在工程说明输入一段描述,如:"我的第一个程序",然后点击下一步

随后出现一个"模版"向导,这里选择"无",下一步出现"文件及目录",如果你不想有备份就把"BAK"的勾去掉,然后

再下一步点完成.

   再随后出现的右栏中双击*.Asm,这里是MyBox.Asm,然后把下面的代码COPY到里面




  1. .386
  2. .model flat,stdcall
  3. option casemap:none

  4. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  5. ;        Include 数据
  6. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  7. include \masm32\include\windows.inc
  8. include \masm32\include\kernel32.inc
  9. includelib \masm32\lib\kernel32.lib
  10. include \masm32\include\user32.inc
  11. includelib \masm32\lib\user32.lib


  12. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  13. ;         数据段
  14. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  15. .data
  16. MsgBoxCaption  db "Iczelion Tutorial No.2",0
  17. MsgBoxText       db "Win32 Assembly is Great!",0



  18. .code  ;代码段
  19. start:
  20. invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
  21. invoke ExitProcess, NULL
  22. end start

复制代码



   


然后 构建→构建并运行,是不是弹出了一个对话框啊,呵呵,原来W32ASM也是钓API来用的

难道不是吗?看下面几句:

invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
invoke ExitProcess, NULL


其中,invoke是编译器伪指令,取代PUSH,CALL的调用并做检查如果参数错误就会给出错误提示!


......


下期我们来说说怎样用汇编写个窗口程序

参考资料: Iczelion的Win32汇编教程


待续......

[ 本帖最后由 hacker0058 于 2006-9-14 09:38 编辑 ]
PYG19周年生日快乐!
秋风下的落叶 该用户已被删除
发表于 2006-9-12 19:37:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
PYG19周年生日快乐!
秋风下的落叶 该用户已被删除
发表于 2006-9-12 19:48:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-9-14 09:20:13 | 显示全部楼层
你没有设置环境变量,我重新修改了一下,你再看下

另外你检查下“masm32\include”和“masm32\lib”下是否有对应的文件

[ 本帖最后由 hacker0058 于 2006-9-14 09:23 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2006-9-14 21:40:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
PYG19周年生日快乐!

该用户从未签到

发表于 2006-9-15 09:01:43 | 显示全部楼层
支持。。。。。
PYG19周年生日快乐!

该用户从未签到

发表于 2006-9-16 17:16:25 | 显示全部楼层
顶一下在 说,我只能写 DOS 下的简单汇编
PYG19周年生日快乐!

该用户从未签到

发表于 2006-9-16 18:01:55 | 显示全部楼层
很好,谢谢楼主,期待续传
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-2-26 08:32
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    发表于 2006-9-25 17:19:23 | 显示全部楼层
    学习!等待第二课。:P
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-10-3 15:39:44 | 显示全部楼层
    很好,谢谢楼主 期待...
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表