|
���
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��.
|