user-0 提问: C语言的一些问题，特别想问问int86函数

回复:
user: user-1
content: 引用 35 楼 qq_36179060 的回复:过两天就要验收了，不管怎么样，感谢各位的帮助了，虽然小白依旧卡死在bug里2333  做课设吧！ 小bug没事。

user: user-2
content: 过两天就要验收了，不管怎么样，感谢各位的帮助了，虽然小白依旧卡死在bug里2333

user: user-2
content: 引用 33 楼 bigwatercar 的回复:[quote=引用 32 楼 qianzilu 的回复:] [quote=引用 21 楼 bigwatercar 的回复:] http://download.csdn.net/detail/nasyatsz/1703436  楼主先看看这个能用不能，临时找了一个。感谢，之前帖子太多被刷过去了，才看到，感谢这么费心~[/quote]  结贴多给点儿分儿就行啦 引用 31 楼 qianzilu 的回复:再求问一下，运行程序时闪退可能有哪些原因呢？加了getch也停不住…… 贴代码[/quote] 解决了，说到底是编程习惯问题2333

user: user-1
content: 引用 32 楼 qianzilu 的回复:[quote=引用 21 楼 bigwatercar 的回复:] http://download.csdn.net/detail/nasyatsz/1703436  楼主先看看这个能用不能，临时找了一个。感谢，之前帖子太多被刷过去了，才看到，感谢这么费心~[/quote]  结贴多给点儿分儿就行啦 引用 31 楼 qianzilu 的回复:再求问一下，运行程序时闪退可能有哪些原因呢？加了getch也停不住…… 贴代码

user: user-0
content: 引用 21 楼 bigwatercar 的回复:http://download.csdn.net/detail/nasyatsz/1703436  楼主先看看这个能用不能，临时找了一个。感谢，之前帖子太多被刷过去了，才看到，感谢这么费心~

user: user-0
content: 再求问一下，运行程序时闪退可能有哪些原因呢？加了getch也停不住……

user: user-0
content: 引用 29 楼 hijack00 的回复:int86函数不是C标准库函数，而且BC也基本不流行了。建议楼主把精力放到主流的库和IDE上，不要在这些过时的技术上浪费时间了我也知道过时了，但是目前要用没办法啊……

user: user-3
content: int86函数不是C标准库函数，而且BC也基本不流行了。建议楼主把精力放到主流的库和IDE上，不要在这些过时的技术上浪费时间了

user: user-1
content: 引用 25 楼 zhangganglei 的回复:[quote=引用 24 楼 bigwatercar 的回复:] [quote=引用 22 楼 zhangganglei 的回复:] [quote=引用 20 楼 bigwatercar 的回复:] 楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！  大大能不能也给我发一份，现在在学中断，，但资料好少啊。网上的解释都不详细，看不太懂 感谢了[/quote]  你先看看微机原理，了解一下中断是什么，中断向量表。   你最好有一个学习板，能直接手工触发中断。[/quote]  中断和向量表我已经明白了。微机原理上学时看过，不过基本上忘了。手里没有硬件，所以只用TC的interrupt来写程序。想请教一个问题，网上搜来的中断程序，多数是一个把中断号写入0x13，然后计数器从0加到20自动退出的程序。。另外看过一个，把中断函数写入0X1B，则按ctrl+break调用。那我想问下，如何在按wads这四个键时产生中断，从而调用我自己写的函数呢。 麻烦大大告诉一下，或者提个醒，从哪里获得这些东西也成。谢谢。[/quote]  按键会产生键盘中断的，你把你的ISR挂到键盘中断就可以了。 应该是INT1（你确认一下）。这样只要按下键盘任何一个按键，你的ISR都会动，你在你的ISR中判断是不是WASD，是就处理，不是就继续调用你保存的旧的ISR入口。就酱~~

