86REL(5)
XENIX System V (1 ÿíâapÿ 1989)

ÍÀÇÂÀÍÈÅ
86rel - Ôopìaò oáúeêòíoão ìoäyëÿ, ïpèíÿòûé äëÿ ïpoöeccopa Intel 8086.

ÑÈÍÒÀÊÑÈÑ


#include <sys/relsym86.h>

ÎÏÈÑÀÍÈÅ
Ôopìaò, ïpèíÿòûé äëÿ ïpoöeccopa Intell 8086, èëè 86rel, ïpeäcòaâëÿeò coáoé oáúeêòíûé ìoäyëü , coçäaâaeìûé acceìáëepoì masm(1) è ÿâëÿeòcÿ âxoäíûì ôaéëoì äëÿ peäaêòopa câÿçeé ld(1). Maêpoôaéë relsym86.h coäepæèò oïècaíèÿ, ïpè ïoëy÷eíèè â peçyëüòaòe òpaícëÿöèè c ÿçûêa Cè ôaéëa â ôopìaòe 86rel. Oïècaíèe òexíè÷ecêèx ïoäpoáíocòeé ôopìaòa 86rel cìoòpè â Intel 8086 ObjectModuleFormatExternal Product Specification.

Ôopìaò 86rel cocòoèò èç çaïèceé ïepeìeííoé äëèíû. Kaæäaÿ çaïècü èìeeò ïo êpaéíeé ìepe òpè ïoëÿ: òèï çaïècè, äëèía è êoíòpoëüíaÿ cyììa. Ïepâûé áaéò âceãäa coäepæèò òèï çaïècè. Cyùecòâyeò òpèäöaòü oäèí paçëè÷íûé òèï çaïèceé. Toëüêo oäèííaäöaòü èç íèx ècïoëüçyeòcÿ peäaêòopoì câÿçeé ld(1) è masm(1). Cëoâo, pacïoëoæeííoe ïocëe ïepâoão áaéòa ïpeäcòaâëÿeò coáoé äëèíy çaïècè â áaéòax;ïpè âû÷ècëeíèè äëèíû ïepâûe òpè áaéòa íe y÷èòûâaþòcÿ .Äaëee cëeäyþò oäío èëè íecêoëüêo ïoëeé. Kaæäûé òèï çaïècè coäepæèò cïeöèôè÷ecêyþ ïocëeäoâaòeëüíocòü ïoëeé paçëè÷íoé äëèíû, íeêoòopûe èç êoòopûx ìoãyò áûòü íeoáÿçaòeëüíûìè èëè . Caìûé ïocëeäíèé áaéò êaæäoé çaïècè coäepæèò êoíòpoëüíyþ cyììy. Áaéò êoíòpoëüíoé cyììû ôopìèpyeòcÿ êaê cyììa ïo ìoäyëþ 256 âcex äpyãèx áaéò çaïècè. Cyììa ïo ìoäyëþ 256 âcex áaéò çaïècè, âêëþ÷aÿ è áaéò êoíòpoëüíoé cyììû, äoëæía áûòü paâía íyëþ.

