有谁知道.com文件格式以及如何把汇编程序编译成.com文件?

袁尤军 2004-01-02 10:26:55
或者介绍一点关于.com文件的资料
...全文
501 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kugou123 2004-01-02
  • 打赏
  • 举报
回复
再附上一点资料:

.COM 文件比较简单,.COM文件包含程序的一个绝对映象―――就是说,为了运行程序准确的处

理器指令和内存中的数据,MS-DOS通过直接把该映象从文件拷贝到内存而加载.COM程序,它不

作任何改变。为加载一个.COM程序,MS-DOS首先试图分配内存,因为.COM程序必须位于一个

64K的段中,所以.COM文件的大小不能超过65,024(64K减去用于PSP的256字节和用于一个起始

堆栈的至少256字节)。如果MS-DOS不能为程序、一个PSP、一个起始堆栈分配足够内存,则分

配尝试失败。否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使.COM程序本身不能

大于64K。在试图运行另一个程序或分配另外的内存之前,大部分.COM程序释放任何不需要的内

存。分配内存后,MS-DOS在该内存的头256字节建立一个PSP,如果PSP中的第一个FCB含有一个

有效驱动器标识符,则置AL为00h,否则为0FFh。MS-DOS还置AH为00h或0FFh,这依赖于第二个

FCB是否含有一个有效驱动器标识符。建造PSP后,MS-DOS在PSP后立即开始(偏移100h)加载

.COM文件,它置SS,DS和ES为PSP的段地址,接着创建一个堆栈.为创建一个堆栈,MS-DOS置

SP为0000h,若已分配了至少64K内存;否则,它置寄存器为比所分配的字节总数大2的值.最后,

它把0000h推进栈(这是为了保证与在早期MS-DOS版本上设计的程序的兼容性)。MS-DOS通过

把控制传递偏移100h处的指令而启动程序.程序设计者必须保证.COM文件的第一条指令是程序

的入口点。注意,因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于

100h.汇编语言程序设计者可通过置程序的初值为100h而保证这一点(例如通过在原程序的开始

使用语句org 100h).
kugou123 2004-01-02
  • 打赏
  • 举报
回复
COM文件开头必须用ORG 100H,因为它的加载必须在100H位置。
然后编译成 XXX.EXE
再用工具 EXE2BIN转换成COM格式就可以啦。
csdsjkk 2004-01-02
  • 打赏
  • 举报
回复
cseg segment
assume cs:cseg,ds:cseg
org 100h
start:
jmp begin

;数据区
...


begin:
push cs
pop ds

... ;你的代码

mov ah,4ch
int 21h
cseg ends
end start

编译为.com文件:
link /TINY xxx.obj

exe2bin xxx.exe xxx.com

bullet2003 2004-01-02
  • 打赏
  • 举报
回复
。建造PSP后,MS-DOS在PSP后立即开始(偏移100h)加载.COM文件,它置SS,DS和ES为PSP的段地址,接着创建一个堆栈.为创建一个堆栈,MS-DOS置SP为0000h,

有个不相同的看法:
MS-DOS置SP为fffeh
bullet2003 2004-01-02
  • 打赏
  • 举报
回复
kugou123(酷狗):手头上有EXE的吗?能不能给我一份?tk989656@tom.com
csdsjkk 2004-01-02
  • 打赏
  • 举报
回复
COM文件的命令行参数放哪?
psp:80h
xygod 2004-01-02
  • 打赏
  • 举报
回复
再补充一下,我贴的那个程序并没有设置PSP,只是留了一个内容为随机的空256字节在前面!
COM文件的命令行参数和EXE一样也是放在PSP里的,具体的你可以找关于PSP的详细说明,我不是太清楚了,呵呵!
xygod 2004-01-02
  • 打赏
  • 举报
回复
我已经在前面贴过这个帖子了,另外,我再推荐一下,写COM程序,最好用NASM来写,要比MASM强得多,直接生成COM,而且你可以自己选择是否ORG 100,ORG 0,对于写引导代码简直是方便到要死!
xygod 2004-01-02
  • 打赏
  • 举报
回复
;**************************************************
; ComLoader
; By xy_god
; E-Mail:xy_god@eyou.com
; Homepage:http://www.cnidp.bak.cn
;**************************************************

DataSeg SEGMENT

FileName DB 'quake.com',0
Buffer DB ?
DataSeg ENDS

CodeSeg SEGMENT
ASSUME CS:CodeSeg,DS:DataSeg
start PROC FAR
MOV AX,6c00h
MOV ES,AX
MOV BP,0100h

MOV AX,DataSeg
MOV DS,AX
MOV DX,OFFSET FileName
MOV AX,3d00h
INT 21h;------------------------------以只读方式打开文件

MOV BX,AX
ReadChar:

MOV CX,0001h
MOV DX,OFFSET Buffer
MOV AH,3fh
INT 21h;-------------------------------从文件中读取一个字符

CMP aX,cX
Jb LoadCom
MOV CH,BYTE PTR Buffer
MOV BYTE PTR ES:[BP],CH
INC BP
JMP ReadChar

LoadCom:
MOV AX,6c00h
MOV ES,AX
MOV DS,AX
MOV SS,AX
MOV SP,0fffeh
PUSH AX
MOV AX,0100h
PUSH AX
RET

Exit:
MOV AH,4ch
INT 21h

start ENDP
CodeSeg ENDS
END start;------------------------------源程序结束
紫郢剑侠 2004-01-02
  • 打赏
  • 举报
回复
源程序:

;<<<<<<<<<<<<<<<<<<<<<<
;FileName: test.asm
;Function: Demo the com
;<<<<<<<<<<<<<<<<<<<<<<
cseg segment
;======================
assume cs: cseg, ds: cseg
org 100h
@start:
mov dx, offset strHello
mov ah, 09h
int 21h

mov ax, 4c00h
int 21h

;--------<data>---------
strHello db "Hello, world!$"
;==============================
cseg ends
end @start


要生成COM, 在DOS命令行状态下依次输入(<CR>代表Enter键):

masm test;;<CR>
link test;;<CR>
exe2bin test.exe test.com<CR>


>>COM文件的命令行参数放哪?如何获取?

与EXE格式相同.
袁尤军 2004-01-02
  • 打赏
  • 举报
回复
COM文件的命令行参数放哪?
如何获取?

21,498

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