user: user-4
content: DOS下键盘中断是9 仅供参考：#define	cRES	0x70 #define	cSYM	0x70 #define	cIDE	0x71 #define	cFUN	0x75 #define cUSR    0x7B #define	cNUM	0x74 #define	cCOM	0x7E #define cSTR    0x79 #define cERR    0x3F //------------------------------------------------------- #pragma option -N- //------------------------------------------------------- #include <conio.h> #include <ctype.h> #include <dir.h> #include <dos.h> #include <process.h> #include <stdio.h> #include <stdlib.h> #include <string.h> //------------------------------------------------------- const char *sym=" &*<>()-=+[]:;,./?\\";//#$"` const char help[25][80]={ "谀Block哪哪哪哪哪哪哪哪哪哪哪履Cursor哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪目", "砪opy block        @c, ^kc   砱oto block beg  ^qb ?goto block end  ^qk     ?, "砫rop anchor       @a        砱oto line       ^J  ?MakeCtrOfScreen #f5     ?, "砿ark block begin  f7, ^kb   硃age down       ^c  ?MakeTopOfScreen f5      ?, "砿ark block end    f8, ^Kk   硃rev position   ^qp ?page up         ^r      ?, "砿ark line         @l        硈creen right    @f6 ?screen left     @f5     ?, "砿ove block        @m, ^kv   硈croll up       ^w  ?scroll down     ^z      ?, "硆ead block        @r, ^kr   硈hiftright      #f8 ?shiftleft       #f7     ?, "硊nmark block      @u, ^kh   硍ord right      ^f  ?word left       ^a      ?, "硍riteblock        @w, ^kw   媚Files哪哪哪哪哪哪哪哪哪哪穆腤indows- ^o 哪哪拇", "媚Edit哪哪哪哪哪哪哪哪哪哪哪拇change filename   @o, ^kf  砪lose window  ^oc ?, "砤dd line          f2        砮dit file         @e, ^ke  砱row window   ^og ?, "砫elete block      @g, ^ky   砮xit              ^kd      砈plit Window  ^oh ?, "砫el line          @d, ^y    砯ile              ^kx      硁ext window   ^on ?, "砫el rt word       ^t        砱lobal exit       @x, f10  硂ne window    ^oo ?, "砫el to eol        f6, ^qy   硁ext file         @n, ^kn  硃rev window   ^op ?, "砫up line          f4        硂s                @f9      硈hrink window ^os ?, "砳nsert line       @f2       硃quit             ^kq      硓oom window   ^oz ?, "砵oin line         @j        硃rev file         ^kp      媚Search/Replace哪拇", "砽iteral           ^p        硈ave file         ^ks      砯ind         ^qf  ?, "硈plit line        @s, ^n    硈hell             f9       砯ind replace ^qa  ?, "硊ndo cursorline   ^ql       媚Macro哪哪哪哪哪哪哪哪哪哪拇match        @f3  ?, "硊nkill            ^u        矼acro Record      ^m       硆epeat find  ^l   ?, "滥哪哪哪哪哪哪哪哪哪哪哪哪哪牧哪哪哪哪哪哪哪哪哪哪哪哪哪牧哪哪哪哪哪哪哪哪哪?, "              # = <Shift>     @ = <Alt>     ^ = <Ctrl>                       " }; char scr[4000]; int xx,yy,ii; //------------------------------------------------------- #define nRES 100 #define nFUN 500 #define nUSR 200 #define nBUF 6400 unsigned RES=0; char *res[nRES]; unsigned FUN=0; char *fun[nFUN]; unsigned USR=0; char *usr[nUSR]; char buf[nBUF]; //------------------------------------------------------- char str[41]; int directvideo=1; int in=0; int lines; int x,y,i,j,k,n,st,x1; char ascii[81],attr[80],attr1[80]; extern unsigned _heaplen = 32; extern unsigned _stklen  = 256; void interrupt (*oldint9)(); //------------------------------------------------------- void getline(int y) { 	char far *scr; 	int	i,j;  	scr=(char far *)(0xB8000000L+y*160); 	for	(i=0,j=0;i<160;i+=2,j++) { 		ascii[j]=scr[i]; 		attr[j]=scr[i+1]; 	} 	ascii[80]=0; 	memcpy(attr1,attr,80); } //------------------------------------------------------- void putline(int y) { 	char far *scr; 	int	i,j;  	scr=(char far *)(0xB8000000L+y*160); 	for	(i=0,j=0;i<160;i+=2,j++) { 		scr[i]=ascii[j]; 		scr[i+1]=attr[j]; 	} } //------------------------------------------------------- void interrupt newint9() { 	if (in==0) { 		in=1; 		if ((peekb(0,0x417)&0x10)==0x10) {//ScrollLock 			lines=peekb(0,0x484)+1; 			for	(y=1;y<lines;y++) { 				getline(y); 				x=0; 				st=0; 				while (1) { 					if (x>=80) break; 					if (st==0) { 						if (isalpha(ascii[x])||ascii[x]=='_') { 							st=1; 							i=0; 							str[i]=ascii[x]; 							x1=x; 							i++; 						} else if (isdigit(ascii[x])) { 							st=4; 							x1=x; 						} else if (strchr(sym,ascii[x])!=NULL) { 							attr[x]=cSYM; 						} else if (ascii[x]=='#') { 							st=2; 							attr[x]=cCOM; 						} else if (ascii[x]=='"'||ascii[x]==39) { 							st=3; 							attr[x]=cSTR; 						} else { 							attr[x]=cERR; 						} 						x++; 						continue; 					} 					if (st==4) {//in number 						if (!isdigit(ascii[x]))	{ 							st=0; 							memset(attr+x1,cNUM,x-x1); 							x--; 						} 						x++; 						continue; 					} 					if (st==3) {//in string 						if (ascii[x]!='"'&&ascii[x]!=39) { 							attr[x]=cSTR; 						} else { 							st=0; 							attr[x]=cSTR; 						} 						x++; 						continue; 					} 					if (st==2) {//in comment 						attr[x]=cCOM; 						x++; 						continue; 					} 					if (st==1) {//in [A-Za-z_][0-9A-Za-z_]@ 						if (isalnum(ascii[x])||ascii[x]=='_') { 							str[i]=ascii[x]; 							i++; 						} else { 							st=0; 							str[i]=0; 							for	(j=0;j<RES;j++)	{ 								if (strcmp(str,res[j])==0) break; 							} 							if (j<RES) memset(attr+x1,cRES,x-x1); 							else { 								for	(j=0;j<FUN;j++)	{ 									if (strcmp(str,fun[j])==0) break; 								} 								if (j<FUN) memset(attr+x1,cFUN,x-x1); 								else { 									for	(j=0;j<USR;j++)	{ 										if (strcmp(str,usr[j])==0) break; 									} 									if (j<USR) memset(attr+x1,cUSR,x-x1); 									else memset(attr+x1,cIDE,x-x1); 								} 							} 							x--; 						} 						x++; 						continue; 					} 				} 				if (strchr(ascii,'?)!=NULL                   ||strchr(ascii,'?)!=NULL 				  ||strchr(ascii,'?)!=NULL                   ||strchr(ascii,'?)!=NULL                   ||strchr(ascii,'?)!=NULL 				  ||strchr(ascii,'?)!=NULL) { 					st=0; 					for	(i=0;i<80;i++) { 						if (st==0) {                             if (ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?) { 								st=1; 								attr[i]=attr1[i]; 							} 							continue; 						} 						if (st==1) { 							attr[i]=attr1[i]; 							if (ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?                               ||ascii[i]=='?) { 								st=0; 							} 						} 					} 				} else if (y==peekb(0,0x451)) for (i=0;i<80;i++) attr[i]&=0x3F; 				for	(i=0;i<80;i++) { 					if ((attr1[i]&0xF0)==0x20) attr[i]=(attr[i]&0x0F)|0x20; 					if ((attr1[i]&0xF0)==0x40) attr[i]=0x4F; 					if ((attr1[i]&0xF0)==0x10) attr[i]=0x1F; 				} 				putline(y); 			} 		} 		in=0; 	} 	oldint9(); } //------------------------------------------------------- int Load(char *name,int *count,char *table[],int number) { 	FILE *f; 	char *p;  	p=searchpath(name); 	if ((f=fopen(p,"r"))==NULL) { 		printf("Can not open %s\n",name); 		return(0); 	} else { 		while (1) { 			fgets(str,40,f); 			if (feof(f)) break; 			(*count)++; 		} 		if ((*count)>number) { 			printf("%s's items > %d\n",name,number); 			fclose(f); 			return(0); 		} 		rewind(f); 		k=n; 		for	(i=0;i<(*count);i++) { 			fgets(str,40,f); 			memcpy(buf+k,str,strlen(str)-1); 			table[i]=buf+k; 			k+=strlen(str); 			buf[k-1]=0; 		} 		n=k; 		fclose(f); 		if (n>nBUF)	{ 			printf("Total character numbers > %d\n",nBUF); 			return(0); 		} 		return(1); 	} } //------------------------------------------------------- void main(int argc, char *argv[]) { 	xx=wherex(); 	yy=wherey()-1; 	_fmemcpy(scr,(char far *)0xB8000000L,4000); 	if (argc==2&&(argv[1][0]=='/'&&argv[1][1]=='?')) { 		clrscr(); 		for	(i=0;i<25;i++) { 			cprintf("\r\n%s",help[i]); 		} EXIT: 		getch(); 	} else { 		n=0; 		if (Load("VOSRES.SYN",&RES,res,nRES)==0) goto EXIT; 		if (Load("VOSFUN.SYN",&FUN,fun,nFUN)==0) goto EXIT; 		if (Load("VOSUSR.SYN",&USR,usr,nUSR)==0) goto EXIT; 		oldint9=getvect(9); 		setvect(9,newint9);         textmode(C4350); 		spawnvp(P_WAIT,	"ED.EXE", argv); 		textmode(C80); 		setvect(9,oldint9); 	} 	_fmemcpy((char far *)0xB8000000L,scr,4000); 	gotoxy(xx,yy); }

