各位大哥,帮忙讨论一下在dos下.exe与.com的区别.谢谢!!!

liufucsdn 2003-12-01 09:09:15
各位大哥,小弟才学汇编,帮忙讨论一下在dos下.exe与.com的区别.是不是与操作系统的加载有关?谢谢!!!
...全文
71 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
hatia 2003-12-10
  • 打赏
  • 举报
回复
长知识了
tass 2003-12-09
  • 打赏
  • 举报
回复
up
阿发伯 2003-12-09
  • 打赏
  • 举报
回复
该说的大家都说了,我补充几点大家没说的:
1、COM程序不能超过64K,但不管有多小,运行时总是占64K内存,如果计算机可用内存大于程序长度且小于64K,占据所有可用内存;exe文件按实际需要占用内存。
2、COM程序没有文件头,运行时内存中分布就是COM程序的镜像;EXE程序有文件头,运行时需重定位,内存的分布由DOS按内存实际情况进行加载,很多时候,程序的内存占用时不连续的。
:)
shiningpipe 2003-12-09
  • 打赏
  • 举报
回复
.com是单道系统时的产物

一次只能运行一个
tjjack 2003-12-09
  • 打赏
  • 举报
回复
给你一个网址你自己去看看吧 http://www.x86asm.com/hbjq/13.htm
hunterboy 2003-12-08
  • 打赏
  • 举报
回复
收获非常大,不过实用性不大,大家只要了解一下PE头一切就明了了
DoItFreely 2003-12-08
  • 打赏
  • 举报
回复
大家都已经说完了,不要浪费钱专门为了这个去买书了。
总结一下:
比较项 com exe
-------------------------------
exe文件头 没有 有( < 40h字节)
加载方式 直接load load之后需要修正重定位表等
执行入口 固定为0h 由exe头部计算得出
cs,ds,ss 全部相同 ***可以***各不相同
指针类型 默认为near 默认类型由内存模式决定,内存模式是tiny型时跟com文件相同
数据和代码 总大小不超过64K 由内存模式决定
yxmshen 2003-12-07
  • 打赏
  • 举报
回复
com好象是只有一个代码段,exe可以有很多的段,如:ds,es.
com的文件小,一般只有64K,exe就没有限制。
com调用子程序的时候只能是NEAR,exe没有限制
以上是抄书上的哈,不知能不能帮上你哈!
adaptor85 2003-12-07
  • 打赏
  • 举报
回复
差不多都说完了

Desperately 建议你买本书
liufucsdn 2003-12-07
  • 打赏
  • 举报
回复
谢谢大家!!!good luck
xygod 2003-12-07
  • 打赏
  • 举报
回复
OK,那么,如果想做一个COM文件加载器的话,假设PSP已建立,或
者根本就不建立PSP,只需要把COM文件读入到XXXX:YYYY内存地
址(XXXX段地址,YYYY为偏移地址),
再用RET跳到XXXX:(YYYY+100H),是不是COM文件就执行了呢?
各位,是不是这样子呢,说说看,呵呵!
hanxiao1230 2003-12-07
  • 打赏
  • 举报
回复
com文件没有文件头,直接就是代码,所以长度不能超过一段64KB
;EXE文件才有,头一般是512字节,但也可以小点,比如有的只有32字节
fiveyes 2003-12-07
  • 打赏
  • 举报
回复
《IBM PC汇编语言程序设计(第五版)》
5.9.1 .EXE程序与.COM程序的区别
作为.EXE执行的程序与作为.COM执行的程序之间的重要区别包括程序的规模,分段,以及初始化。
1、程序规模
.COM程序的指令和数据都使用同一个段,基本上被限制为最大值64K,其中包括程序段前缀(PSP)。PSP是一个256字节(100H)块,由装入程序直接插在.COM和.EXE程序的前面,这是在装入程序把它们从磁盘装入到存储器的时候进行的。
.COM程序总是比与它相对应的.EXE程序要小,原因之一是磁盘上放在.EXE程序前面的512字节的标题记录是不放在.COM程序前面的(不能混淆标题记录,在第23章PSP部分会涉及这个问题)。.COM程序是可执行程序的绝对映像,它不具有浮动地址信息。
2、段
.COM程序段的使用是它和.EXE程序的重要的(而且是比较容易的)区别。完整的.COM程序把PSP,堆栈,数据段和代码段组合在一个代码段中。
对于.EXE程序,通常要定义数据段并且用该段的地址初始化DS。对于.COM程序,在代码段内定义数据,就像在第3章里使用DEBUG时所做的那样。
尽管必须为.EXE程序定义堆栈段,但汇编程序会自动地为.COM程序生成堆栈。因此,编写要被转换成.COM格式的程序时,定义堆栈是可以省略的。
如果对一个程序而言,64K的段是足够大的,那么装入程序会在段的末尾设置堆栈并用栈顶地址设置SP寄存器。如果64K的段不是足够大,则汇编程序会在程序之后较高端的存储器中建立堆栈。(然而,这么大的程序应该编写成.EXE格式。
在本书中,许多较小的程序都是.COM格式,它们很容易和.EXE格式区别开来。图5-6比较了.EXE和.COM格式的段寻址。
3、初始化
当装入程序把要执行的.COM程序装入时,它自动地用PSP的地址初始化CS、DS、SS和ES。由于CS和DS现在的内容是指令执行时的正确的初始段地址,所以.COM程序不必把它们初始化。
因为PSP的大小是100H个字节,寻址是从100H字节的偏移值处开始的,所以必须编写伪操作ORG 100H,紧跟在代码段的SEGMENT或.CODE语句之后。ORG伪操作告诉汇编程序把位置计数器设置在100H。然后,汇编程序在距PSP的起点100H字节的偏移值处产生目标码,在那里开始.COM程序的编码。
ES
ES----> PSP DS-------> PSP
CS
------ ------
SS----> 堆栈
------ 代码段
DS---->数据段
------ ------
CS---->代码段 SS------> 堆栈
------ ------
bullet2003 2003-12-07
  • 打赏
  • 举报
回复
问各位一个问题:
怎么在masm6.11中把EXE的头设得小一点?
wenhaoy 2003-12-06
  • 打赏
  • 举报
回复
to kenko(无聊人) :

com的开头就是0h,是读入内存后,dos在前面加了100h的pcb(好像是这样的)

gz
liufucsdn 2003-12-05
  • 打赏
  • 举报
回复
nail63547188(叶子落了) 强,有大才!!!
ilovedonny 2003-12-04
  • 打赏
  • 举报
回复
我也抄下来~
liufucsdn 2003-12-04
  • 打赏
  • 举报
回复
顶到前面去~~
exe8012b 2003-12-04
  • 打赏
  • 举报
回复
com文件没有文件头,直接就是代码,.COM的数据、代码、堆栈等所有段是在同一个段里
,EXE文件才有,头一般是512字节,但也可以小点,比如有的只有32字节。
qass 2003-12-03
  • 打赏
  • 举报
回复
.com is a special type of .exe
加载更多回复(7)

21,459

社区成员

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

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