-
-
[旧帖] [分享]如何用MASM写COM格式的程序,引导程序,好不容易搞明白了,大家一起来学习吧 0.00雪花
-
发表于: 2012-5-18 17:49 1031
-
搞了两天才搞明白,发出来让再碰到这问题的人也来看看.
前几天在看于渊的<自已动手写操作系统>,上面介绍是用NASM来写引导程序.NASM生成.COM文件很方便,一个直接编译就行了.
换成MASM可就有点难了.要先编译后连接才行,其中还有格式和程序加载地址的问题.
MASM中的编译器ML.EXE支持两种目标文件格式:COFF和OMF.想生成.COM文件,我调试的时候两种都试了试,发现只有OMF才行.为什么COFF格式不行,有知道可以解释下.
MASM中连接器分两种LINK16和LINK32. 其中LINK16名字叫做分段可执行文件链接器(Segmented Executable Linker),LINK32的叫做增量链接器(Incremental Linker),VC6以后带的那种都是这种类型的.其中只有LINK16支持.COM文件链接.
大家可以先看下下面的代码,然后我再解释下,初显的功能很简单,显示了一个字符串,如果把"org 100h"改成"org 7c00h"的话就可以做一个引导程序用.
最要注意的一点是这里的"org 100h"和NASM中的"org 100h",有很大区别.
http://www.masm32.com/board/index.php?action=printpage;topic=10947.0
前几天在看于渊的<自已动手写操作系统>,上面介绍是用NASM来写引导程序.NASM生成.COM文件很方便,一个直接编译就行了.
换成MASM可就有点难了.要先编译后连接才行,其中还有格式和程序加载地址的问题.
MASM中的编译器ML.EXE支持两种目标文件格式:COFF和OMF.想生成.COM文件,我调试的时候两种都试了试,发现只有OMF才行.为什么COFF格式不行,有知道可以解释下.
MASM中连接器分两种LINK16和LINK32. 其中LINK16名字叫做分段可执行文件链接器(Segmented Executable Linker),LINK32的叫做增量链接器(Incremental Linker),VC6以后带的那种都是这种类型的.其中只有LINK16支持.COM文件链接.
大家可以先看下下面的代码,然后我再解释下,初显的功能很简单,显示了一个字符串,如果把"org 100h"改成"org 7c00h"的话就可以做一个引导程序用.
[COLOR="Green"];cmd>ml /omf /c /nologo debug.asm ;cmd>link16 /TINY /nologo debug.obj,debug.com;[/COLOR] .386p .model tiny code segment use16 org 100h ;7c00h start: mov ax, cs mov es, ax mov bp, offset msg ;字符串地址, es:bp mov cx, 16 ;字符串长度 mov ax, 1301h ;功能号,显示模式 mov bx, 000ch ;显示属性,颜色 mov dx, 0000h ;显示位置 int 10h ;调用显示中断 jmp $ ;为了能看到显示字符就来个死循环吧 msg db "Hello, OS world!" code ends end start
最要注意的一点是这里的"org 100h"和NASM中的"org 100h",有很大区别.
http://www.masm32.com/board/index.php?action=printpage;topic=10947.0
赞赏
他的文章
看原图
赞赏
雪币:
留言: