Скачиваний:
18
Добавлен:
01.05.2014
Размер:
10.07 Кб
Скачать
я22.3. ЏаЁ¬Ґал ॠ«Ё§ жЁЁ б®Їа®Ја ¬¬ ў п§лЄҐ ‘Ё Ё
я2ў § йЁйҐ­­®¬ ०Ё¬Ґ Їа®жҐбб®а  80•86

я12.3.1. ЏаЁ¬Ґа ॠ«Ё§ жЁЁ б®Їа®Ја ¬¬ ў ‘Ё

‚ п§лЄҐ ‘Ё бгйҐбвўгҐв ЇаҐ¤®ЇаҐ¤Ґ«Ґ­­ п бвагЄвга , Ё¬Ґой п
б«Ґ¤го饥 ®ЇЁб ­ЁҐ.
€¬п вЁЇ  jmp_buf. ќв® Ї® бгвЁ ¤Ґ«  § ЇЁбм, ўЄ«оз ой п 10 Ї®-
«Ґ© вЁЇ  word. €¬Ґ­  Ї®«Ґ© Ё¬Ґов б«Ґ¤гойЁ© ўЁ¤:
j_sp, j_cs, j_bp, j_si,
j_ss, j_ip, j_di, j_ds.
j_flag, j_es,
—в®Ўл ба §г Їа®ўҐбвЁ Ї а ««Ґ«м б б®Їа®Ја ¬¬ ¬Ё, § ¬ҐвЁ¬, зв®
бвагЄвга  Ї®¤®Ў­®Ј® вЁЇ  ¬®¦Ґв ўлбвгЇЁвм ў Є зҐб⢥ ¤ҐбЄаЁЇв®а 
б®Їа®Ја ¬¬л, ЇаЁзҐ¬ ¤ ¦Ґ Ў®«ҐҐ Ё­д®а¬ вЁў­®Ј®, 祬 в®в, Є®в®ал©
¬л а бᬮв५Ё а ­ҐҐ.
„«п а Ў®вл б® бвагЄвга®© jmp_buf бгйҐбвўгҐв Ї а  дг­ЄжЁ©,
Ё¬Ґой п б«Ґ¤го饥 ®ЇЁб ­ЁҐ:
- int setjmp(jmp_buf jmpb) - ЇЁиҐв б®бв®п­ЁҐ ⥪г饩 § ¤ зЁ
ў ЎгдҐа jmpb Ё ў®§ўа й Ґв 0;
- void longjmp(jmp_buf jmpb, int retval) - ў®ббв ­ ў«Ёў Ґв
б®бв®п­ЁҐ § ¤ зЁ Ё§ jmpb в Є, зв® § ¤ з  Їа®¤®«¦ Ґв бў®Ґ ўлЇ®«­Ґ-
­ЁҐ б в®© в®зЄЁ, ў Є®в®аго Ўл ®­  ЇаЁи« , Ґб«Ё Ўл дг­ЄжЁп setjmp
ўҐа­г«  ­Ґ 0,   §­ зҐ­ЁҐ, а ў­®Ґ retval.
ђ бᬮваЁ¬ бвагЄвгаг б®Їа®Ја ¬¬ Ё дг­ЄжЁЁ Transfer ¤«п ¤ ­-
­®Ј® б«гз п.

void cor1(void) void cor2(void)
{ {
while (1) while (1)
{ {
... ...
swt(jmpc1,jmpc2); swt(jmpc2,jmpc1);
} }
} }

void swt(from, to)
jmp_buf from,to;
{
if (0 == setjmp(from)) //setjmp ЇЁиҐв в Є®Ґ б®бв®п­ЁҐ ў ЎгдҐа
longjmp(to,1); from, зв® Є®Ј¤  Ўг¤Ґв ўл§®ў longjmp
***** б нвЁ¬ ЎгдҐа®¬, гЇа ў«Ґ­ЁҐ ЇҐаҐ¤ бвбп
} ў в®зЄг *****

я1€­ЁжЁ «Ё§ жЁп ЎгдҐа я0 я1(­  ЇаЁ¬ҐаҐ cor1)

