execseg - äeëaeò y÷acòoê äaííûx âûïoëíÿeìoé ïpoãpaììoé
#include
excode_t execseg (oldaddr, size) exdata_t oldaddr; unsigned size;
int unexecseg (addr) excode_t addr;
execseg ïoëy÷aeò òeêyùèe aäpec è paçìep y÷acòêa ïaìÿòè, êoòopûé äoëæeí áûòü âûïoëíeí, è âoçâpaùaeò còapòoâûé aäpec y÷acòêa, â êoòopoì, ïo êpaéíeé ìepe, size áaéòoâ è êoòopoìy ìoæío ïepeäaòü yïpaâëeíèe. B cëy÷ae ïpoöeccopoâ Intel 8086 è 80286 ceãìeíòíûé peãècòp CS accoöèèpyeòcÿ c ceãìeíòoì äaííûx, â êoòopoì pacïoëoæeí y÷acòoê oldaddr. Ýòo oçía÷aeò, ÷òo cìeùeíèÿ äo òpeáyeìûx áaéòoâ â âûïoëíÿeìoì ceãìeíòe è ceãìeíòe äaííûx coâïaäaþò, ío ceëeêòopû y íèx paçíûe.
B cëy÷ae 8086 è 80286 òèïû "excode_t" è "exdata_t" ÿâëÿþòcÿ äëèííûìè (far) yêaçaòeëÿìè. B cëy÷ae apxèòeêòyp, ãäe còpaíèöû paçíûx ceãìeíòoâ çaùèùaþòcÿ ïo ÷òeíèþ/çaïècè/âûïoëíeíèþ, âoçâpaùaeìûé aäpec èäeíòè÷eí apãyìeíòy, ïepeäaâaeìoìy execseg.
Peêoìeíäyeòcÿ, ÷òoáû ïpè ècïoëüçoâaíèè ýòoé ôyíêöèè ïpoãpaììû äëÿ 8086 èëè 80286 èìeëè áoëüøyþ ìoäeëü ïaìÿòè; èía÷e ïpoãpaììècò äoëæeí xopoøo opèeíòèpoâaòücÿ â cìeøaííûx ìoäeëÿx è äëèííûx yêaçaòeëÿx.
Ïpè oáíapyæeíèè oøèáêè execseg âoçâpaùaeò ((excode_t)-1) è çaíocèò â errno êoä oøèáêè ENONEM. Oøèáêoé c÷èòaeòcÿ íeêoppeêòíûé aäpec äaííûx èëè size, a òaêæe íeâoçìoæíocòü paçìecòèòü íoâûé ceëeêòop äaííûx.
unexecseg çaïpeùaeò ècïoëüçoâaòü addr, âoçâpaùeííûé â câoe âpeìÿ execseg, êaê aäpec âûïoëíÿeìoé ïpoãpaììû. B cëy÷ae 8086 è 80286 ýòoò âûçoâ ïpèâoäèò ê ocâoáoæäeíèþ ceëeêòopa, ècïoëüçoâaííoão äëÿ âûïoëíÿeìoão y÷acòêa. Ôyíêöèÿ âoçâpaùaeò 0 â cëy÷ae ycïeøíoão çaâepøeíèÿ è -1 ïpè oøèáêe. Haïpèìep, ecëè addr íe ÿâëÿeòcÿ aäpecoì, âoçâpaùeííûì paíee ôyíêöèeé execseg, âoçpaùaeòcÿ -1 è ýòoò aäpec íe ìoæeò âïpeäü cëyæèòü aäpecoì âûïoëíÿeìoé ïpoãpaììû.
excode_t funcp; char far *datap; ... datap=brkctl(BR_NEWSEG,1000L,0L); load_with_code(datap,1000); /* çaãpyæaeò ïpoãpaììy â y÷acòoê datap */ funcp=execseg(datap,1000); (*funcp)(); /* âûçoâ ïpoãpaììû */ if(unexecseg(funcp)==-1) { printf("unexecseg failed0); exit(1); }