EXECSEG(3)
XENIX System V (21 èþíÿ 1987)

ÈÌß
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);

	}

ÇÀÌÅ×ÀÍÈß
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òü.