ÈÌß
execseg - äeëaeò y÷acòoê äaííûx âûïoëíÿeìoé ïpoãpaììoé
ÑÈÍÒÀÊÑÈÑ
#includeexcode_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); }
ÇÀÌÅ×ÀÍÈß
B cëy÷ae Intel 8086 è 80286 execseg äoëæía ïoëy÷aòü äëèííûé
aäpec y÷acòêa. Ýòo cpeäcòâo peêoìeíäyeòcÿ òoëüêo o÷eíü
oïûòíûì ïpoãpaììècòaì.
Ïocêoëüêy âoçâpaùaeìoe çía÷eíèe execseg è ïepeäaâaeìûé eé aäpec äoëæíû áûòü äëèííûìè yêaçaòeëÿìè, ëþáaÿ ïpopaììa, âêëþ÷aþùaÿ â ceáÿ ôaéë xdata.h, äoëæía êoìïoíoâaòücÿ c ôëaãoì -Me.
Cëeäyþùèe oãpaíè÷eíèÿ oòíocÿòcÿ òoëüêo ê cècòeìíoìy âûçoây, ïoçâoëÿþùeìy âûïoëíÿòü y÷acòêè äaííûx. Xoòÿ execseg ïoëy÷aeò aäpec è paçìep y÷acòêa, âecü ceãìeíò, coäepæaùèé y÷acòoê, äyáëèpyeòcÿ. Ïepeä äyáëèpoâaíèeì ïpoâepÿeòcÿ êoppeêòíocòü aäpeca è paçìepa y÷acòêa. Ïoêa ceãìeíò äyáëèpoâaí, ê íeìy íeëüçÿ ïpèìeíÿòü ôyíêöèè ocâoáoæäeíèÿ ïaìÿòè (ècïoëüçyþùèe sbrk(3) è brkctl(3)). Ýòè oãpaíè÷eíèÿ pacïpocòpaíÿþòcÿ ía âecü ceãìeíò. Ïocëe ïpèìeíeíèÿ ê ceãìeíòy ôyíêöèè unexecseg ïaìÿòü â íeì ìoæeò áûòü ocâoáoæäeía. Äaæe ecëè ceãìeíò yæe äyáëèpoâaí, êaæäûé íoâûé âûçoâ execseg, ïpèìeíeííûé ê ýòoìy ceãìeíòy, coçäaeò íoâûé äyáëü.
Bcòpeòèâ execseg, êoìïèëÿòop ïo oøèáêe ìoæeò âûäaòü cooáùeíèe "at least one void operand", êoòopoe íyæío ïpoèãíopèpoâaòü.