user: user-1
content: 引用 22 楼 zhangganglei 的回复:[quote=引用 20 楼 bigwatercar 的回复:] 楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！  大大能不能也给我发一份，现在在学中断，，但资料好少啊。网上的解释都不详细，看不太懂 感谢了[/quote]  你先看看微机原理，了解一下中断是什么，中断向量表。   你最好有一个学习板，能直接手工触发中断。

user: user-5
content: 还是学Win32 API吧，这些东西一般人没用了。

user: user-6
content: 引用 24 楼 bigwatercar 的回复:[quote=引用 22 楼 zhangganglei 的回复:] [quote=引用 20 楼 bigwatercar 的回复:] 楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！  大大能不能也给我发一份，现在在学中断，，但资料好少啊。网上的解释都不详细，看不太懂 感谢了[/quote]  你先看看微机原理，了解一下中断是什么，中断向量表。   你最好有一个学习板，能直接手工触发中断。[/quote]  中断和向量表我已经明白了。微机原理上学时看过，不过基本上忘了。手里没有硬件，所以只用TC的interrupt来写程序。想请教一个问题，网上搜来的中断程序，多数是一个把中断号写入0x13，然后计数器从0加到20自动退出的程序。。另外看过一个，把中断函数写入0X1B，则按ctrl+break调用。那我想问下，如何在按wads这四个键时产生中断，从而调用我自己写的函数呢。 麻烦大大告诉一下，或者提个醒，从哪里获得这些东西也成。谢谢。

