⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用masmplus学习win32汇编(1) .txt

📁 会变语言实现的一些程序
💻 TXT
字号:
用MasmPlus学习Win32汇编(1) 
    作者:Zoologist 于2007-9-16上传   

--------------------------------------------------------------------------------
  汇编语言给人的印象就是黑黑的窗口,一行行的字符,不断上滚的界面… … 初学者必须弄清楚同汇编语言本身无关的很多东西也正因如此,初学者视汇编语言为畏途。今天开始,我将讲述如何使用MasmPlus进入Win32的汇编语言世界。

MasmPlus 的使用

  我们在这里推荐使用 MasmPlus 编辑器,这是一款由Aogo开发的编辑器,有着诸多的优点。不过我想对于初学者来说,最重要的优点就是:使用简单不需要配置以及全中文支持。

  下载地址为: http://www.aogosoft.com/masmplus/  下载之后即可安装。


  MasmPlus 全貌

  

  另外,我推荐电子版的《Win32ASM教程》,在 http://www.aogosoft.com/ 首页上有下载。

  纸质的图书 《Windows 环境下32位汇编程序设计(第2版)》,这本书的最大特点就是“厚”!
  

tr> 第一版 第二版 


  我说“厚”的意思是此书涵盖面非常宽,并且出版时间很长,你手持此书在各个汇编论坛上都能找到“同志”。后面我还会使用此书的例子作为讲解。这本书在很多网上书店都有前4章的试读,我强烈推荐各位读读先,也强烈推荐读者购买一本作为“收藏”。

  我的第一个程序

  前面说了,MasmPlus 下载安装之后即可使用~ 马上我们就进入到实战阶段。第一个例子来自《Win32ASM教程》。具体说是来自 《Iczelion的Win32汇编教程》的“第二课 消息框”。

  使用 “文件” ? “新建…”在新弹出的对话框中选择 .Asm

  

  下面会提示你保存的文件名,我建立了一个 Gwin 的目录,将这个文件保存为 t1.asm。需要注意的是文件后缀必须是  .ASM 否则后面有些操作可能无法完成。

  

然后将下面的程序段拷贝到新建的文件中:

.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
include \masm32\include\user32.inc 
includelib \masm32\lib\user32.lib 

.data 
MsgBoxCaption  db "Iczelion Tutorial No.2",0 
MsgBoxText       db "Win32 Assembly is Great!",0 

.code 
start: 
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK 
invoke ExitProcess, NULL 
end start


  

  点击下图指示的按钮即可一次性完成编译连接。
  

  结果编译出错。我们一定要坚信:错误会让我们学习到比正确更多的东西!
  

  错误的意思是“无法打开 include \masm32\include\windows.inc 文件”。这是
因为那本教程使用的是Masm32 。例子都是按照那个编译器配置的。我们将程序中的 
masm32 换做 MasmPlus 即可。
  

  再次编译:
  

  编译之后,顺便还会执行(如果有一天,你再编写格式化硬盘的程序,千万要注意噢~)

  编译结果可以在源程序目录下找到:
  

  程序的修改
  如果你不是靠Win32混饭吃(天杀 and Aogo 属于此类),或者心理扭曲(年轻时候的Z.t),写程序基本上就是为了好玩,下面就是各种奇奇怪怪的试验了。

看看教程,上面说

.386 
.model flat,stdcall 
option casemap:none 
include \masmplus\include\windows.inc 
include \masmplus\include\kernel32.inc 
includelib \masmplus\lib\kernel32.lib 
include \masmplus\include\user32.inc 
includelib \masmplus\lib\user32.lib

  这个段就是声明引用,没什么意思。(提问:我减少引用可能会导致无法编译,那我增加引用的呢?会不会冲突?文件大小是否会变化?)

  那就用 .data 开刀吧:改为

.data 
MsgBoxCaption  db "Z.t 到此一游!",0 
MsgBoxText       db "俺的第一个程序",0


  编译:

  

  这次的错误是:无法打开 T1.EXE。这个是刚才编译生成的文件,为什么有问题?
原来是刚才我一高兴,又执行了一次 t1.exe 并且没有关闭,下图中可以清楚的看到。

  

  关闭那个程序,继续玩,编译执行:
  

  下面该弄一下 .code 段了。教程上说了 MessageBox 是一个 Windows API 。那么到哪里知道这些 API呢?买一本 API 大全吧~ 这是开玩笑,API 大全一般都不会“全”的。最好的方法是在网上查找 MSDN。我通常的做法是在google中输入 “API函数名” 出现的第一个连接通常都是微软的 MSDN。

  
       
  invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK           ;参考http://msdn2.microsoft.com/en-us/library/ms645505.aspx
  第一个参数太复杂,暂时不理会它。第二个参数是标题栏,我们前面已经修改过了
(提问:注意到字符串末尾的0 了吧?去掉MsgBoxCaption 末尾的 “0”试试看?再去掉 MsgBoxText 的“0” 再试试看?)MB_OK 似乎是控制显示的按钮。 MSDN 参考如下:

  换上一个 MB_YESNOCANCEL,就是将这句话修改为:

  invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_YESNOCANCEL 

  

  和我们的想象差不多。选择任何一个按钮的结果都是退出程序。

  继续看 MSDN 还有图标功能哦~ 注意到 MSDN 介绍这个函数的时候,

int MessageBox(      
    HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
);

uType 是UINT,所以我们可以这样用:

  invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_YESNOCANCEL + MB_ICONQUESTION

  结果多了一个图标:
  

  (提问:我要是MB_YESNOCANCEL + MB_ICONQUESTION + MB_ICONHAND或者加上更多的,结果会怎么样呢?暂时不要问为什么了:)
        
  最后一个参数留给读者自己试验了,如果不明白欢迎到论坛上进行讨论。

  前面说了 : int MessageBox 意思是 这个API 有返回值啊!翻翻教程, 返回值应该在 EAX 中。

  那就再来一段吧:

start: 
  invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_YESNOCANCEL
       invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
  .endif
  invoke ExitProcess, NULL 
end start


  意思是,你要是选 cancel 那就再显示一次对话框。(提问:要是我想显示5 次 10 次… …应该怎么写?)

  今天就讲到这里,我回去看看书,下次继续讲。总结本课内容:

  1.如何使用MasmPlus编译Win32汇编程序;
  2.如何查找API函数。

  改错联系:下面是一个程序,我希望能够显示AL中的数值,但是程序在运行期会出现错误,


.386 
.model flat,stdcall 
option casemap:none 
include \masmplus\include\windows.inc 
include \masmplus\include\kernel32.inc 
includelib \masmplus\lib\kernel32.lib 
include \masmplus\include\user32.inc 
includelib \masmplus\lib\user32.lib 

.data 
MsgBoxCaption  db "结果!",0 
MsgBoxText     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.code 
start: 
mov   al,97h
call  ShowAL


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

ShowAL proc
        mov  dl,al      ;保存AL
        mov  cl,04       
         shr  al,cl      ;AL高4位移至低4位
         mov  cx,02h      ;循环2次
         xor  ebx,ebx
         mov  esi,offset MsgBoxText

Low4bit: 
cmp  al,09
         jbe  larger    ;低4位超过9
         add  al,07
larger:     
add  al,30h

        mov  [esi],al
         inc   esi      
         
        mov  al,dl      ;恢复保存
          and  al,0Fh
          loop  Low4bit
        
         ret
ShowAL   endp 

end start

  

  正确的结果应该是:
  
  
  Zoologist  2007 年8月14 日 编辑


--------------------------------------------------------------------------------
<<<上一篇  欢迎访问AoGo汇编小站:http://www.aogosoft.com 下一篇>>>  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -