📄 用masmplus学习win32汇编(1) .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 + -