Server for Information Technologies óÅÒ×ÅÒ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ
ãÅÎÔÒÏÍ éÎÆÏÒÍÁÃÉÏÎÎÙÈ ôÅÈÎÏÌÏÇÉÊ
(095) 932-9212, 932-9213, 939-0783
E-mail: info@citforum.ru
óÅÒ×ÅÒ ÓÏÄÅÒÖÉÔ ÍÏÒÅ(!) ÁÎÁÌÉÔÉÞÅÓËÏÊ ÉÎÆÏÒÍÁÃÉÉ CIT Forum CD-ROM

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ÔØ.
Comments: info@citmgu.ru
Designed by Andrey Novikov
Copyright © CIT