您的位置:首页 > 编程语言 > PHP开发

简单OS开发前奏(一)EDITPLUS+MASM32搭建汇编开发环境(16位+32位)

2010-09-09 19:28 543 查看
沉寂了一个学期,现在要做点正事了,毕业设计打算是写一个简单的操作系统,今天开始写个系列文章,也称不上是教程,算是为毕业设计提前做准备,也是把网络上有关x86系统的硬件和OS启动过程综合发布并实现一下,内容会涉及X86架构的CPU和BIOS的相关知识。

  关于汇编语言就不多说了,高层应用开发的人也许永远不会接触到这个编码复杂的开发工具,但是我个人认为用汇编写出来的东西比那些高层应用开发人员所提出来的概念性东西实在的多。汇编现在能干什么呢?汇编什么都能干,你能用高级语言实现的功能汇编都能做,但是没人愿意用汇编来写个IM什么的,也没有这个必要。但是对于从事和硬件开发相关的人来说,汇编永远是不可或缺的一种实用语言工具。单片机,ARM架构系统等等嵌入式开发有些功能是必须用汇编来做的,BIOS开发,还有x86架构的系统开发中有些环节也是非汇编不能完成的。喜欢用汇编也可能和个人习惯相关,我可以选择C来开发程序,也可以选择汇编来开发,但是汇编是更直接的一种方法。从资源的利用上来说汇编语言比其他任何语言都简单,因为可以使用的资源无非是有限的寄存器,端口还有主存,所以汇编也是能显现一个人做事灵活度的语言。语法就更不用说有多简单了,不知道用“语法”这个词对不对,因为写的是指令,有些人会说,机器码是最难的,是吗?如果给你列个表,把二进制机器码和汇编指令助记符一一对应,给你时间让你写个HELLOWORLD你认为难度在哪里?都说越底层的东西越是难,其实都是在说开发效率和可读性,越是底层涉及的东西越是有限,越是高层的东西人为制定的限制越多,概念越多,概念又往往有一定的标准需要遵循,所以高层的技术开的发效率是很高,但是最终还是转化成了底层的实现。如果你会C/C++,或者J***A,C#等等并且很精通,如果只有一台X86裸机或者ARM的最小系统让你写个HELLOWORD,能完成吗?汇编当然是可以的,如果你会汇编,你可以把X86当做单片机来玩。

  说这么多不是说汇编是多么好,只是说汇编就算在如今这样的开发语言百家争鸣的时代总是有一着一个不可撼动的地位。汇编不仅仅是一种语言,更是一种与硬件息息相关的工具。多余的不再叙述,下面开始搭建我们的开发环境并写出一个简单的程序。



准备工具:

    1.EDITPLUS最新版本是3.20下载地址:http://www.editplus.com/ftp.pl?epp320.exe

    2.MASM32SDK最新版本不详  下载地址:http://www.masm32.com/

EDITPLUS是一个短小精悍的文本编辑工具,但是提供了强大的外部应用程接口,所以可以扩展成适合自己的IDE,而MASM32是国外的一个不辞劳苦的同志整理的WIN32汇编工具开发包,但是里面继承的文本编辑器都比较弱,所以我们需要把这两个工具结合起来使用。主要是在EDITPLUS的自定义工具里面添加MASM编译器和链接器。现在有很多很好的汇编程序像NASM等,但是毕竟MASM先入为主,而且也没有太多精力了去学习NASM的一些不同于MASM的特性,所以就一直使用MASM了。

  1).下载EDITPLUS安装

  2).下载MASM32SDK安装,建议安装在根目录比如F:/MASM32

  3).编写用于汇编源程序的批处理文件,因为16位汇编和WIN32汇编需要的文件结构不同所以需要写不同的参数至于OMF和COFF的文件格的定义请自行查阅相关资料。汇编程序是F:/MASM32/BIN/ml.exe这个程序是微软的编译器,在visualstudio中也有这个程序。我们的汇编过程就是使用这个程序来完成的。可以传递不同的参数来汇编成不同文件格式的OBJ文件。批处理写法如下。