Ça íeêoòopûì ècêëþ÷eíèeì, ïepâûé áaéò còpoêè 86rel coäepæèò ÷ècëo oò 0 äo 40, êoòopoe oïpeäeëÿeò ocòaâøyþcÿ äëèíy còpoêè â áaéòax è còpoêa íe coäepæèò çaâepøaþùèx íyëeé (BHÈMAHÈE! B äaëüíeéøeì âce còpoêè, oïècûâaeìûe â äoêyìeíòe èìeþò òaêoé ôopìaò!). Xoòÿ â oïècaíèè Intel ïpeäycìoòpeío ècïoëüçoâaíèe òoëüêo cèìâoëoâ âepxíeão peãècòpa êëaâèaòypâû è cèìâoëoâ `?', `@', `:' è `_' acceìáëep masm(1) ècïoüçyeò ïoëíûé íaáop ASCII cèìâoëoâ.

Oïpeäeëeíèe Intel Object Module Format (OMF) ècïoëüçyeò òepìèí "èíäeêc" èëè äëÿ oáoçía÷eíèÿ ïoëoæèòeëüíûx äecÿòè÷íûx ÷èceë oò 0 äo 127 èëè oò 128 äo 32,768. Ýòa æe òepìèíoëoãèÿ coxpaíeía â äaííoì äoêyìeíòe è âo âceé ëèòepaòype ïo 86rel. Èíäeêc ïpeäcòaâëÿeòcÿ oäíèì èëè äâyìÿ áaéòaìè. Ecëè ïepâûé áaéò èìeeò íyëeâoé ïepâûé áèò, èíäeêc ïpeäcòaâëeí òoëüêo oäíèì áaéòoì, è ocòaòoê áaéòa ïpeäcòaâëÿeò ïoëoæèòeëüíoe äecÿòè÷íoe ÷ècëo, pacïoëoæeííoe ìeæäy 0 è 127. Ecëè âòopoé áaéò èìeeò eäèíè÷íûé ïepâûé áèò, èíäeêc ïpeäcòaâëeí äâyìÿ áaéòaìè è ocòaòoê cëoâa coäepæèò ïoëoæèòeëüíoe äecÿòè÷íoe ÷ècëo, pacïoëoæeííoe ìeæäy 128 è 32.768.

Hèæe ïpèâeäeí cïècoê òèïoâ çaïèceé è øecòíaäöaòèpè÷íûe âeëè÷èíû èx ïepâoão áaéòa, oïpeäeëeííûx â ôaéëe relsym86.h


#define MRHEADR  0x6e    /*çaãoëoâoê oáúeêòíoão ìoäyëÿ */

#define MRDGINT  0x70    /*èíèöèaëèçaöèÿ peãècòpoâ*/

#define MREDATA  0x72    /*ÿâío oïpeäeëeííûe äaííûe*/

#define MRIDATA  0x74    /*ïoâòopÿeìûe äaííûe*/

#define MOVLDEF  0x76    /*oïècaíèe ïepeêpûòèÿ*/

#define MENDREC  0x78    /*çaïècü êoíöa áëoêa èëè ïepeêpûòèÿ*/

#define MBLKDEF  0x7a    /*oïècaíèe áëoêa*/

#define MBLKEND  0x7c    /*êoíeö áëoêa*/

#define MDEBSYM  0x7e    /*cèìâoëû oòëaäêè*/

#define MTHEADR  0x80    /*çaãoëoâoê ìoäyëÿ, oáû÷ío

                          ïepâûé â oáúeêòíoì ôaéëe*/

#define MLHEADR  0x82    /*çaãoëoâoê ìoäyëÿ câÿçè*/

#define MPEDATA  0x84    /*aácoëþòíûe äaííûe*/

#define MPIDATA  0x86    /*aácoëþòíûe ïoâòopÿeìûe äaííûx*/

#define MCOMENT  0x88    /*çaïècü êoììeòapèÿ*/

#define MMODEND  0x8a    /*çaïècü êoíöa ìoäyëÿ*/

#define MEXTDEF  0x8c    /*âíeøíèe oïècaíèÿ*/

#define MTYPDEF  0x8e    /*oïècaíèÿ òèïa*/

#define MPUBDEF  0x90    /*ãëoáaëüíûe oïècaíèÿ*/

#define MLOCSYM  0x92    /*ëoêaëüíûe cèìâoëû*/

#define MLINNUM  0x94    /*íoìep còpoêè ècxoäíoão òeêcòa*/

#define MLNAMES  0x96    /*çaïècü cïècêa èìeí*/

#define MSEGDEF  0x98    /*oïècaíèe ceãìeíòa*/

#define MGRPDEF  0x9a    /*oïècaíèe ãpyïïû*/

#define MFIXUPP  0x9c    /*èíôopìaöèÿ o íacòpoéêe

                          ïepeìecòèìûx äaííûx*/

#define MNONE1   0x9e    /*íeò*/

#define MLEDATA  0xa0    /*ëoãè÷ecêèe äaííûe*/

#define MLIDATA  0xa2    /*ëoãè÷ecêèe ïoâòopÿeìûe äaííûe */

#define MLIBHED  0xa4    /*çaãoëoâoê áèáëèoòeêè*/

#define MLIBNAM  0xa6    /*çaïècü èìeí áèáëèoòeêè*/

#define MLIBLOC  0xa8    /*paçìeùeíèÿ ìoäyëeé áèáëèoòeêè*/

#define MLIBDIC  0xaa    /*cëoâapü áèáëèoòeêè*/

#define M386END  0x86    /*çaïècü êoíöa 32 áèòíoão ìoäyëÿ*/

#define MPUB386  0x91    /*32 áèòíoe ãëoáaëüíoe oïpeäeëeíèe*/

#define MLOC386  0x93    /*32 áèòíûe ëoãè÷ecêèe cèìâoëû*/

#define MLIN386  0x95    /*32 áèòíûé íoìep ècxoäíoé còpoêè*/

#define MSEG386  0x99    /*32 áèòíoe oïècaíèe ceãìeíòa*/

#define MFIX386  0x9d    /*èíôopìaöèÿ o íacòpoéêe

                          ïepeìecòèìûx äaííûx*/

#define MLED386  0xa1    /*32 áèòíûé ëoãè÷ecêèe äaííûe*/

#define MLID386  0xa3    /*32 áèòíûe ëoãè÷ecêèe ïoâòopÿeìûe äaííûe*/

B äaëüíeéøeì áyäyò oïècaíû ocoáeííocòè êaæäoão òèïa çaïècè. Ecëè çaïècü íe ècïoëüçyeòcÿ íè masm(1), íè ld(1), oía íe oïècaía.

THEADR
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0x80. Çaïècü THEADR oïpeäeëÿeò èìÿ ôaéëa ècxoäíoão ìoäyëÿ c òeêcòoì ía acceìáëepe (cì. Çaìe÷aíèÿ). Eäèícòâeííoe ïoëe coäepæèò ïoëe TMODULE NAME, ïoëy÷eííoe êaê base name oò ïoëíoão èìeíè ôaéëa.
COMENT
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0x88. Çaïècü COMENT ìoæeò coäepæaòü êoìeíòapèé, coçäaâaeìûé êoìïèëÿòopoì. Mams(1) ïoìeùaeò â ïoëe ýòoão êoìeíòapèÿ còpoêy "XENIX 8086 ASSEMBLER."
MODEND
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0x8a. Çaïècü MODEND çaâepøaeò ìoäyëü. Oía oïpeäeëÿeò, coäepæèò ëè òeêyùèé ìoäyëü òo÷êy âxoäa äëÿ âûïoëíeíèÿ. Ecëè ìoäyëü ÿâëÿeòcÿ òo÷êoé âxoäa, çaïècü MODEND oïpeäeëÿeò aäpec òo÷êè âxoäa.
EXTDEF
Tèï çaïècè oïpeäeëÿeòcÿ çí÷eíèeì 0x8c. Çaïècü EXTDEF coäepæèò èìeía è òèïû cèìâoëoâ, oïpeäeëeííûx â äpyãèx ìoäyëÿx çaïècüþ òèïa PUBDEF (cì. íèæe). Ýòo cooòâeòcòâyeò êëaccy ïaìÿòè "extern" â ÿçûêe Cè. Ïoëÿ coäepæaò oäíy èëè áoëee còpoê, ça êaæäoé còpoêoé cëeäyeò èíäeêc. Èíäeêcû yêaçûâaþò ía çaïècè TYPDEF, pacïoëoæeííûe paíee â ìoäyëe. Masm(1) ãeíepèpyeò òoëüêo oäèí EXTDEF ía êaæäûé âíeøíèé cèìâoë.
TYPDEF
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0x8e. Çaïècü TYPDEF coäepæèò oïècaíèe òèïoâ (paçìep è aòpèáyòû xpaíeíèÿ) . Ha ýòo oïècaíèe ìoãyò ccûëaòücÿ çaïècè EXTDEF, PUBDEF è äpyãèe çaïècè.
PUBDEF
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0x90. B çaïècè PUBDEF coäepæèòcÿ cïècoê, cocòoÿùèé èç oäíoão èëè áoëee èìeí, ía êoòopûe ìoãyò ccûëaòücÿ äpyãèe ìoäyëè. Cïècêy èìeí ïpeäøecòâyþò èíäeêc ãpyïïû è ceãìeíòa, êoòopûe yêaçûâaþò ía ía÷aëo cïècêa ãëoáaëüíûx ïepeìeííûx â òeêyùeì ceãìeíòe è ãpyïïe. Ecëè èíäeêc ceãìeíòa è ãpyïïû paâíû 0, çaäaeòcÿ íoìep frame, oïpeäeëÿþùèé aácoëþòíûé aäpec â ìoäyëe. Cïècoê cocòoèò èç oäíoé èëè áoëee còpoê, êaæäaÿ èç êoòopûx coäepæèò 16-áèòíoe cìeùeíèe â òeêyùeì ceãìeíòe è èíäeêc, yêaçûâaþùèé ía TYPDEF.
LNAMES
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0x96. Çaïècü LNAMES çaäaeò ïocëeäoâaòeëüíocòü còpoê, êoòopûe cooòâeòcòâyþò èìeíaì, yêaçaííûì â òeêyùeì ìoäyëe. Kaæäoe èìÿ èíäeêcèpoâaío ïocëeäoâaòeëüío, ía÷èíaÿ c 1. Çaïècè SEGDEF è GRDEF, pacïoëoæeííûe ça äaííoé çaïècüþ è íaxoäÿùèecÿ â äaííoì ìoäyëe, ïoëy÷aþò èç ýòoé çaïècè èìeía ceãìeíòoâ, êëaccoâ, ïepeêpûòèé è ãpyïï.
SEGDEF
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0x98. Çaïècü SEGDEF coäepæèò èíäeêc, yêaçûâaþùèé ía ceãìeíò è èíôopìaöèþ oá aäpecaöèè è aòpèáyòax ceãìeíòa. Ýòoò èíäeêc ìoæeò áûòü ècïoëüçoâaí äpyãèìè çaïècÿìè äëÿ ccûëoê ía ceãìeíò. Ïepâoe cëoâo çaïècè, pacïoëoæeííoe ïocëe ïoëÿ äëèíû, coäepæèò èíôopìaöèþ o âûpaâíèâaíèè è êoìáèíaöèè aòpèáyòoâ ceãìeíòa. Cëeäyþùee cëoâo oïpeäeëÿeò äëèíy ceãìeíòa â áaéòax. Çaìeòèì, ÷òo oío çaäaeò ìaêcèìaëüíyþ äëèíy ceãìeíòa, paâíyþ 65,536 áaéò. Äaëee cëeäyeò èíäeêc ceãìeíò (cì. âûøe). Haêoíeö, SEGDEF ìoæeò, ío íe oáÿçaòeëüío, coäepæaòü ïoëÿ èíäeêcoâ êëacca è/èëè ïepeêpûòèÿ.
FIXUPP
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0x9c. Çaïècü FIXUPP oïpeäeëÿeò oäíy èëè áoëee ìoäèôèêaöèé aäpecoâ âo âpeìÿ peäaêòèpoâaíèÿ câÿçeé ("fixups"). Kaæäaÿ çaïècü yêaçûâaeò ía aäpec â ïpeäûäyùeé çaïècè LEDATA (cì. íèæe). Äëÿ òoão, ÷òoáû íacòpoèòü aäpec íeoáxoäèìo çíaòü: paçìeùeíèe, peæèì, target è frame. Frame è target ìoãyò áûòü çaäaíû ÿâío èëè ÷epeç ccûëêy ía yæe oïpeäeëeííyþ còpyêòypy íacòpoéêè aäpecoâ.
LEDATA
Tèï çaïècè oïpeäeëÿeòcÿ çía÷eíèeì 0xa0. Ýòa çaïècü coäepæèò íeïpepûâíûe òeêcòû èëè äaííûe, ècïoëüçyeìûe peäaêòopoì câÿçeé äëÿ coçäaíèÿ ïopöèè âûïoëíÿeìoão ìoäyëÿ . Ýòo ïopöèÿ ìoæeò òpeáoâaòü äoïoëíèòeëüíûx äeécòâèé (cì. FIXUPP) ïepeä çaãpyçêoé â ècïoëíÿeìûé ôaéë. Ïepeä òeêcòoì èëè äaííûìè ìoãyò pcïoëaãaòücÿ 2 ïoëÿ: èíäeêc ceãìeíòa è cìeùeíèe. Èíäeêc ceãìeíòa (cì. INDEX) oïpeäeëÿeò ceãìeíò, êoòopûé oïècaí â çaïècè SEGDEF. Cìeùeíèe, ïoä xpaíeíèe êoòopoão oòâeäeío oäío cëoâo, oïpeäeëÿeò âeëè÷èíy cìeùeíèÿ oò ía÷aëa ýòoão ceãìeíòa.

ÑÌ. ÒÀÊÆÅ
as(1), ld(1)

ÇÀÌÅ×ÀÍÈß
Ecëè âû ïoïûòaeòecü câÿçaòü ìoäyëè, acceìáëèpoâaííûe oäèíaêoâûìè èìeíaìè, çaãpyç÷èê áyäeò ïûòaòücÿ paçìecòèòü eão âecü â oäèí áoëüøoé ceãìeíò. B ïpoãpaììax äëÿ ïpoöeccopa I802286 paçìep ceãìeíòa oãpaíè÷eí âeëè÷èíoé 64K. B áoëüøèx ïpoãpaììax paçìep peçyëüòèpyþùeão ceãìeíòa ìoæeò ïpeâûøaòü 64K. Ecëè ècïoëüçyeòcÿ ìoäeëü ïaìÿòè òèïa large, òo, ïocëe çaâepøeíèÿ paáoòû peäaêòopa câÿçeé, ïoëy÷aeòcÿ oäèí èëè áoëee ìoäyëeé, cocòoÿùèx èç ceãìeíòoâ, oáùèé paçìep òeêcòa êoòopoão cyùecòâeíío ïpeâûøaeò 64K.

Cëeäoâaòeëüío, íyæío áûòü yâepeííûì, ÷òo èìÿ ìoäyëÿ, â ïpoöecce acceìáëèpoâaíèÿ, coâïaäaeò c èìeíeì ècxoäíoão. Èìeía ìoãyò íe coâïaäaòü, ecëè ècxoäíûé ìoäyëü áyäeò ïpeäâapèòeëüío oápaáoòaí íe c ïoìoùüþ êoìaíäû cc(1), a, íaïpèìep, âpy÷íyþ èëè shell-ïpoãpaììoé. Äaëee cëeäyeò ïpèìep, íaìepeíío coäepæaùèé oøèáêy:


     #incorrect

     cc -E module12.c |filter >x.c

     cc x.c

     mv x.o module1.o

     cc -E module2.c |filter >x.c

     cc x.c

     mv x.o module2.o

     cc -E module3.c |filter >x.c

     cc x.c

     mv x.o module3.o

     ld module1.o module2.o module3.o

×òoáû èçáeæaòü ýòoão, êaæäûé èç ìoäyëeé äoëæeí èìeòü yíèêaëüíoe èìÿ â ìoìeíò acceìáëèpoâaíèÿ, êaê ïoêaçaío íèæe:


     #correct

     cc -E module1.c |filter >x.c

     cc -S x.c

     mv x.s module1.s

     as module1.s

     .

     .

     .

     ld module1.o module2.o module3.o