我把一些学习心得写在这里,希望 能给于志同道合的人一点帮助,同时也记录下自己点点滴滴。
首先要有个开发环境。下个MASM6.1X 与MASN5.0 几百K吧。平常用到了是MASM LINK ML DEBUG 。
我简单介绍下MASM 汇编编译器,把汇编代码编译成2进制目标代码
LINK 模块连接器
ML是一种自动调用MASM与LINK的程序
DEBUG 调试用的
我简单写个汇编代码 aa.asm
DATA SEGMENT
AA DB 'WWWWWWWW','$'
DATA ENDS
CODE SEGMENT 'CODE'
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX ;代码段的地址
LEA AX, AA
MOV DS ,AX
INT 21H
MOV AX,4C00H ;结束
INT 21H
CODE ENDS
END START
用MASM aa.asm 编译成模块 aa.obj 然后用link aa.obj
这时会报错 error LNK1123: failure during conversion to COFF: file invalid or corrupt
这我 查了资料下面是原话:
Windows平台下,源代码编译出来的obj主要有两种格式:OMF和COFF,
其中,OMF格式是原来IBM(好像是吧,不记得了)使用的格式,
而COFF格式则是从微软从UNIX移植过来的,
因为微软公司开发Windows的软件工程师大多对UNIX很熟,所以自然而然的采用了类似UNIX COFF的这种Win32 COFF格式(和UNIX的"纯种"COFF是有区别的,但仍然叫COFF格式)
这个也差点让我断下接下去的路。
解决办法就是弄个16位的连接器,这里MASN5.0就起做用了,你最好是吧里面link.exe改成link16.exe
然后link16 aa.obj这样就编译成exe文件了,然后在DOS中直接aa.exe就可以看到结果了。
可能我省略了一些细节问题。
就是打开DOS打MASM没反应,那么这既是你没设置环境变量得关系。
如果你学过JAVA就应该知道,在系统设置 --环境变量中 --PATH 在里面加上你这些工具的目录就行,或者在DOS理直接设置set PATH= MASM所在的路径,这个在DOS退出设置就会没了。
至于为什么这么做,我简单说下,程序是死的,你必须让电脑知道你的MASM工具在哪,dos默认是在PATH系统环境变量中去寻找你敲的,你一旦设置了,那么久直接启动MASM,那么你可以敲命令了。
还有个你编译汇编文件时,你得确保DOS所在目录在你源码文件目录里,我的CMD默认C:\Documents and Settings\Owner>如果我直接masm c:\test\aa.asm那么生成的aa.obj就在C:\Documents and Settings\Owner里,为了防止这个,就必须 cd c:\test\ 进入
然后显示c:\test\> 这是你输入masm aa.asm 那么aa.obj就在aa.asm在同个目录了。
这些就是新手不了解的,因为我曾经搞过一段时间的JAVA但是也折腾了很长时间才找到的。
环境好了后,就可以开始学习了。
学习的时候,可能你和我一样会看到 有些代码
.modle small
.data
.code
.startup
|
.exit 0
end
其实这个和上面同时汇编,只是写的模式不一样。
所以不用怀疑再到处找资料,我也是看完才知道的,因为有linux汇编,我还以为有几种汇编,所以才有2中不同模式。
汇编的学习,其实没有想象中的那么复杂,关键是理解。
记住每个寄存器的作用。
还有看不懂原理的时候也要多次看加深印象。
像内存的分配图和程序怎么装载的。这些虽然不影响程序的编写,但是对于理解操作系统的运转是很重要的。
常常我们为太多的汇编指令而头疼,其实没必要记,学会查,下个汇编指令手册,一遍看程序一遍查,用多了就记住了。
汇编他有自己的格式,我们写的时候必须要规范。
比如汇编开始的时候都会有mov ax, data mov ds,ax
首先DS是指存放数据寄存器的段地址的寄存器,然后你就知道这步其实是告诉程序数据的地址。但是没看到其他的地址,那么你查资料就会知道 其他的可以不用写。因为 stack 有个segment stack 已经定位好了堆栈,至于代码的地址,如果看程序如何装载到内存中的,那么你就知道这个是系统来设置的,不用我们再手动去定位了。
学习的时候如果你不知道写什么,那么你多看看上面的例子,例子看完了,自己就脱离这些例子来写,多练掌握很快的。
当汇编有一定基础,你就可以开始进行DOS汇编了,所谓DOS汇编就是利用汇编基本语法来进行DOS程序的编写。
这个或许刚学的人搞不透,其实很简单的。首先你要有BIOS中断手册,上面的int 21h什么的都是中断,至于什么意思,你查手册。你想做什么功能呀是到手册上找相应的中断提供和一些数据的怎么在寄存器上定义的。
然后多写写就可以了。
我有一篇就讲了下这其中是怎么实现的。
到此我吧一些心得写完了,至于具体的看个人。