01
@echo
off
02
REM设置环境变量
03
@set
include=F:/masm32/Include
04
05
@set
lib=F:/masm32/lib
06
07
@set
path=F:/masm32/bin;
%path
%
08
09
echoEnvironmentVariablesInitalizationDone!
10
11
ml/c
%1
%2
把此文件保存为asm.bat,放在目录F:/MASM32/下。

  4).编写用于链接目标文件的批处理,MASM下有两个链接器F:/MASM32/BIN/link16.EXE和F:/MASM32/BIN/link.exe,看名字就只到第一个是用于16位DOS程序的链接器,第二个肯定是用于WIN32程序的链接器。其实这两个文件在MASM的发行版本中名字都是一样的只是后来,后者只是前者的更新版本,但是link.exe只能链接COFF格式的OBJ文件,如果用于链接OMF的格式的OBJ文件则会出错。两个程序的版本信息。

F:/MASM32/BIN/link16.EXE

Microsoft(R)SegmentedExecutableLinkerVersion5.60.339Dec51994
Copyright(C)MicrosoftCorp1984-1993.Allrightsreserved.

对于这个链接器功能单一只是用来链接16位DOS程序,所以可以直接调用,不用批处理。

F:/MASM32/BIN/link.exe
Microsoft(R)IncrementalLinkerVersion5.12.8078
Copyright(C)MicrosoftCorp1992-1998.Allrightsreserved.

这个链接器由于是链接WIN32程序,所以要有WINDOW程序和CONSOLE程序之分所以要写个批处理链接不同的目标程序。

批处理写法如下

01
@echo
off
02
REM设置环境变量
03
@set
include=F:/masm32/Include
04
05
@set
lib=F:/masm32/lib
06
07
@set
path=F:/masm32/bin;
%path
%
08
09
if
"%1"
==
"/win"
link
/subsystem:windows
%2
.obj
10
if
"%1"
==
"/dos"
link
/subsystem:console
%2
.obj
注:没有考虑包含资源的源程序编译。

5).添加EDITPLUS的工具栏。不再文字叙述,请参照图示设置。















汇编开发环境已经搭建好了,可以开始写一个简单的汇编程序了。鉴于老师一直鄙视HELLOWORLD所以我也不写HELLOWORLD了。写一行变色的文字吧。

点击新建文件按钮,新建一个文本文件。然后就可以写代码了。






代码

DATASSSEGMENTSTACK
DB64DUP(?)
DATASS

DATASSEGMENT
colorDB00H  ;字符串颜色
lenDW0000H;字符串长度
msgDB"Asimplebootsector!Tishion!"
strendDB'$'
DATASENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS
start:
MOVAX,DATAS
MOVES,AX
MOVAX,OFFSETmsg;将字符串拷贝到ax
MOVBP,AX;es:bp=串地址

MOVCX,OFFSETstrend
MOVDX,OFFSETmsg
SUBCX,DX;cl=串长度
MOVlen,CX

next:INCcolor       ;颜色数值+1
ANDcolor,0FH;与0FH相与使背景色值不变为0
MOVAX,1301H;ah=13,al=01h
MOVBH,00H;页号为0(bh=0)
MOVBL,color;黑底红字(bl=0ch,高亮)
MOVCX,len
MOVDX,0815H;第0h行15h列(dh=0dl=15h)
INT10H;10h号中断
JMPnext
over:RET
CODESENDS
ENDstart







然后直接点击我们设置好的按钮Assemble-OMF

看到输出信息

----------Assemble-OMF----------
EnvironmentVariablesInitalizationDone!
Microsoft(R)MacroAssemblerVersion6.14.8444
Copyright(C)MicrosoftCorp1981-1997.Allrightsreserved.

Assembling:BlinkText.asm

Outputcompleted(0secconsumed)-NormalTermination



然后点击Link16按钮因为没有用到其他库文件也不需要清单和定义文件所以一路回车就可以。

最后输出

Microsoft(R)SegmentedExecutableLinkerVersion5.60.339Dec51994
Copyright(C)MicrosoftCorp1984-1993.Allrightsreserved.

RunFile[BlinkText.exe]:
ListFile[nul.map]:
Libraries[.lib]:
DefinitionsFile[nul.def]:
请按任意键继续...

现在已经生成了可执行文件了。然后点击RUN按钮。

就可以看到我们的程序效果了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: