| 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
『楼 主』:
 一个dos下模拟线程(进程)切换的程序
 
使用 LLM 解释/回答一下
  
#include <dos.h> 
#include <stdio.h> 
#include <conio.h> 
#define INTERRUPT 0xfc 
unsigned task1; 
unsigned task2; 
int l=0; 
int h=0; 
int num=0; 
//void (interrupt far * oldhandler)(); 
void os_task1(void) 
{ 
while(1) 
{ 
printf("this 1\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
 // getchar(); 
 // sleep(1); 
asm int 0xfc 
} 
} 
void os_task2(void) 
{ 
while(1) 
{ 
printf("this 2\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
 // getchar(); 
 // sleep(1); 
asm int 0xfc 
} 
} 
void interrupt far handler() 
{ 
// printf("this is interrupt"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
h++; 
printf("num=%d\n",h); 
if(l){ 
l=0; 
//pusha 
//pop 
//                printf("%d\n"",num 
/* asm mov bx,offset task2 
asm pop ax 
asm mov word ptr ,ax 
asm pop ax 
asm mov word ptr ,ax 
// asm popf 
  */ asm mov bx,offset task1 
asm mov ax,word ptr 
asm push ax 
asm mov ax,word ptr 
asm push ax 
//asm pushf 
asm iret 
} 
else 
{ 
l=1; 
asm pop ax 
asm pop ax 
// asm popf 
asm mov bx,offset task2 
asm mov ax,word ptr 
asm push ax 
asm mov ax,word ptr 
asm push ax 
  // asm pushf 
asm iret 
} 
} 
main() 
{ 
void interrupt far handler(); 
task1=FP_OFF(os_task1); 
task1=FP_SEG(os_task1); 
// task2=FP_OFF(os_task2); 
// task2=FP_SEG(os_task2); 
// os_task1(); 
// printf("task1=%04x task1=%04x\n",task1,task1); 
task2=FP_OFF(os_task2); 
task2=FP_SEG(os_task2); 
setvect(INTERRUPT,handler); 
// asm int 0xfc 
os_task1(); 
} 
此程序参考了ucos源码,但现在有问题。切换线程的次数有限制,达到一定次数后程序的cs:ip不正确,在98下死机,在w2000下出现fcb unavailable请大家看看,找出问题,谢谢。 
msn:yaly163@hotmail.com 
 
    
 
  
 |   
 | 
  2004-9-7 00:00 | 
  
 | 
 | 
 
Wengier 
系统支持
 
              “新DOS时代”站长
  
 
积分 27736 
发帖 10521 
注册 2002-10-9 
状态 离线
 | 
『第 2 楼』:
 
 
使用 LLM 解释/回答一下
  
“在98下死机,在w2000下出现fcb unavailable”这不是DOS程序吗?在纯DOS下呢? 
 
    
 
  
  |  
                  
  
                    Wengier - 新DOS时代 
 
欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址: 
http://wendos.mycool.net/ 
 
E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!) 
 
  |   
 | 
  2004-9-7 00:00 | 
  
 | 
 | 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
是死机,这一点没错。原因今天早上找到了。明天贴出代码。msn:yaly163@hotmail.com 
 
    
 
  
 |   
 | 
  2004-9-8 00:00 | 
  
 | 
 | 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
『第 4 楼』:
 
 
使用 LLM 解释/回答一下
  
#include <dos.h> 
#include <stdio.h> 
#include <conio.h> 
#define INTERRUPT 0xfc 
unsigned task1; 
unsigned task2; 
unsigned sp_task; 
int l=0; 
long int h=0; 
int num=0; 
void os_task1(void) 
{ 
 while(1) 
 { 
  printf("this 1\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
   // getchar(); 
    sleep(1); 
  asm int 0xfc 
 } 
} 
void os_task2(void) 
{ 
 while(1) 
 { 
  printf("this 2\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
  // getchar(); 
   sleep(1); 
  asm int 0xfc 
 } 
} 
void interrupt far handler() 
{ 
h++; 
printf("num=%ld\n",h); 
if(l){  l=0; 
  asm pushf 
    asm mov bx,offset sp_task 
  asm mov sp,bx 
  asm mov bx,offset task1 
  asm mov ax,word ptr 
  asm push ax 
  asm mov ax,word ptr 
  asm push ax 
  asm iret 
  } 
else 
{ 
l=1; 
asm popf 
asm mov bx,offset task2 
asm mov ax,word ptr 
asm push ax 
asm mov ax,word ptr 
asm push ax 
asm iret} 
} 
main() 
{ 
void interrupt far handler();task1=FP_OFF(os_task1); 
task1=FP_SEG(os_task1);task2=FP_OFF(os_task2); 
task2=FP_SEG(os_task2); 
asm mov ax,offset sp_task 
asm mov sp,ax 
setvect(INTERRUPT,handler);os_task1(); 
} 
 
 
    
 
  
 |   
 | 
  2004-9-9 00:00 | 
  
 | 
 | 
 
cdl 
中级用户
 
    bbpc
  
 
积分 340 
发帖 107 
注册 2004-4-11 
状态 离线
 | 
『第 5 楼』:
 
 
使用 LLM 解释/回答一下
  
栈还是没有保护好,程序能正常跑是因为任务里没有任何变量,如果在任务里有定义临时变量,就有问题了。 
 
    
 
  
  |  
                  
  
                    x86!dos! 
爱你就象老鼠爱大米 
http://www.baby-pc.com/ |   
 | 
  2004-9-20 00:00 | 
  
 | 
 | 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
『第 6 楼』:
 
 
使用 LLM 解释/回答一下
  
是的,上学的时候没有好好学习汇编,现在感觉基础不好,尤其是对栈的理解上有问题,致使现在的程序有问题。这段时间我也在努力学习以前的知识。在有几天我会重新发表一个线程切换的例子。msn: yaly163@hotmail.com 
 
    
 
  
 |   
 | 
  2004-9-21 00:00 | 
  
 | 
 | 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
『第 7 楼』:
 
 
使用 LLM 解释/回答一下
  
现在把程序修改了,可还是不能正常工作,希望各位帮我看看。msn:yaly163@hotmail.com     EXTRN  _task1:word 
     extrn _l:byte 
     extrn _task_ss:word 
     extrn _change:far 
     PUBLIC _OSTickISR 
     PUBLIC _OSStartHighRdy 
     PUBLIC _OSStartSample 
     PUBLIC _sample 
     public _OSSw 
.MODEL      SMALL 
.CODE 
.186 
;================================================================; 
_OSSw proc far 
            PUSHA                     ;Save current task's context 
            PUSH   ES 
     POP    ES 
     POPA 
 iret 
_OSSw endp 
;=============================================================; 
_OSTickISR  PROC   far 
 pusha 
 push es 
 mov ax,seg (_task1) 
 mov ds,ax 
 call _change 
 mov bx,offset (_task1) 
 mov ss, 
 pop es 
 popa 
 iret 
_OSTickISR  ENDP 
;================================================================; 
_OSStartHighRdy proc NEAR 
 MOV AX, SEG(_task1) 
 MOV DS, AX 
 mov bx, offset _task1 
 mov sp,  
 mov ax, ds 
 mov ss, ax 
 popa 
 pop es 
 iret 
_OSStartHighRdy ENDP 
;================================================================; 
_sample proc      far 
 add sp,10 
 mov ax, seg (_task1) 
 mov ds, ax 
 mov bx, offset _task1 
 mov sp,  
 mov ss, ax 
 pop es 
 popa 
; call _OSStartSample 
 iret 
endp 
_OSStartSample     proc   near 
 mov ax, seg (_task1) 
 mov ds, ax 
 mov bx, offset _task1 
 ret 
endpWRITE_CHAR      PROC 
 MOV AH,2h 
 INT 21h 
 RET 
WRITE_CHAR      ENDP 
end#include <dos.h> 
#include <stdio.h> 
#include <conio.h> 
unsigned int task_ss; 
unsigned int task1; 
int m=0; 
int n=0; 
int l=0;void far OSSw(); 
void far sample(); 
void far OSTickISR(); 
void far OSStartHighRdy(); 
void far OSStartSample(); 
void far change() 
{ 
// sample(); 
 if(!l) 
 { 
  l=1; 
 task1=(unsigned int )FP_OFF(&task_ss); 
 } 
 else 
 { 
  l=0; 
 task1=(unsigned int )FP_OFF(&task_ss); } 
 sample(); 
} 
void far os_task1() 
{ 
// int m=0; 
// m++; 
 while(1) 
 {  printf("this is a task1 \n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
//  getchar(); 
//  OSStartSample(); 
 } 
} 
void far os_task2() 
{ 
// int n=0; 
// n++; 
 while(1) 
 { 
  printf("this is a task2 \n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
//  OSStartSample(); 
 } 
} 
void main(void) 
{ 
// memset(task_ss,0x0000,sizeof(unsigned int)*1024); 
 task_ss=(unsigned int)FP_OFF(&os_task1); 
 task_ss=(unsigned int)FP_SEG(&os_task1); 
 task_ss=0x0200; task1=(unsigned int )FP_OFF(&task_ss); task_ss=(unsigned int)FP_OFF(&os_task2); 
 task_ss=(unsigned int)FP_SEG(&os_task2); 
 task_ss=0x0200; 
 task1=(unsigned int)FP_OFF(&task_ss); 
 setvect(0xf0,(void interrupt (*)(void))OSSw); 
 setvect(0x1c,(void interrupt (*)(void))OSTickISR); 
 OSStartHighRdy(); 
 while(1) 
 { 
  printf("this is a test\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
 }} 
 
    
 
  
 |   
 | 
  2004-10-12 00:00 | 
  
 | 
 | 
 
cdl 
中级用户
 
    bbpc
  
 
积分 340 
发帖 107 
注册 2004-4-11 
状态 离线
 | 
『第 8 楼』:
 
 
使用 LLM 解释/回答一下
  
这位老兄能把现象描述一下吗?还有你的程序最好写注释。 
 
    
 
  
  |  
                  
  
                    x86!dos! 
爱你就象老鼠爱大米 
http://www.baby-pc.com/ |   
 | 
  2004-10-12 00:00 | 
  
 | 
 | 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
『第 9 楼』:
 
 
使用 LLM 解释/回答一下
  
c语言部分:1。设置dos下的1c的中断2。将os_task1的seg和off装入变量task_ss中,将os_task2的seg和off装入task_ss中3。OSStartHighRdy();启动os_task1 
 
    
 
  
 |   
 | 
  2004-10-13 00:00 | 
  
 | 
 | 
 
cdl 
中级用户
 
    bbpc
  
 
积分 340 
发帖 107 
注册 2004-4-11 
状态 离线
 | 
『第 10 楼』:
 
 
使用 LLM 解释/回答一下
  
OSStartHighRdy()能启动os_task1吗?iret弹出的cs和ip是os_task1的入口吗?task1=(unsigned int )FP_OFF(&task_ss);中task_ss里是啥? 
 
    
 
  
  |  
                  
  
                    x86!dos! 
爱你就象老鼠爱大米 
http://www.baby-pc.com/ |   
 | 
  2004-10-13 00:00 | 
  
 | 
 | 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
『第 11 楼』:
 
 
使用 LLM 解释/回答一下
  
OSStartHighRdy()能启动os_task1吗?iret弹出的cs和ip是os_task1的入口吗?是的。task1=(unsigned int )FP_OFF(&task_ss);中task_ss里是啥?task_ss里是任意值,用作popa的出栈的值。 
 
    
 
  
 |   
 | 
  2004-10-13 00:00 | 
  
 | 
 | 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
 | 
  2004-10-13 00:00 | 
  
 | 
 | 
 
cdl 
中级用户
 
    bbpc
  
 
积分 340 
发帖 107 
注册 2004-4-11 
状态 离线
 | 
『第 13 楼』:
 
 
使用 LLM 解释/回答一下
  
能把不能正常工作的现象描述一下吗 
 
    
 
  
  |  
                  
  
                    x86!dos! 
爱你就象老鼠爱大米 
http://www.baby-pc.com/ |   
 | 
  2004-10-13 00:00 | 
  
 | 
 | 
 
yaly 
初级用户
 
  
 
  
 
积分 160 
发帖 21 
注册 2004-8-26 
状态 离线
 | 
『第 14 楼』:
 
 
使用 LLM 解释/回答一下
  
现象:1。可以通过OSStartHighRdy()运行相应的os_task1,os_task2.2。我想通过dos下0x1c的中断进行os_task1,os_task2的任务的切换,可以从os_task1切换到os_task2,但0x1c的中断就不再产生,而且键盘上的break键也不起作用了。一般情况下break键按下,程序户停止运行,但中断会不会停止。0x1c中断没有了,就不能再进行任务的切换了。以上为现象。欢迎讨论。msn:yaly163@hotmail.com 
 
    
 
  
 |   
 | 
  2004-10-14 00:00 | 
  
 |