jmp_buf jmpc1;
unsigned stack1[1000];
struct SREGS segs;
segread(&segs);
jmpc1[0].j_sp = FP_OFF(stack1) + 1982;
jmpc1[0].j_ss = FP_SEG(stack1);
jmpc1[0].j_flag = 0x200; {ЇаҐалў ­Ёп а §аҐиҐ­л}
jmpc1[0].j_cs = FP_SEG(cor1);
jmpc1[0].j_ip = FP_OFF(cor1);
jmpc1[0].j_bp = jmpc1[0].j_sp;
jmpc1[0].j_di = 0;
jmpc1[0].j_es = segs.es;
jmpc1[0].j_si = 0;
jmpc1[0].j_ds = segs.ds;
”г­ЄжЁЁ setjmp Ё longjmp ў¬Ґб⥠ᮠбвагЄвга®© jmp_buf пў«п-
овбп з१ўлз ©­® 㤮Ў­л¬ б।бвў®¬ ॠ«Ё§ жЁЁ б®Їа®Ја ¬¬. ‚®-ЇҐа-
ўле, ¬л ­Ґ бЇгбЄ Ґ¬бп ­  га®ўҐ­м  бᥬЎ«Ґа ,   ў®-ўв®але, ўЁ¤Ё¬®,
§ ЇЁбм б®бв®п­Ёп ॣЁбва®ў ў ЎгдҐа Ё ў®ббв ­®ў«Ґ­ЁҐ Ёе Ё§ ЎгдҐа 
Їа®Ёб室Ёв ў ०Ё¬Ґ § ЇаҐв  ЇаҐалў ­Ё©, зв® ®ЎҐбЇҐзЁў Ґв ўлб®Єго
­ ¤Ґ¦­®бвм ЇҐаҐЄ«о祭Ёп § ¤ з.

я12.3.2. ЏаЁ¬Ґа ॠ«Ё§ жЁЁ б®Їа®Ја ¬¬ ў § йЁйҐ­­®¬ ०Ё¬Ґ

‡ йЁйҐ­­л© ०Ё¬ Їа®жҐбб®а   аеЁвҐЄвга­® ᮧ¤ ­ ¤«п ®аЈ ­Ё-
§ жЁЁ ¬­®Ј®§ ¤ з­®бвЁ. “ § йЁйҐ­­®Ј® ०Ё¬  ¬­®Ј®  бЇҐЄв®ў, §¤Ґбм
¬л а бᬮваЁ¬ Ё¬Ґ­­® ў®Їа®бл ᮧ¤ ­Ёп Ё ЇҐаҐЄ«о祭Ёп § ¤ з, Є®в®-
алҐ Ї® бгвЁ ¤Ґ«  нЄўЁў «Ґ­в­л ­ иҐ¬г Ї®­пвЁо б®Їа®Ја ¬¬.
ЏаЁ¬Ґа, Є®в®ал© аҐ «Ё§гҐв ЇҐаҐЄ«о祭ЁҐ § ¤ з ў § йЁйҐ­­®¬
०Ё¬Ґ, Ї®«­®бвмо ­ ЇЁб ­ ­   бᥬЎ«ҐаҐ. џ Ўг¤г ЇаЁў®¤Ёвм §¤Ґбм
в®«мЄ® да Ј¬Ґ­вл ЇаЁ¬Ґа . …б«Ё Є®¬г-в® ­г¦Ґ­ Ї®«­л© ⥪бв ЇаЁ¬Ґ-
а , в® б ­Ё¬ ¬®¦­® в Є¦Ґ ®§­ Є®¬Ёвмбп.
„®бвгЇ Є Ї ¬пвЁ ў § йЁйҐ­­®¬ ०Ё¬Ґ ®бгйҐбвў«пҐвбп ­Ґ ­ҐЇ®б-
।б⢥­­® Ї®  ¤аҐбг,   зҐаҐ§ бЇҐжЁ «м­лҐ в Ў«Ёжл - в Ў«Ёжл ¤ҐбЄ-
аЁЇв®а®ў. ‚ в Ў«ЁжҐ ¤ҐбЄаЁЇв®а®ў еа ­пвбп бва®ЄЁ, ®ЇЁблў ойЁҐ ®в-
¤Ґ«м­лҐ гз бвЄЁ Ї ¬пвЁ - бва ­Ёжл, Ґб«Ё а §¬Ґа гз бвЄ  Ї®бв®п­Ґ­
Ё Ё§ўҐб⥭, Ё«Ё ᥣ¬Ґ­вл, а §¬Ґа Є®в®але ¬®¦Ґв ¬Ґ­пвмбп.
„«п ®ЇЁб ­Ёп § ¤ з бгйҐбвўгҐв бвагЄвга , Є®в®а п ­ §лў Ґвбп
"ᥣ¬Ґ­в б®бв®п­Ёп § ¤ зЁ" TSS. Ћ­  Ё¬ҐҐв б«Ґ¤гойЁ© ўЁ¤:

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і ‘Ґ«ҐЄв®а LDT і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ‘Ґ«ҐЄв®а DS і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ‘Ґ«ҐЄв®а SS і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ‘Ґ«ҐЄв®а CS і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ‘Ґ«ҐЄв®а ES і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ђҐЈЁбвал AX, BX, CX, DX, SP, BP, SI, DIі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ђҐЈЁбва д« Ј®ў і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і IP і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і SS, SP ¤«п га®ў­п ЇаЁўЁ«ҐЈЁ© 2 і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і SS, SP ¤«п га®ў­п ЇаЁўЁ«ҐЈЁ© 1 і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і SS, SP ¤«п га®ў­п ЇаЁўЁ«ҐЈЁ© 0 і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і “Є § вҐ«м ­  б«Ґ¤гойЁ© TSS і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

