找回密码
 快速注册

QQ登录

只需一步,快速开始

查看: 1824|回复: 4

菜鸟从零开始玩汇编

[复制链接]
宋中 发表于 2011-4-19 19:15:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?快速注册

×
总是有人问我:我是 菜鸟 ,想学 编程 ,应该学什么啊?
我总是和他说:哎呀,你自己学什么自己按需来啊,最先学就学C语言吧。
呵呵,其实学编程没有什么困难的,今天我就教你 入门 一个语言——汇编
现在网上汇编的 教程 也挺难找的
希望我写的这个可以给大家分享一下经验
祝愿大家早日成功,到时候别忘了我啊,呵呵,下面开始:
第一步——安装
1. 去 下载 一个masm的系列来当作我们的汇编器,说实话,这东西真的让汇编简单多了,我们由于是win32下的汇编,所以我们就不用费那么大的劲去学什么I/O 系统 了,好我已经下载好了, 工具 自己去搜索下载,首先我们安装我的是masm8.0的版本。不过先在的最新版本是8.2的,喜欢的可以去下载那个
我们选择要安装的地方,我喜欢选择D盘,当然选择哪个盘是你自己的想法。
2. 运行安装 程序
我们选择D,然后按install masm32
然后会跳出一个对话框
我们按确定。
然后等待一段时间。(我等待了43秒)
3. 然后会跳出一个命令 提示 符
我们按4来进行安装,然后继续等待他来安装
如果没什么意外的话,应该很快的,我用了10多秒就安装完了
然后
我们按确定
这样我们进行win32的汇编器已经安装了,那么就开始下一步吧
第二步——架设环境
什么编程几乎都需要环境。比如asp就需要IIS的环境来实现,vc++也需要设置环境,java,jsp,没有不需要设置环境的
汇编也不例外,那么如何架设环境呢?
1. 查看下列地方
由于我是windows2003 server的,所以我就在我的 电脑 ——高级——环境变量里面设置
由于我先前已经装了Microsoft Visual Studio系列 软件 ,所以我已经有了incluede,lib,path这3个变量,如果没有的你新建incluede,lib,path这三个变量,然后按编辑,里面的内容是你装masm32的本地路径,我们安装在D盘下面,所以我们就要设置include的路径为d:\masm32\include.
同样的道理,我们新建lib变量名,变量值为d:\masm32\lib
新建path变量名,变量值为d:\masm32\bin(注意,不是d:\masm32\path).
上面我说的是没有这些变量值的,可是我现在安装了Microsoft Visual Studio系列软件,怎么办呢?其实办法就是——直接添加(此处出现掌声)
记住哦,前面一定要用一个分号隔开。全部按照
lib的变量值后加上;d:\masm32\lib
path的变量值后加上;d:\masm32\bin(注意,不是d:\masm32\path).
好了,我们的环境已经架设好了,重新启动吧!(不需要图片示范吧。谁都会的事)
第三步——准备进行编程的准备
一:安装所需要的工具
前面的汇编器的安装本来觉的在这里写的,不过觉的先把前面安装了踏实些:),好了,我们来看看win32汇编除了汇编器还需要什么?
其实还需要4个东东
1. 汇编器,(我们刚才已经安装了)把伪 代码 翻译为给处理器读的原始输出的汇编器
2. 连接器,就是把目标文件和库文件 “链接”到一起输出最终的可执行文件。
3. 资源编辑器,就是用于创建资源(图形,对话框,位图,菜单等)的资源编辑器。
4. 文本编辑器,用来编辑文本。(masm32其实自带的有一个编辑器,只不过功能比UE逊色点)
二:建立编程特用文件夹
如果要进行编程的话,没有一个特定的文件夹来进行编程的话是不行的
我们用vc++来编程的时候,他还是需要你建立一个文件夹的,vc++和asm同出一门,都属于华山派(此处有笑声)。
我们在D盘建立一个名为myasm的文件夹
菜鸟一:为什么一定要在D盘建立一个文件夹呢?建立在桌面上不是更方便吗?
回答:asm在编译程序的时候,是在dos下编译的,在遇到桌面的文件夹的时候,往往会有人按右键,用进入dos快速通道的方法来直接在目录下进行编译,由于目录过长,字目录过多,往往会出现“~”这个符号,但是asm是不能解释出“~”这个符号的,所以会造成无法编译的效果。
第四步——编写源代码
世界上最有名的程序是什么?
当然毫无疑问是hello world了,不管 学习 什么编程,大部分人的第一个程序都是hello world。
如果没有什么定义去规定他的话,权且叫他“无名第一定律吧”(各位大哥别骂我~~)
那么我们就看一下hello world的源代码吧
.486
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
.data
MsgText db "Hello world!",0
MsgTitle db "This is a messagebox",0
.code
start:
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK or MB_ICONINFORMATION
invoke ExitProcess, NULL
end start
好,就这么多了,那么我来逐字逐句的解释下,各位不要嫌我唠叨。
第一句
.486
这个是在告诉我们的汇编器应该生成486处理器的伪代码哦。
.model flat,stdcall
使用平坦内存模式并使用stdcall调用习惯。它的意思是函数的参数从右往左压入,而且函数在结束时自己清栈。
菜鸟二:什么是平坦内存模式啊?
回答:.MODEL 是用来指定内存模式的伪指令,在Win32下,只有一种内存模型,那就是FLAT。 STDCALL 告诉编译器参数的传递约定。参数的传递约定是指参数传达时的顺序(从左到右或从右到左)和由谁恢复堆栈指针(调用者或被调用者)。在Win16下有两种约定:C 和PASCAL。C 约定规定参数传递顺序是从右到左,即最右边的参数最先压栈,由调用者恢复堆栈指针。
第二句
option casemap:none
控制字符的映射为大写。为了 Windows .inc文件能正常工作,这个应该为”none”
第三、四句
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
这是为了使用了windowsAPI的函数,也就是说需要我们导入dll(动态链接库),所以这是由导入库(.lib)来完成的。我们使用windowsAPI的函数,导入库是一个必要的步骤。
Includelib C:\masm32\lib\kernel32.lib载入库kernel32.lib同样的道理
includelib \masm32\lib\user32.lib载入库user32.lib.
菜鸟三:为什么上面两个不一样的呢?上面那有c:\的呀,为什么下面没有呢?
回答:呵呵,这下你就知道,为什么汇编源文件要和masm在同一个区了
但你不只是需要包含库。包含文件(.inc)也是必须的,所以我们需要以下命令
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
第五句
.data
MsgText db "Hello world!",0
MsgTitle db "This is a messagebox",0
.data 指示data部分的开始。用db,字节直接被插入,而且字符串又只是字节的集合,data部分会在包含上面的字符串,附加上结尾的0。
MsgText 和MsgTitle这两个API函数我们在前面已经把他封装在dll库里了
这两个函数我就不用多解释了,VB里面有的,依靠这2个函数,就可以跳出一个提示框。我们一会编写的时候就可以看到了。
第六句
.code代码部分由此开始
start:
end start
这句我想也不用解释,这是一个标签
不过要注意,这里是对称的。
还要注意一点,这不一定非要是start
其他的也可以,比如:
wuming:
end wuming
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK or MB_ICONINFORMATION
invoke ExitProcess, NULL
在这个,使用了invoke 这个函数invoke MessageBox, Null, ADDR MsgText, ADDR MsgTitle, Null
因为MsgText装有第一个字符串的offset,MsgTitle有第二个字符串的offset,但是由于 安全 性,我们使用ADDR来替换offset,避免溢出,防止尴尬(此处有掌声)
下面我们来看看MB_OK
MB_OK是OK按钮的样式,MB_ICONINFORMATION是 information图标的样式。样式是用“or”操作符联合的。这不是or伪代码。Masm会在汇编前处理or操作。不用or,你可以用+号(加号)代替,但有时对层叠样式有问题(一个样式包含其他一些样式)。但在本例中你也可以用+号。
第五步——让源代码变成EXE文件
我们把
.486
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
.data
MsgText db "Hello world!",0
MsgTitle db "This is a messagebox",0
.code
start:
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK or MB_ICONINFORMATION
invoke ExitProcess, NULL
end start
保存成1.asm,然后放在我们的D:\myasm目录下
然后在dos下面进入这个目录
然后使用命令
ml /c /coff
/c =汇编不链接(因为我们用link.exe来做这项工作)
/coff = 产生COFF格式的object(对象)文件,这是Windows可执行文件的标准格式。
好了,已经生成了一个1.obj文件
我想obj文件大家一定很熟悉,特别是安装vc++的 朋友 ,因为vc++把源代码转化成exe文件是先要转化成汇编语言的。好了,现在我们看看myasm下面的文件,一共只有2个
一个是1.asm一个是1.obj
然后我们使用link来进行连接
然后我们去d:\mysam
发现多了一个1.exe
我们运行他
this is a messagebox就是我们在msgtitie里面添加的
Hello world就是我们在msgbox里面添加的
第六步——结束
好了,如果你是认真的看过以上内容,相信你编译出一个汇编程序是没有问题的了,但是本问说实话仅仅只是汇编里面极其片面的一点东西。
如果你对汇编感兴趣,你就去买罗云彬的汇编的书吧。我是很喜欢那书,呵呵
本文章在第五步里面有部分是从声明:第五句和第六句由taowen的文章修改的,由于联系不到作者,我没有经过他同
同意就使用了,道歉!我写这文章也就是想给大家起个抛砖引玉的作用,不要浪费时间,好好享受编程带来的乐趣吧!


该贴已经同步到 宋中的微博

评分

1

查看全部评分

imagination 发表于 2011-4-20 12:37:26 | 显示全部楼层
从来都是遇到什么弄什么
到头来还是觉得系统学习才是王道
回复

使用道具 举报

拉莫斯 发表于 2011-4-20 12:42:37 | 显示全部楼层
学汇编的才可以被称作工程师。
汇编运行效率快,编译量少,更接近底层,更难以理解,学汇编的都是一群怪人
回复

使用道具 举报

 楼主| 宋中 发表于 2011-4-20 13:41:08 | 显示全部楼层
ls二位,说的很实在
回复

使用道具 举报

蛋定如初 发表于 2011-6-27 09:07:19 | 显示全部楼层
2L说的很对,但是汇编有一个致命缺点,就是硬件依赖性太强了。
没办法,这就是汇编语言的特性。就是因为它能直接操作硬件,所以硬件依赖性很强。
比如ARM下的汇编放到386下就不行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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