『第 5 楼』:
使用 LLM 解释/回答一下
再给个COM2EXE的转换程序,大家可以对照学习EXE与COM的文件差别。
所附源程序中第1行及相关部分为我所加,你可以根据需要把xtra_bytes equ后面的数字256改为0到65500之间的任何值。试一试吧!
xtra_bytes equ 256 ;0--65500,so long as you need!!!
.286
Code SEGMENT para PUBLIC 'CODE'
Assume CS:Code, DS:Code
ORG 100h
;==========================================================
cr equ 10
lf equ 13
;==========================================================
Start:
Call Header ;logo
Call CmdLine
cmp al,-1
je _usage
Call OpenRFile ;open readfile
cmp al,-1
je _norfile
Call OpenWFile ;open writefile
cmp al,-1
je _nowfile
Call HeadOn ;write header
_closewfile: Call CloseWFile ;close writefile
jmp _closerfile
_nowfile: Call NoFile
_closerfile: Call CloseRFile ;close readfile
jmp _ende
_norfile: Call NoFile
jmp _ende
_usage: Call Usage ;display usage
_ende: Call Footer ;display ---------------------
mov ax,4c00h
int 21h
;==========================================================
HeadOn PROC near
pusha
mov cx,32+xtra_bytes ;bytes
mov ah,40h ;write to file
mov bx,WFileHandle ;handle of file
lea dx,exe_header ;data: where at
int 21h
jc headon_fail
headon_lop:
mov ah,3fh ;read
mov bx,RFileHandle ;handle
mov cx,63000 ;bytes
lea dx,loadword ;where at
int 21h
or ax,ax ;0 bytes ? !!!!
jz headon_end ; !!!!
add filesize,ax
mov cx,ax ;bytes
mov ah,40h ;write
mov bx,WFileHandle ;handle
lea dx,loadword ;where at
int 21h
jc headon_fail
jmp headon_lop
headon_end:
add filesize,32+xtra_bytes
xor cx,cx
mov dx,2 ;where at (cx:dx)
mov ax,4200h ;move filepointer to (from files begin)
mov bx,WFileHandle ;handle
int 21h
mov ax,filesize
and ax,511
mov loadword,ax ;length mod 512
mov ax,filesize
mov cl,9
shr ax,cl ;div 512
inc ax
mov ,ax ;pages
mov cx,4 ;bytes
mov ah,40h ;write
mov bx,WFileHandle ;handle
lea dx,loadword ;where at
int 21h
lea dx,headon_
Call Print
popa
ret
headon_fail:
lea dx,headon_fail_
Call Print
CALL FileName
popa
mov al,-1
ret
headon_ db 'CREATED EXE-FILE',cr,lf,'$'
headon_fail_ db 'CANNOT WRITE TO $'
exe_header db 'MZ' ;offset 00 (EXE-signature)
dw 0,0 ;bytes on last page, pages
dw 0 ;relocations
dw 2+(xtra_bytes shr 4) ;size of header in paragraphs
dw 1000h,-1 ;minimum, maximum memory
dw 0fff0h,0fffeh ;ss,sp values (ss=PSP)
dw 0 ;checksum
dw 100h,0fff0h ;ip,cs values (cs=PSP)
dw 1ch ;offset to reloc table
dw 0,0,0 ;overlay number, 0,0 (fill-ups)
db xtra_bytes dup(0)
HeadOn ENDP
;==========================================================
CloseRFile PROC near
pusha
mov bx,RFileHandle
mov ah,3eh
int 21h
popa
ret
CloseRFile ENDP
;==========================================================
CloseWFile PROC near
pusha
mov bx,WFileHandle
mov ah,3eh
int 21h
popa
ret
CloseWFile ENDP
;==========================================================
NoFile PROC near
pusha
lea dx,nofile_
Call Print
Call FileName
popa
ret
nofile_ db 'CANNOT OPEN FILE $'
NoFile ENDP
;==========================================================
OpenRFile PROC near
pusha
mov dx,82h ;asciiz = cmdline
mov ax,3d00h ;open it for read
int 21h
jc openrfile_fail
mov RFileHandle,ax
lea dx,openrfile_
Call Print
Call FileName
popa
ret
openrfile_fail:
popa
mov al,-1
ret
openrfile_ db 'OPENED FILE $'
OpenRFile ENDP
;==========================================================
OpenWFile PROC near
pusha
xor ah,ah
mov al,ds:80h
mov di,ax
mov ds:,'XE'
mov byte ptr ds:,'E'
mov dx,82h ;asciiz = cmdline
mov ah,3ch ;open it for write
mov cx,0 ;attribute
int 21h
cmp ax,0
je openwfile_fail
mov WFileHandle,ax
lea dx,openwfile_
Call Print
Call FileName
popa
ret
openwfile_fail:
popa
mov al,-1
ret
openwfile_ db 'OPENED FILE $'
OpenWFile ENDP
;==========================================================
CmdLine PROC near
pusha
xor ah,ah
mov al,ds:80h
cmp ax,6 ;less than 5 chars (cmd-LINE) incl. ret?
jl cmdline_fail
mov di,ax
mov word ptr ds:,'$'*256
popa
ret
cmdline_fail:
popa
mov al,-1
ret
CmdLine ENDP
;==========================================================
Header PROC near
pusha
lea dx,header_
Call Print
popa
ret
header_ db cr,lf
db '--==-- COM2EXE --==-- by HENDR璛 of OBSESSION',cr,lf,'$'
Header ENDP
;==========================================================
Footer PROC near
pusha
lea dx,footer_
Call Print
popa
ret
footer_ db '--==**==-- COM2EXE --==**==--',cr,lf,'$'
Footer ENDP
;==========================================================
Usage PROC near
pusha
lea dx,usage_
Call Print
popa
ret
usage_ db 'USAGE: C2E PROGRAM.COM',cr,lf,'$'
Usage ENDP
;==========================================================
Print PROC near
mov ah,09h
int 21h
ret
Print ENDP
;==========================================================
Return PROC near
pusha
lea dx,return_
Call Print
popa
ret
return_ db cr,lf,'$'
Return ENDP
;==========================================================
FileName PROC near
pusha
mov dx,82h
Call Print
Call Return
popa
ret
FileName ENDP
;==========================================================
filesize dw 0
RFileHandle dw ?
WFileHandle dw ?
loadword dw ?
;==========================================================
Code ENDS
END Start
Last edited by 本是 on 2007-1-21 at 01:22 AM ]
|