Љ Є ўЁ¤­®, нв® ®Їпвм ­ и ¤ҐбЄаЁЇв®а, в®«мЄ® ҐйҐ Ў®«ҐҐ Ё­д®а-
¬ вЁў­л©, ¤ ¦Ґ Ї® ба ў­Ґ­Ёо б® бвагЄвга®© jmp_buf Ё§ ‘Ё.
„«п ўлЇ®«­Ґ­Ёп Їа®Ја ¬¬л ў § йЁйҐ­­®¬ ०Ё¬Ґ ᮧ¤ Ґвбп Ј«®-
Ў «м­ п в Ў«Ёж  ¤ҐбЄаЁЇв®а®ў GDT, бва®ЄЁ Є®в®а®© ўЄ«оз ов ¤ҐбЄ-
аЁЇв®ал TSS:

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і ­Ґ ЁбЇ®«м§гҐвбп і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ®ЇЁб ­ЁҐ б ¬®© в Ў«Ёжл ¤ҐбЄаЁЇв®а®ўі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ¤ҐбЄаЁЇв®а ᥣ¬Ґ­в  ¤ ­­ле і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ¤ҐбЄаЁЇв®а ᥣ¬Ґ­в  б⥪  і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ¤ҐбЄаЁЇв®а Є®¤®ў®Ј® ᥣ¬Ґ­в  і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ¤ҐбЄаЁЇв®а § ¤ зЁ - main і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ¤ҐбЄаЁЇв®а § ¤ зЁ 1 і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ¤ҐбЄаЁЇв®а § ¤ зЁ 2 і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

‘ва®Є  в Ў«Ёжл ¤ҐбЄаЁЇв®а®ў ᮤҐа¦Ёв б«Ґ¤гойЁҐ ¤ ­­лҐ:

ЪДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДї
іђ §¬Ґа ᥣ¬Ґ­в  і Ђ¤аҐб ᥣ¬Ґ­в  і ЏаЁ§­ Є ᥣ¬Ґ­в  і
АДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДЩ

‚ Їа®Ја ¬¬г, ॠ«Ё§гойго ЇҐаҐЄ«о祭ЁҐ § ¤ з ў § йЁйҐ­­®¬ аҐ-
¦Ё¬Ґ, ўў®¤пвбп:

