| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 545 人关注过本帖
标题:Dos下键盘Pause键原理
只看楼主 加入收藏
imaha
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
Dos下键盘Pause键原理
  Dos按Pause键会将当前程序停止,但是1C中断不会停。想问问,Pause键的原理是什么。程序有可能屏蔽掉这个键么?还有,我的程序有时会出现死掉的情况,样子比较像按下了Pause键(机器没有接键盘),同样的1C中断不会停止,但在有的机器上就不会出。这会不会是因为什么软件的错误产生了按下Pause键的效果呢?谢谢了。
搜索更多相关主题的帖子: 键盘 软件 
2013-11-20 09:28
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:0 
让程序停下来的方法,硬件上就是中断了,软件上也可以模拟

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-11-20 10:02
imaha
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-20
收藏
得分:0 
按Pause键使用的是int 3么?可以在Dos下屏蔽Pause键么?
2013-11-20 10:46
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:10 
楼主,网上摘来的一段,有些字符错误,不晓得你的编译器能否支持union REGS

下面介绍如何使Break键失效。这是一种特殊的操作,在有些计算机上无法实现,而有些计算机上根本就没有Break键。因此,c语言中没有一条特殊命令用来解除Break键的功能,而且,即使在以MS:DOS为操作系统的计算机上,也没有一种标准的方法来实现这一点。在大多数计算机上,你必须用一条特殊的机器语言命令来实现这一点。下面是一个在MS-DOS中解除Break键功能的函数:
#include <dosh>
void StopBreak()
{
union REGS in,out;
in.x.ax=0x3301:
in.x.dx=O:
int86(0x21,&in,&out);
}
这个函数要设置一组寄存器,即把3301H赋给ax寄存器,把O赋给dx寄存器。然后,它将通过这些寄存器调用中断21H,从而调用DOS,并通知它不再希望让Break键中止程序的运行。
下面是一个用来测试该函数的程序:
#include<sio.h>
#include<dos.h>
void StopBreak()
{
union REGS in,out:
in.x.ax=Ox3301:
in.x.dx=O:
int86(Ox21,&in,&out):
}
int main()
{
int a:
long b:
StopBreak();
for(a=O;a<100; a)
{
StopBreak();
printf("Line %d.\n",a);
for(b=O;b<500000L; b);
}
return O:
}

埋头做牛,抬头做人,低头做狗
2013-11-20 11:05
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:10 
不知你的编译器是否支持int86这个函数
#include<stdio.h>
#include<dos.h>
#include<conio.h>

struct WORDREGS
{
    unsigned int ax,bx,cx,dx,si,di,cflag,flags;
};
struct BYTEREGS {
    unsigned char al,ah,bl,bh,cl,ch,dl,dh;
};
union REGS {
    struct  WORDREGS x;
    struct  BYTEREGS h;
};
void StopBreak()
{
union REGS in,out;

int cc = 0x21;
in.x.ax=0x3301;
in.x.dx=0;
int86(cc,&in,&out);
}
int main()
{
int a;
long b;
StopBreak();
for(a=0;a<100; a)
{
StopBreak();
printf("Line %d.\n",a);
for(b=0;b<500000L; b);
}
return 0;
}

埋头做牛,抬头做人,低头做狗
2013-11-20 11:26
imaha
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-20
收藏
得分:0 
谢谢了,帮我指了条路。
2013-11-20 13:52
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:0 
以下是引用imaha在2013-11-20 13:52:52的发言:

谢谢了,帮我指了条路。

不客气

埋头做牛,抬头做人,低头做狗
2013-11-20 14:26
imaha
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-11-20
收藏
得分:0 
   还是有点问题,查了下Dos中断说明,这个int 21的33是控制Ctrl+Break的,而不是Pause。使用如下代码,查看设置结果out.x.dx已经设置为0了,但是按下Pause后还是会使正在运行的软件停止。
    int cc = 0x21;
    in.x.ax=0x3300;
    in.x.dx=0;
    int86(cc,&in,&out);

2013-11-20 14:44
快速回复:Dos下键盘Pause键原理
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028404 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved