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