- ᥫҐЄв®ал § ¤ з TASK1_SEL, TASK2_SEL, MAIN_TSK - ᬥ饭Ёп
ᮮ⢥вбвўгойЁе ¤ҐбЄаЁЇв®а®ў ў в Ў«ЁжҐ GDT;
- ўл¤Ґ«пҐвбп Ї ¬пвм Ї®¤ б⥪Ё, ­ ЇаЁ¬Ґа в Є,
tsk1_stack db 1024d (0);
- Ё­ЁжЁ «Ё§ЁагҐвбп в Ў«Ёж  ¤ҐбЄаЁЇв®а®ў GDT - в.Ґ. Є®а४⭮
§ Ї®«­повбп ўбҐ ҐҐ бва®ЄЁ;
- Ё­ЁжЁ «Ё§Ёаговбп ᥣ¬Ґ­вл б®бв®п­Ёп § ¤ з, ­ ЇаЁ¬Ґа,
ў Ї®«Ґ ip ЇЁиҐвбп OFFSET €¬п Їа®жҐ¤гал-§ ¤ зЁ;
ў Ї®«Ґ sp ЇЁиҐвбп OFFSET tsk1_stack + Size_Of_Stack;
- ў ॣЁбва GDTR Јаг§Ёвбп  ¤аҐб в Ў«Ёжл ¤ҐбЄаЁЇв®а®ў GDT;
- ў ॣЁбва § ¤ з TR Јаг§Ёвбп ᥫҐЄв®а § ¤ зЁ - MAIN_TSK.
’ ЄЁ¬ ®Ўа §®¬ Їа®Ёб室Ёв ўлЇ®«­Ґ­ЁҐ § ¤ зЁ Main.
ЏҐаҐЄ«о祭ЁҐ ­  ¤агЈго § ¤ зг Їа®Ё§ў®¤Ёвбп Ё­бвагЄжЁҐ© jmp,
­ ЇаЁ¬Ґа, jmp TASK1_SEL.
Џ® нв®© Ё­бвагЄжЁЁ ¬ иЁ­  ўЁ¤Ёв Ї® ЇаЁ§­ Єг ᥣ¬Ґ­в , зв®
ᥫҐЄв®а гЄ §лў Ґв ­  ¤ҐбЄаЁЇв®а § ¤ зЁ.
Џ® ᥫҐЄв®аг MAIN_TSK, ­ е®¤п饬гбп ў ॣЁбвॠ§ ¤ з TR, зҐ-
१ ¤ҐбЄаЁЇв®а § ¤ зЁ main, ­ е®¤Ёвбп ᥣ¬Ґ­в б®бв®п­Ёп § ¤ зЁ
main Ё ў ­ҐЈ® бЇЁблў Ґвбп б®бв®п­ЁҐ ¬ иЁ­л ў ᮮ⢥вбвўЁҐ б®
бвагЄвга®© ᥣ¬Ґ­в .
‘Ґ«ҐЄв®а ­®ў®© § ¤ зЁ TASK1_SEL Јаг§Ёвбп ў ॣЁбва § ¤ з TR,
Ї® ᥫҐЄв®аг в Є¦Ґ зҐаҐ§ ¤ҐбЄаЁЇв®а ­ е®¤Ёвбп ᥣ¬Ґ­в б®бв®п­Ёп
§ ¤ зЁ 1, Ё Ё§ нв®Ј® ᥣ¬Ґ­в  гбв ­ ў«Ёў Ґвбп ­®ў®Ґ б®бв®п­ЁҐ ¬ -
иЁ­л.
‚ § Є«о祭ЁЁ ЇаҐ¤бв ўЁ¬ б奬㠯ҐаҐЄ«о祭Ёп § ¤ з ў § йЁйҐ­-
­®¬ ०Ё¬Ґ, Ё§ беҐ¬л ўЁ¤­   ­ «®ЈЁп б а ­ҐҐ а бᬮв७­л¬Ё б®Ї-
а®Ја ¬¬ ¬Ё. …б«Ё ў ‘Ё ¤«п ЇҐаҐЄ«о祭Ёп § ¤ з Ї®вॡ®ў «®бм ­ ЇЁ-
б вм дг­ЄжЁо, в® ў § йЁйҐ­­®¬ ०Ё¬Ґ ЇҐаҐЄ«о祭ЁҐ § ¤ з ®бгйҐбв-
ў«пҐвбп ®¤­®© Ё­бвагЄжЁҐ©  бᥬЎ«Ґа .

