|
éíñ
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ÔØ.
|