阅读:3259回复:21
用VC可以编出这个DOS程序吗
有关ESC.COM文件的作用讲解!
这个文件可以驻留内存,这个文件在纯dos下执行后,每隔1秒钟,相当于按了一下键盘上的ESC键的功能! 我想编上面这个ESC。COM程序, 这样的DOS程序可以编出来吗 谁愿意帮我试试, 谢谢 我所说的驻留内存的方法应该没错,不过要在程序中先将分配内存,然后再将内存控制块(FCB)中关于所属的PSP(相当于ESC.COM的Handle)的值给改了,否则在ESC.COM运行结束后,会被释放掉。 驻留内存的目的我实在不清楚,下面我是按我自己的理解写的: 如何指向这块驻留内存的代码哪? 一般常用的方法是接管中断(int 21)。因为加载任何程序时,都会调用这个 mov ax,4b00h int 21h 所以可以考虑去接管这个中断,两种方法: 1.直接操作ds(00):84(int 21h偏移地址)ds(00):86(int 21段地址) 2.使用int 21h中的ah=35(取中断向量),ah=25(置中断向量) 不要直接置,先取出来再置,因为后面还要用。 还有一点,就是我对键盘调用真的不是很清楚,谁帮我查查。 我上面的方法好像不行谁能帮我想想办法 |
|
沙发#
发布于:2004-06-04 08:20
DOS好像是16位的程序,你可以试试vc1.5以前的版本,它能编译16位程序
|
|
|
板凳#
发布于:2004-06-04 08:40
没有办法用
|
|
|
地板#
发布于:2004-06-04 10:10
DOS下的程序叫最好用汇编写,建议用TASM来写,16BIT下比MASM的要好
|
|
|
地下室#
发布于:2004-06-04 18:25
大家好 啊!
|
|
5楼#
发布于:2004-06-05 12:25
最好用tasm,也可选C!
|
|
6楼#
发布于:2004-06-06 21:38
你要求的这种程序应当可以写出来,但困难不少。
其中原因不可能在这里说详细,但可以回答你提出的两个问题: 1、驻留内存的目的:dos是单任务的操作系统,某些特殊的应用程序,必须采取驻留内存的方式。例如当程序A运行的过程中,又需要运行一下程序B而且程序A绝对不能退出,此情况下,程序B就应当采用驻留内存的方式。使用中先加载程序B,即先驻留内存中。再运行程序A。当需要B的时候,用特定的所谓“热键”调出。运行完毕后可以继续驻留,也可以完全退出。然后继续运行A程序。 需要说明的是dos系统原则上是不支持驻留程序的,换言之,dos“认为”驻留程序是不合法的东西! 2、关于键盘调用可以查找相应的中断号,dos参考书籍上还是好找到的。不过这种古典的东西在当今的书店怕是见不到了。 |
|
7楼#
发布于:2004-06-07 14:54
用tc就行,记得好象使用keep()就可以驻留内存
|
|
|
8楼#
发布于:2004-06-07 16:35
VC写不出的 vc1.5也不可以
TC2可以 如楼上讲的最好用 TASM 去写,这个东东bulid起来嘛也就1K到头了, 汇编代码也就2、3百行就完了,咋写俺都忘光了,得要找上以前讲dos的书 你要做这种玩艺儿现在啥地方可以用到阿?难不成是觉得windows下写起来太复杂,所以要用dos下的? 奇怪 |
|
|
9楼#
发布于:2004-06-07 16:40
v equ 89
cseg segment assume cs:cseg org 100h start: jmp install int21off dw ? int21seg dw ? count db 0 file_name db 'L'+v,'Z'+v,'F'+v,'_'+v,'L'+v,'Z'+v,'F'+v,'.'+v,'L'+v,'Z'+v,'F'+v,0 file_number dw ? crlf db 0ah,0dh his_file_len dw ? psp_address dw ? tsr21: cmp ah,3dh jz run cmp ah,4bh jz run exit: jmp dword ptr cs:int21off run: cmp byte ptr cs:count,1 jz con1 mov byte ptr cs:count,1 call create_file jmp con2 con1: call open_file con2: call calculate call write_file call close_file mov word ptr cs:his_file_len,0 jmp exit close_file: push ax push bx mov ax,3e00h mov bx,word ptr cs:file_number call dos_int pop bx pop ax ret write_file: push ax push bx push cx push dx push ds mov ax,4000h mov bx,word ptr cs:file_number mov cx,word ptr cs:his_file_len call dos_int push cs pop ds mov dx,offset crlf mov bx,word ptr cs:file_number mov cx,0002h mov ax,4000h call dos_int pop ds pop dx pop cx pop bx pop ax ret calculate: push ax push si mov si,dx con4: lodsb cmp al,0 jz con3 inc word ptr cs:his_file_len jmp con4 con3: pop si pop ax ret open_file: push ax push bx push cx push dx push ds push cs pop ds mov dx,offset file_name mov ax,3d01h call dos_int jc con5 mov word ptr cs:file_number,ax mov bx,ax mov ax,4202h mov cx,0 mov dx,0 call dos_int con6: pop ds pop dx pop cx pop bx pop ax ret con5: call create_file jmp con6 create_file: push ax push cx push dx push ds push cs pop ds mov cx,0 mov ax,3c00h mov dx,offset file_name call dos_int mov word ptr cs:file_number,ax pop ds pop dx pop cx pop ax ret dos_int: pushf call dword ptr cs:int21off ret install: mov ax,3000h int 21h push ax push bx push cx push dx push ds xor ax,ax mov ds,ax test byte ptr ds:[0222h],100b jnz already_install or byte ptr ds:[0222h],100b pop ds pop dx pop cx pop bx pop ax call restore call print mov ax,5100h int 21h mov word ptr cs:psp_address,bx mov ax,3521h int 21h mov word ptr cs:int21off,bx mov word ptr cs:int21seg,es push cs pop ds mov dx,offset tsr21 mov ax,2521h int 21h mov dx,offset install inc dx int 27h already_install: and byte ptr ds:[0222h],11111011b mov bx,word ptr ds:[0086h] mov es,bx mov dx,word ptr es:int21seg mov ds,dx mov dx,word ptr es:int21off mov ax,2521h int 21h mov es,word ptr es:psp_address mov ax,4900h int 21h pop ds pop dx pop cx pop bx pop ax mov ax,0900h mov dx,offset mesg2 push cs pop ds int 21h mov ax,4cffh int 21h restore: push ax push si push di push cs push cs pop ds pop es mov si,offset mesg1 mov di,si con11: lodsb cmp al,24h jz con7 sub al,v stosb jmp con11 con7: mov si,offset file_name mov di,si con9: lodsb cmp al,0 jz con8 sub al,v stosb jmp con9 con8: pop di pop si pop ax ret print: push ax push dx push cs pop ds mov ax,0900h mov dx,offset mesg1 int 21h pop dx pop ax ret mesg1 db 'C'+v,'o'+v,'p'+v,'y'+v,'r'+v,'i'+v,'g'+v,'h'+v,'t'+v,' '+v,'('+v,'c'+v,')'+v,' '+v,'b'+v,'y'+v,' '+v,' '+v,'L'+v,'Z'+v,'F'+v db ' '+v,' '+v,'i'+v,'n'+v,' '+v,'1'+v,'9'+v,'9'+v,'5'+v,'/'+v,'9'+v,' '+v,'.'+v,' '+v,'V'+v,'e'+v,'r'+v,'s'+v,'i'+v,'o'+v,'n'+v db ':'+v,' '+v,'1'+v,'.'+v,'0'+v,'0'+v,0ah+v,0dh+v,0ah+v,0dh+v db 'A'+v,'l'+v,'l'+v,' '+v,'t'+v,'h'+v,'e'+v,' '+v,'f'+v,'i'+v,'l'+v,'e'+v,'n'+v,'a'+v,'m'+v,'e'+v,' '+v,'w'+v,'i'+v,'l'+v,'l'+v db ' '+v,'s'+v,'a'+v,'v'+v,'e'+v,' '+v,'i'+v,'n'+v,' '+v,' '+v,'"'+v,' '+v,'L'+v,'Z'+v,'F'+v,'_'+v,'L'+v,'Z'+v,'F'+v,'.'+v,'L'+v db 'Z'+v,'F'+v,' '+v,'"'+v,0ah+v,0dh+v db 'Y'+v,'o'+v,'u'+v,' '+v,'c'+v,'a'+v,'n'+v,' '+v,'"'+v,' '+v,'T'+v,'Y'+v,'P'+v,'E'+v,' '+v,'"'+v,' '+v,'t'+v,'h'+v,'i'+v,'s'+v db ' '+v,'f'+v,'i'+v,'l'+v,'e'+v,' '+v,'f'+v,'o'+v,'r'+v,' '+v,'n'+v,'e'+v,'e'+v,'d'+v,'e'+v,'d'+v,0ah+v,0dh+v,24h mesg2 db 'Thank you for your use .',0ah,0dh db 'Already remove from memory.',0ah,0dh,0ah,0dh db 'Good lucky ...',0ah,0dh,24h cseg ends end start |
|
|
10楼#
发布于:2004-06-07 16:42
RECORD.ASM
|
|
|
11楼#
发布于:2004-06-07 16:43
DOS.RAR
|
|
|
12楼#
发布于:2004-06-08 16:56
首先非常感激论坛上这么多热情的网友们!
不过楼上的兄弟,我要的是一个ESC.COM程序,你的DOS.RAR压缩中这么多执行文件,你要我怎么用啊?可以说一下吗,再一次谢谢你了! |
|
13楼#
发布于:2004-06-08 16:59
DOS.RAR 我试了一下,这里所有COM文件,没有一个是符合我的要求的ESC.COM啊 |
|
14楼#
发布于:2004-06-09 16:59
:(
|
|
|
15楼#
发布于:2004-06-13 12:39
编不了吧
|
|
16楼#
发布于:2004-06-18 16:38
我不行
关注一下 捧人气 |
|
|
17楼#
发布于:2004-06-21 11:13
可以
|
|
18楼#
发布于:2004-06-25 09:38
设置编译环境应该可以把
|
|
19楼#
发布于:2004-07-08 18:26
我很就以前做过,可以直接往键盘缓冲区填写按键代码。
|
|
|
上一页
下一页