ЪДДДДї ЪДДДДї Ъ>ВДДДДДДДї ЪДДД>ЪДДДДДДДї
іGDTRі і TR і і і TSS 1 і і і TSS 2 і
АДДВДЩ АДДВДЩ і і і і і і
ЪДЕДДДДДДДДДДДДДДДДДДДЩ і і і і і і
і АДДДДДДДДД>ВДДДДДДДДДДДДДДї і АДДДДДДДЩ і АДДДДДДДЩ
і ГДДДДДДДДДДДДДДґ і і
ГДTASK1_SELД>ґ „ҐбЄаЁЇв®а T1ГДЩ і Ъ>ВДДДДДДДї
і ГДДДДДДДДДДДДДДґ і і і TSS і
ГДTASK2_SELД>ґ „ҐбЄаЁЇв®а T2ГДДДДДДДДДДДДДДЩ і і main і
і ГДДДДДДДДДДДДДДґ і і і
АДMAIN_TSKДД>ґ „ҐбЄа. main ГДДДДДДДДДДДДДДДДДЩ АДДДДДДДЩ
ГДДДДДДДДДДДДДДґ
АДДДДДДДДДДДДДДЩ

ЪДДДДДДДДДДДДДї ЪД>ВДДДДДДДДДДДДДї ЪДДД>ВДДДДДДДДДДДДДї
і Task main і і і TASK 1 і і і TASK 2 і
і і і і ... і і і ... і
і ... і і іjmp TASK2_SELГДДДЩ ЪДДґjmp TASK1_SELі
іjmp TASK1_SELГДДДЩ і ... і<ДДДДЩЪ>ґ ... і
і ... Г<ДДї і і і і і
і exit і і іjmp TASK2_SELГДДДДДДЩ іjmp MAIN_TSK Гї
АДДДДДДДДДДДДДЩ і АДДДДДДДДДДДДДЩ АДДДДДДДДДДДДДЩі
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

ќв Їл ᮧ¤ ­Ёп § ¤ з-б®Їа®Ја ¬¬ ў® ўбҐе ваҐе ЇаЁ¬Ґа е ®¤­Ё Ё
⥠¦Ґ. ќв®:
- ўл¤Ґ«Ґ­ЁҐ Ї ¬пвЁ Ї®¤ б⥪Ё (б⥪ ¤«п main ўл¤Ґ«пвм ­Ґ ­ -
¤®);
- ўл¤Ґ«Ґ­ЁҐ Ї ¬пвЁ Ї®¤ ¤ҐбЄаЁЇв®ал (ў ⮬ зЁб«Ґ Ё ¤«п main);
- ­Ґ®Ўе®¤Ё¬л¬ ®Ўа §®¬ ўлЇ®«­Ґ­­ п Ё­ЁжЁ «Ё§ жЁп б⥪®ў;
- ­Ґ®Ўе®¤Ё¬л¬ ®Ўа §®¬ ўлЇ®«­Ґ­ЁҐ Ё­ЁжЁ «Ё§ жЁЁ ¤ҐбЄаЁЇв®а®ў;
- ЇҐаҐе®¤ Ё§ § ¤ зЁ main ў ®¤­г Ё§ б®Їа®Ја ¬¬;
- ЇҐаҐЄ«о祭ЁҐ б®Їа®Ја ¬¬ Ї® вॡ㥬®¬г  «Ј®аЁв¬г;
- ў®§ўа йҐ­ЁҐ ў § ¤ зг main.
Соседние файлы в папке Операционные среды АСОИУ