社区
汇编语言
帖子详情
有谁知道.com文件格式以及如何把汇编程序编译成.com文件?
袁尤军
2004-01-02 10:26:55
或者介绍一点关于.com文件的资料
...全文
501
11
打赏
收藏
有谁知道.com文件格式以及如何把汇编程序编译成.com文件?
或者介绍一点关于.com文件的资料
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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文件的命令行参数放哪?
如何获取?
汇编语言接口程序实现打印图形的程序
个在Fox中利用汇编语言接口程序实现打印图形的程序
查看内存使用情况的汇编源代码
查看内存使用情况的汇编源代码
HTTP下载程序
HTTP下载程序 MASM32
Call 和 Return 使用
关于 Call 和 Return 使用方法的汇编源代码
在ubuntu下将.s汇编源
文件
编译成
.bin
1.编译程序 ①将.c .s
文件
变为.o
文件
arm-linux-gcc leds.s -g -c -o led.o -g:产生调试信息 -c:编译源
文件
但是不链接 ②将所有.o
文件
链接为.elf格式的可执行
文件
链接就是将所有的.o
文件
链接在一起,并且链接在指定的地方(指定链接起始地址) 链接起始地址就是代码运行的起始地址 6ULL的链接地址应该指向RAM,几乎所有的A系列芯片都没有内部FLASH,不能像STM32那样存在ROM中 RAM分为内部RAM(0x900000~)和外部RA
汇编语言
21,498
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章