user: user-4
content: C:\>VESA This video card supports VESA The VESA version is:2.0 The OEM is S3 Incorporated. Trio64 This video card supports following VESA mode: 0100	0101	0102	0103	0104	0105	0106	0107	010D	010E	010F	0110	0111	0112	0113	0114	0115	0116	0117	0150	0151	0152	0153	0160	0161	0162	0165	0170	0171	0172	0175	0190	0191	0192	0207	0209	020A	0213	0222	0223	0224	0225	  VIDEO mode=0100  TextMode=100	Xres=640	Yres=400	BitsPerPixel=8 textW=8	textH=16 NumPlanes=1	NumBank=1	MemMode=4	BankSize=0 NumPages=4	IncPages=1	Margin=256

user: user-6
content: 引用 20 楼 bigwatercar 的回复:楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！  大大能不能也给我发一份，现在在学中断，，但资料好少啊。网上的解释都不详细，看不太懂 感谢了

user: user-1
content: http://download.csdn.net/detail/nasyatsz/1703436  楼主先看看这个能用不能，临时找了一个。

user: user-1
content: 楼主，我晚上给你发资料。在家里电脑上， 有DOS中断和BIOS中断说明。 楼上这些不回答楼主的问题，反倒嫌楼主工具落后，不都是这么过来的嘛！

user: user-7
content: 这些现在真的是用不上了

user: user-5
content: 引用 17 楼 qianzilu 的回复:[quote=引用 16 楼 u010165006 的回复:] 是学习环境还是生产环境？ 呃，抱歉不是很懂这两者的区别，但就是暂时短期内是在用BC3.1做课设，用的是集成虚拟DISK_C的版本。[/quote]  做课设，如果你只是需要解析BMP图片格式，没必要用DOS平台的BC3.1，用VC+EasyX就可以了，你可以用EasyX创建窗口，自己解析BMP再逐点画到窗口，如果你不用EasyX的图片显示函数的话。

user: user-0
content: 引用 16 楼 u010165006 的回复:是学习环境还是生产环境？ 呃，抱歉不是很懂这两者的区别，但就是暂时短期内是在用BC3.1做课设，用的是集成虚拟DISK_C的版本。