coeur-tp-05-d.txt 112 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874
  1. ==================== PAGE 1 ====================
  2. § LE CODE COMPILE 5 ; LE CODE COMPILE 5
  3. 5.5 read et write 5 4 { 5 read et write on
  4. + =
  5. 4 2D8C BF6202 mov di, $0262
  6. 0 (* 001 fileof *) 4 2D8F 1E push ds
  7. 1 (*11avr87*) i 2D90 E857FC call TU_DEB_RW_FICH
  8. ? t a 2D93 BFAE02 mov di, $02AE
  9. 3 (*$r+*) ; 1 2D96 1E push ds
  10. 4 PROGRAM desassemble_file_of; ‘4 2D97 E86DFC call TU_READ_FICHIE
  11. ' 5 VAR fichier: FILE OF INTEGER; i 2D9A E836E2 call TU_IO_CHECK
  12. 6 fiche: INTEGER; 1 | }
  13. i nom_fichier: STRING/$20]; a) 2D9D BF6202 mov di, $0262
  14. 8 BEGIN i” 2DA0 IE push ds
  15. 9 ASSIGN(fichier, nom_fichier); % 2DA1 E846FC call TU_DEB_RW_FICH
  16. 10 REWRITE(fichier); À — )DA4 BFAEO2 mov di, $02AE
  17. 11 READ(fichier, fiche); 4 2DA7 1E push ds
  18. 12 WRITE(fichier, fiche); (1 2DA8 E864FC call TU_WRITE_FICHI
  19. 13 CLOSE(fichier); 19 2DAB E825E2 call TU_1O_CHECK
  20. 14 END. Mg
  21. (4 —_ 2DAE is sit di, $0262
  22. | Fig. 5.107 Le programme desassemble_file_of. \ 2DB1 1 pus ds
  23. 8 progr: _file_of. À —…. 2pB2 E823FC call TU_CLOSE
  24. if 2DB5 E81BE2 call TU_IO_CHECK
  25. fl
  26. Voici le code généré: ‘M 2DB8 E90000 jmp FIN
  27. | \ de 2DBB 33C0 FIN xor ax, ax
  28. | 2D4D E849DD call TU_PARAGRAPHS À 2DBD E880DE call TU_HALT
  29. | 2D50 0600 hex 0600 ; options ‘4 2DC0 0000 hex 0000
  30. | k 2D52 780B hex 780B ; cs 1 |
  31. 4 2D54 3C15 hex SOUS iis as ‘ 7 Fig. 5.108 fichier de fiches
  32. | 2D56 DDO2 hex DD02 ; code
  33. 2D58 2E00 hex 2E00 ; globales 4
  34. | 2D5A 0004 hex 0004 ; min piles |
  35. 2D5C 00A0 hex OOAO ; max piles © Notez que:
  36. 2DS5E 1000 hex 1000 ; fichiers | k FMI }
  37. 2D60 0000 hex 0000 ; input + — toutes les primitives de traitement de fichier invoquent des routines de la librairie, en ayant
  38. 2D62 0000 hex 0000 ; output ; auparavant poussé sur la pile le segment correspondant au fichier et placé dans DI son décalage
  39. — Si la procédure utilise d’autres paramètres (nom du fichier pour ASSIGN, taille de la fiche pour
  40. 2D64 8BEC mov bp, sp À REWRITE, adresse de la fiche courante utilisée pour READ et WRITE...), ceux-ci sont soit
  41. 2D66 E814DF call TU_TAILLE_CODE | placés dans des registres soit poussés sur la pile.
  42. 2D69 5700 hex 570015 tarlle i
  43. | 2D6B 6D2D adr SAUT_PRINCI PAL 1
  44. 2D6D E90000 SAUT_PRINCIPAL jmp PRINCIPAL h La gestion du fichier est en fait effectuée en utilisant en mémoire un bloc de contrôle (FCB ou FIB)
  45. À qui contient, entre autres:
  46. 2D70 BF6202 PRINCIPAL mov di, $0262 i : \ l
  47. 2D74 LE push ds . - le nom du fichier (avec le lecteur et la table des matières utilisée)
  48. 2D74 57 push di } ~ la position de la prochaine lecture ou écriture
  49. 2D75 BFB002 mov di, $02B0 ‘M — la taille totale du fichier...
  50. 2D78 1E push ds il : HN
  51. 2D79 E806E4 call TU_POUSSE_STRING "M Le Compilateur se contente donc d’indiquer aux routines de la librairie l’adresse en mémoire de ce
  52. 2D7C E80FFC call TU_ASSIGN_FILE Dy B. Ces routines utiliseront les paramétres contenus dans ce bloc de contréle pour invoquer les
  53. q ? ons «dl fonctions DOS adéquates.
  54. D 2D7F BF6202 mov di, $0262 \
  55. | 2D82 IE push ds L
  56. 2D83 B90200 mov cx, $0002 {|
  57. | 2D86 E80EFC call TU_REWRITE !
  58. i} | 2D89 E847E2 call TU_10_CHECK 4
  59. } k
  60. 14 | 4
  61. AU COEUR DE TURBO PASCAL 304 AU COEUR DE TURBO PASCA 4 AU COEUR DE TURBO PASCAL 305 AU COEUR DE TURBO PASCAL
  62. ==================== PAGE 2 ====================
  63. 5 LE CODE COMPILE Ss LE CODE COMPILE 5 |
  64. 5.5 read et write 53 read et write 5.5 |
  65. |
  66. affiche_memoire(SEG (fichier), OFS(fichier)- 16,
  67. §.5.3.2 LE BLOC DE CONTROLE D’UN FICHIER OFS(fichier)+ SIZEOF(fichier)+ 16- 1); |
  68. ‘ ‘ \ ry WITH fiche_courante DO
  69. Alors que la version 2'de TURBO gérait directement les fichiers (nombre d’octets, position du BEGIN
  70. pointeur de la fiche courante etc.), la version 3 se fie entièrement à MS-DOS. WRITE(’nom <JOE> ?’); READLN(nom); |
  71. 1 SANS a 95 WRITE(‘age <41> ?’); READLN(age);
  72. M La zone réservée à la variable fichier contient donc un bloc de contrôle réduit de 76 octets qui 96 END;
  73. contiennent: | a WRITE (fichier, fiche_courante); |
  74. "il — dans les deux premiers octets $FFFF si le fichier est fermé ou le numéro de fichier s’il est q 99 affiche_memoire(SEG (fichier), OFS(fichier)- 16, |
  75. | | ouvert : i J 100 OFS(fichier)+ SIZEOF(fichier)+ 16- 1); |
  76. à | — dans les 2 octets suivants, la taille de la fiche q 101
  77. a RNAI { 102 CLOSE(fichier);
  78. a Le code généré fournit aux routines de la librairie: q 103 i
  79. i , ; f 104 affiche_memoire(SEG (fichier), OF S(fichier)- 16,
  80. ! — l’adresse du feb TURBO (qui contient le numéro du fichier et la taille de la fiche) y 105 OFS(fichier)+ SIZEOF(fichier)+ 16- 1); |
  81. \ | — l'adresse de la fiche courante } 106 |
  82. / | 107 END; (* affiche_entier *) |
  83. Les routines de la librairie utilisent ces informations pour effectuer les appels à MS-DOS. 108 x
  84. 1 109 PROCEDURE initialise;
  85. ti q 110 BEGIN |
  86. | 111 avant:= ’AAAAAAAAAAAAAAAA'’ ; |
  87. a | Voici un programme qui affiche le contenu du fcb actuel de TURBO: j 112 apres:= 'BBBBBBBBBBBBBBBB’ ; |
  88. ‘(fl | 113 END; (* initialise *) |
  89. i 4 114 I
  90. ij 0 (* 001 febtfo *) À 115 BEGIN (* principal *)
  91. ‘a 1 (* 28 avr 87 *) 4 116 - initialise;
  92. Di 2 | 117 REPEAT
  93. | ; PROGRAM _fcb_turbo_file_of, He Waren:
  94. 1 teste_fcb_turbo_file_of; È 119 WRITE('{cb, q(uitte ?');
  95. | | | 5 TYPE tr _array_16 caracteres= ARRAY/0..15] OF CHAR; i 120 READIKED henge WRITELN(choix);
  96. | 6 t fiche= RECORD \ 121 CASE choix OF
  97. À 7 nom: STRING[3]; 122 f : affiche fcb_turbo_file_of:
  98. | 8 age: INTEGER; } 123 END; Ti
  99. | 9 END; | 124 UNTIL choix= 'q';
  100. 10 VAR choix: CHAR; | 125 END. (* principal *)
  101. J 11 avant: t_array_16_caracteres; | |
  102. it 12 fichier: FILE OF r fiche; | Fig. 5.109 Le programme teste_fcb_turbo_file_of. |
  103. i i | 13 fiche_courante: t fiche; a - al, |
  104. 14 apres: t_array_16_caracteres; À | |
  105. | 15 |
  106. ij | 16 PROCEDURE affiche_memoire(p_segment, p_decalage_debut, q et voici un exemple d’exécution: |
  107. | | 76 END; (* affiche_memoire *) |
  108. i 77 |
  109. i 78 PROCEDURE affiche feb turbo file_of; f(cb, q(uitte ? f
  110. | 79 VAR ! ligne: STRING/255]; } taille fcb: 76
  111. | 80 BEGIN À
  112. | 81 WRITELN(‘raille fcb: ’, SIZEOF(fichier)); WRITELN; i $09B6: $0260 $41 $41 $41 $41 $41 : AAAAA
  113. || 82 À \ À $09B6:$0268 $41 $41 $41 $41 $41 $41 $41 $41 :AAAAAAAA
  114. | 83 affiche_memoire(SEG(fichier), OFS(fichier)- 16, | $09B6:$0270 $41 $41 $41 : AAA
  115. 84 OFS(fichier)+ SIZEOF(fichier)+ 16- 1);
  116. | 85 à
  117. i 86 ASSIGN(fichier, 'FILEOF DTA’ ); À
  118. | 87 REWRITE(fichier); |
  119. D. + 88 |
  120. il i, | ‘à |
  121. | | |
  122. i AU COEUR DE TURBO PASCAL 306 AU COEUR DE TURBO PASCAL ~ AU |
  123. COEUR DE TURBO PASCAL 307 AU COEUR DE TURBO PASCAL
  124. 1 ih
  125. ==================== PAGE 3 ====================
  126. LE CODE COMPILE
  127. read et write
  128. $09B6:
  129. $09B6:
  130. $09B6:
  131. $09B6:
  132. $09B6:
  133. $O9B6:
  134. $O9B6:
  135. $09B6:
  136. $09B6:
  137. $09B6:
  138. $09B6:
  139. $09B6:
  140. $09B6:
  141. $09B6:
  142. $0270
  143. $0278
  144. $0280
  145. $0288
  146. $0290
  147. $0298
  148. $02A0
  149. $02A8
  150. $02B0
  151. $02B8
  152. $02B8
  153. $02C0
  154. $02C0
  155. $02C8
  156. $00
  157. $00
  158. $00
  159. $00
  160. $00
  161. $00
  162. $00
  163. $00
  164. $00
  165. $00
  166. $42
  167. nom <JOE> ? JOE
  168. age <41> ?$77
  169. $09B6:
  170. $09B6:
  171. $09B6:
  172. $09B6:
  173. $09B6:
  174. $09B6:
  175. $09B6:
  176. $09B6:
  177. $09B6:
  178. $09B6:
  179. $09B6:
  180. $09B6:
  181. $O9B6:
  182. $09B6:
  183. $09B6:
  184. $09B6:
  185. $O9B6:
  186. $09B6:
  187. $O9B6:
  188. $O9B6:
  189. $09B6:
  190. $09B6:
  191. $09B6:
  192. $09B6:
  193. $09B6:
  194. $09B6:
  195. $09B6:
  196. $09B6:
  197. $09B6:
  198. $09B6:
  199. $09B6:
  200. $09B6:
  201. $09B6:
  202. $09B6:
  203. $09B6:
  204. $09B6:
  205. $09B6:
  206. $0260
  207. $0268
  208. $0270
  209. $0270
  210. $0278
  211. $0280
  212. $0288
  213. $0290
  214. $0298
  215. $02A0
  216. $02A8
  217. $02B0
  218. $02B8
  219. $02B8
  220. $02C0
  221. $02C0
  222. $02C8
  223. $0260
  224. $0268
  225. $0270
  226. $0270
  227. $0278
  228. $0280
  229. $0288
  230. $0290
  231. $0298
  232. $02A0
  233. $02A8
  234. $02B0
  235. $02B8
  236. $02B8
  237. $02C0
  238. $02C0
  239. $02C8
  240. $0260
  241. $0268
  242. $0270
  243. $41
  244. $41
  245. $00
  246. $49
  247. $41
  248. $00
  249. $00
  250. $00
  251. $00
  252. $00
  253. $00
  254. $00
  255. $42
  256. $41
  257. $41
  258. $00
  259. $49
  260. $41
  261. $00
  262. $00
  263. $00
  264. $00
  265. $00
  266. $00
  267. $4A
  268. $42
  269. $41
  270. $41
  271. $00
  272. $00
  273. $00
  274. $00
  275. $00
  276. $00
  277. $00
  278. $00
  279. $00
  280. $00
  281. $42
  282. $41
  283. $41
  284. $00
  285. $00
  286. $00
  287. $42
  288. $41
  289. $41
  290. $00
  291. $4C
  292. $00
  293. $00
  294. $00
  295. $00
  296. $00
  297. $00
  298. $00
  299. $4F
  300. $42
  301. $41
  302. $41
  303. $00
  304. $00
  305. $00
  306. $00
  307. $00
  308. $00
  309. $00
  310. $00
  311. $00
  312. $00
  313. $42
  314. $41
  315. $41
  316. $00
  317. $00
  318. $00
  319. $41
  320. $41
  321. $00
  322. $00
  323. $00
  324. $00
  325. $00
  326. $00
  327. $00
  328. $00
  329. $00
  330. $00
  331. $00
  332. $42
  333. $41
  334. $41
  335. $06
  336. $00
  337. $00
  338. $00
  339. $42
  340. $41
  341. $41
  342. $06
  343. $00
  344. $4F
  345. $00
  346. $00
  347. $00
  348. $00
  349. $00
  350. $00
  351. $77
  352. $42
  353. $41
  354. $41
  355. $00
  356. $00
  357. $00
  358. $00
  359. $00
  360. $00
  361. $00
  362. $00
  363. $00
  364. $00
  365. $00
  366. $42
  367. $00
  368. $00
  369. $00
  370. $00
  371. $00
  372. $00
  373. $00
  374. $00
  375. $00
  376. $00
  377. $42
  378. $42
  379. $00
  380. $00
  381. $42
  382. $42
  383. $42
  384. $42
  385. $41
  386. $41
  387. $00
  388. $00
  389. $44
  390. $00
  391. $00
  392. $00
  393. $00
  394. $00
  395. $00
  396. $00
  397. $42
  398. $42
  399. $41
  400. $41
  401. $41
  402. $41
  403. BBB
  404. : BBBBBBB
  405. AU COEUR DE TURBO
  406. Sie
  407. PASCAL
  408. 308
  409. AU
  410. COEUR DE TURBO PASCAL
  411. LE CODE COMPILE
  412. read et write
  413. $09B6:
  414. $09B6:
  415. $09B6:
  416. $09B6:
  417. $09B6:
  418. $09B6:
  419. $09B6:
  420. $09B6:
  421. $09B6:
  422. $09B6:
  423. $09B6:
  424. $09B6:
  425. $09B6:
  426. $09B6:
  427. $0270
  428. $0278
  429. $0280
  430. $0288
  431. $0290
  432. $0298
  433. $02A0
  434. $02A8
  435. $02B0
  436. $02B8
  437. $02B8
  438. $02C0
  439. $02C0
  440. $02C8
  441. f(cb, q(uitte ? q
  442. $00
  443. $49
  444. $41
  445. $00
  446. $00
  447. $00
  448. $00
  449. $00
  450. $00
  451. $4A
  452. $42
  453. $00
  454. $4C
  455. $00
  456. $00
  457. $00
  458. $00
  459. $00
  460. $00
  461. $00
  462. $4F
  463. $42
  464. $00
  465. $45
  466. $00
  467. $00
  468. $00
  469. $00
  470. $00
  471. $00
  472. $00
  473. $45
  474. $42
  475. $42
  476. $42
  477. $00
  478. $00
  479. $44
  480. $00
  481. $00
  482. $00
  483. $00
  484. $00
  485. $00
  486. $00
  487. $42
  488. $42
  489. Fig. 5.110 Le contenu du feb TURBO
  490. En plus de ce bloc de contrôle, la mémoire contient:
  491. — le véritable FCB du DOS (ici situé en $00C0:$0242, donc dans les données globales du DOS,
  492. parce que notre fichier est parmi les 8 premiers ouverts)
  493. — des tables gérées par le DOS, dont l’une est située dans le PSP de notre programme en train de
  494. s’exécuter
  495. — une table de conversion entre nos variables et les numéros de fichiers, située dans la zone des
  496. données globales de TURBO (en DS:$0242)'
  497. Compte tenu de cette floraison de tables gérées par MS-DOS et par TURBO, nous recommandons:
  498. — soit de n’utiliser que les procédures standard (RESET, READ...)
  499. — soit de gérer tout directement, en utilisant le DOS ou même le BIOS.
  500. 5.5.3.3 LES AUTRES PROCEDURES STANDARD
  501. Les autres procédures utilisables avec les fichiers de fiches (RESET, SEEK, CHAIN, ERASE,
  502. EXECUTE, FLUSH, RENAME, LONGSEEK, EOF, FILEPOS, LONFILEPOS, FILESIZE,
  503. LONGFILESIZE) sont compilées de façon similaire aux routines que nous avons présentées.
  504. Signalons que nous ne pouvons pas utiliser avec un fichier de fiches les fonctions EOLN,
  505. SEEKEOF et SEEKEOLN, qui sont réservées aux fichiers de type TEXT, ni BLOCKREAD et
  506. BLOCKWRITE réservées aux fichiers de blocs.
  507. AU COEUR DE TURBO PASCAL
  508. 309
  509. AU COEUR DE TURBO PASCAL
  510. ==================== PAGE 4 ====================
  511. LE CODE COMPILE
  512. read et write
  513. {5.5.4 LES FICHIERS DE BLOCS
  514. | 5.5.4.1 TRAITEMENT D’UN FICHIER DE BLOCS
  515. Voici un programme utilisant un fichier de blocs (FILE;):
  516. 0 (* 00] FILE *)
  517. | 1 (* 11 avr 87 *)
  518. 2
  519. M 3. (*$r+*)
  520. : 4 PROGRAM desassemble_fichier_de_blocs;
  521. 5 VAR fichier: FILE;
  522. | 6 tampon: ARRAY/0..$FF] OF BYTE;
  523. 7 nom_fichier: STRING/$20];
  524. 8 taille_bloc: INTEGER;
  525. 9 nombre_blocs, nombre_lus: INTEGER;
  526. : 10 BEGIN
  527. | | qi ASSIGN(fichier, nom_fichier);
  528. | 12 REWRITE(fichier, taille_bloc);
  529. | 13 BLOCKREAD(fichier, tampon, bre_blocs, bre_lus);
  530. i 14 CLOSE(fichier);
  531. q 15 END.
  532. ij | Fig. 5.111 Le programme desassemble file.
  533. |
  534. i Voici le code généré:
  535. | | 2D4D E849DD call TU_PARAGRAPHS
  536. { 2D50 0600 hex 0600 ; options
  537. 4 2D52 780B hex 71808 >. :cS
  538. iM 2D54 3C15 hex 3015 ; ds
  539. | 2D56 DCO2 hex DCO2 ; code
  540. | 2D58 3E00 hex 3E00 ; globales
  541. | 2DSA 0004 hex 0004 ; min piles
  542. i 2D5C 00A0 hex OOAO ; max piles
  543. 2DSE 1000 hex 1000 ; fichiers
  544. | 2D60 0000 hex 0000 ; input
  545. À | 2D62 0000 hex 0000 ; output
  546. 2D64 8BEC mov bp, sp
  547. 4 2D66 E814DF call © TU_TAILLE_CODE
  548. | 2D69 4E00 hex 4E00 ; taille
  549. | 2D6B 6D2D adr SAUT_PRINCIPAL
  550. ' 2D6D E90000 SAUT_PRINCIPAL jmp PRINCI PAL
  551. a!
  552. i) à
  553. AU COEUR DE TURBO PASCAL 310 AU COEUR DE TURBO PASCAL ~
  554. 5 LE CODE COMPILE §
  555. 55 read et write 55
  556. 2D70 BF6202 PRINCI PAL mov di, $0262
  557. 2D73 IE push ds
  558. 2D74 57 push di
  559. 2D75 BFAE03 mov di, $03AE
  560. 2D78 1E push ds
  561. 2D79 E806E4 call TU_POUSSE_STRING
  562. 2D7C E80FFC call TU_ASSIGN_FILE
  563. 2D7F BF6202 mov di, $0262
  564. 2D82 1E push ds |
  565. 2D83 57 push di |
  566. 2D84 AICF03 mov ax, [$03CF]
  567. 2D87 E8C3FD call TU_REWRITE_FIL
  568. 2D8A E846E2 call TU_10_CHECK
  569. 2D8D BF6202 mov di, $0262
  570. 2D90 1E push ds
  571. 2D91 57 push di
  572. 2D92 BFAE02 mov di, $02AE
  573. 2D95 1E push ds
  574. 2D96 57 push di
  575. 2D97 A1D103 mov ax, [$03D1]
  576. 2D9A 50 push ax
  577. 2D9B BFD303 mov di, $03D3
  578. 2D9E 1E push ds |
  579. 2D9F E8E2FD call TU_BLOCKREAD |
  580. 2DA2 E82EE2 call TU_IO_CHECK
  581. 2DAS BF6202 mov di, $0262 |
  582. 2DA8 1E push ds
  583. 2DA9 E82CFC call TU_CLOSE |
  584. 2DAC E824E2 call TU_10_CHECK |
  585. 2DAF E90000 jmp FIN
  586. 2DB2 33C0 FIN xor Ax soe
  587. 2DB4 E889DE call TU_HALT
  588. 2DB7. 0000 hex 0000
  589. Fig. 5.112 fichier de blocs.
  590. Notez que:
  591. — toutes les primitives de traitement de fichier invoquent des routines de la librairie, en ayant
  592. auparavant poussé sur la pile le segment correspondant au FCB du fichier et placé dans DI son
  593. décalage
  594. ~ si la procédure utilise d’autres paramètres (nom du fichier pour ASSIGN, taille du bloc pour
  595. REWRITE, adresse du tampon, nombre de blocs à lire, nombre de blocs effectivement lus
  596. pour BLOCKREAD...), ceux ci sont soit placés dans des registres soit poussés sur la pile.
  597. — si vous ne précisez pas la taille du bloc, TURBO utilise 128 octets par défaut
  598. — le nombre de blocs effectivement lus par BLOCKREAD est optionnel.
  599. Le bloc de contrôle utilisé par les fichiers de blocs est identique à celui des fichiers de fiches.
  600. AU COEUR DE TURBO PASCAL 311 AU COEUR DE TURBO PASCAL |
  601. ==================== PAGE 5 ====================
  602. LE CODE COMPILE 5
  603. read et write 5.5
  604. 5.5.4.2 LES AUTRES PROCEDURES STANDARD
  605. Les autres procédures utilisables avec les fichiers de blocs (RESET, SEEK, CHAIN, ERASE,
  606. EXECUTE, FLUSH, RENAME, LONGSEEK, EOF, FILEPOS, LONFILEPOS, FILESIZE,
  607. LONGFILESIZE) sont compilées de façon similaire aux routines que nous avons présentées.
  608. Signalons que nous ne pouvons pas utiliser avec un fichier de blocs les fonctions EOLN,
  609. SEEKEOF et SEEKEOLN, qui sont réservées aux fichiers de type TEXT, ni READ et WRITE
  610. réservées aux fichiers de fiches.
  611. {5.5.5 LES FICHIERS DE TYPE TEXT
  612. 5.5.5.1 TRAITEMENT D’UN FICHIER DE TYPE TEXT
  613. Voici un programme utilisant un fichier de type TEXT:
  614. \0 00 JA Un BR Ww D — ©
  615. (* 001 texte *)
  616. (* 11 avr 87 *)
  617. (*$r+*)
  618. PROGRAM desasemble_texte;
  619. VAR texte: TEXT;
  620. caractere: CHAR;
  621. nom_texte: STRING/$20);
  622. BEGIN
  623. ASSIGN(texte, nom_texte);
  624. REWRITE(texte);
  625. READ(texte, caractere);
  626. WRITE(texte, caractere);
  627. CLOSE(texte);
  628. END.
  629. Fig. 5.113 Le programme desassemble_texte.
  630. Voici le code généré:
  631. 2D4D E849DD call TU_PARAGRAPHS
  632. 2D50 0600 hex 0600 ; options
  633. 2D52 780B hex 780B ; cs
  634. 2D54 3C15 hex 108 te LS
  635. 2D56 DDO2 hex DDO2 ; code
  636. 2D58 3500 hex 3500 ; globales
  637. 2D5A 0004 hex 0004 ; min piles
  638. 2D5C 00A0 hex 00A0 ; max piles
  639. 2D5E 1000 hex 1000 ; fichiers
  640. 2D60 0000 hex 0000 ; input
  641. 2D62 0000 hex 0000 ; output
  642. AU COEUR DE TURBO PASCAL 312 AU COEUR DE TURBO PASCAL
  643. 5 LE CODE COMPILE 5
  644. 5.5 read et write 5.5
  645. 2D64 8BEC mov bp, sp
  646. 2D66 E814DF call TU_TAILLE_CODE
  647. 2D69, 5F00 hex 5F00 ; taille
  648. 2D6B 6D2D adr SAUT_PRINCI PAL
  649. 2D6D E90000 SAUT_PRINCIPAL jmp PRINCIPAL
  650. À 2D70 BF6202 PRINCIPAL mov di, $0262
  651. | 2D73 16 push ds
  652. 4 2D74 57 push di
  653. à 2D75 BF2F03 mov din!) $032F
  654. 1 2D78 1E push ds
  655. À 2D79 E806E4 call TU_POUSSE_STRING |
  656. a 2D7C E81EFS call TU_ASS IGN_TXT
  657. q 2D7F E851E2 call TU_10_CHECK
  658. 2D82 BF6202 mov di, $0262
  659. i 2D85 1E push ds
  660. À 2D86 B98000 mov cx, $0080
  661. i 2D89 E86AF5 call TU_REWRITE_TXT
  662. | 2D8C E844E2 call TU_10_CHECK
  663. À 2D8F BF6202 mov di, $0262
  664. } 2D92.1E push ds
  665. h 2D93 E86FF7 call TU_DEB_READ_TE
  666. q 2D96 BF2E03 mov di, $032E
  667. 4 2D99 1E push ds
  668. 2D9A E88FF9 call TU_READ_CAR
  669. | 2D9D E833E2 call TU_1IO_CHECK
  670. i 2DA0 BF6202 mov di, $0262
  671. a 2DA3 1E push ds
  672. 4 2DA4 E88DF7 call TU_DEB_W_TEXT
  673. f 2DA7 A02E03 mov al, [$032E]
  674. \ 2DAA 32E4 xor ah, ah
  675. 2DAC 50 push ax
  676. 2DAD B80000 mov ax, $0000
  677. 1 2DBO E8B4FA call TU_WRITE_CAR
  678. À | 2DB3 E81DE2 call TU_IO_CHECK
  679. 2DB6 BF6202 mov di, $0262
  680. 2DB9 1E push ds
  681. | 2DBA E860F6 call TU_CLOSE_TEXT
  682. 2DBD E813E2 call TU_1O_CHECK
  683. À 2DC0 E90000 jmp FIN
  684. À 2DC3 33C0 FIN xor ax, ax
  685. 2DC5 E878DE call TU_HALT
  686. | 2DC8 0000 hex 0000
  687. Fig. 5.114 fichier de type TEXT.
  688. à AU COEUR DE TURBO PASCAL : 313 AU COEUR DE TURBO PASCAL
  689. ge 2
  690. ==================== PAGE 6 ====================
  691. 5 LE CODE COMPILE s 4 5 LE CODE COMPILE s
  692. 5.5 read et write 5.54 5.5 read et write 5:5
  693. Notez que: Voici le code généré:
  694. — les primitives d'ouverture, fermeture, changement de nom... fonctionnent exactement comme
  695. pour les fichiers de fiches ou les fichiers de blocs: le compilateur ne génère que des appels àla M 2D4D E849DD call TU_PARAGRAPHS
  696. librairie, en passant l'adresse du FCB. Les routines de la librairie sont chargées d’effectuer les 2D50 0600 hex 0600 ; options
  697. | appels à MS-DOS, en utilisant les numéros de fichiers ("handle") | 2D52 780B hex 780B ; cs
  698. — les procédures READ et WRITE fonctionnent comme les lecture clavier ou écriture écran, 2D54 3C15 hex ACIS pds
  699. mais des routines d’initialisation spécifiques (TU_DEB_READ_TEXT et _ 2D56 DDO2 hex DD02 ; code
  700. TU_DEB_WRITE_TEXT) sont invoquées i 2D58 2700 hex 2700 ; globales
  701. — la taille du tampon est par défaut de $80. Cette valeur est utilisée par RESET et REWRITE. M 2D5A 0004 hex 0004 ; min piles
  702. Nous pouvons la modifier au moment de la déclaration: À 2D5C 00A0 hex O0A0 ; max piles
  703. t i 2D5E 1000 hex 1000 ; fichiers
  704. Do) VAR fichier _texte: TEXT[$20]; 2D60 0000 hex 0000 ; input
  705. ‘ i ; 2D62 0000 hex 0000 ; output
  706. 11 2D64 8BEC mov bp, sp
  707. t Le probléme est ici compliqué par: A 2D66 E814DF call TU_TAILLE_CODE
  708. | q 2D69 5F00 hex 5FOO ; taille
  709. 4 — la structure par ligne (qui doit être testable par EOLN, avec concordance de EOLN et EOF à M 2D6B 6D2D adr SAUT_PRINCI PAL
  710. q TRUE en fin de fichier) b !
  711. | — l'impossibilité de détecter à l’avance la fin de ligne ou de fichier lorsque le fichier est un 2D6D E90000 SAUT_PRINCIPAL jmp PRINCI PAL
  712. ’ périphérique autre que le disque (clavier, ligne série.) il
  713. D | — les propositions du PASCAL standard (remplacer le RETURN par un ESPACE, en _ 2D70 BF4801 PRINCIPAL mov di, $0148
  714. ig positionnant EOLN, possibilité de lire plusieurs entiers par READ, en les séparant par des M 2D73 1E push ds
  715. (4 signes d'opération, par exemple) à 2D74 E8BDF7 call TU_DEB_W_TEXT
  716. 11 — les choix de TURBO: utilisation de tampons par défaut, interdiction de lire des entiers séparés M 2D77 A16202 mov ax, [$0262]
  717. nil: par des signes + ou -, possibilités d’édition temporaire.) f 2D7A 50 push ax
  718. D. — la possibilité de gérer les périphériques de type caractère (le clavier, l'écran, le modem) comme _ 2D7B B80000 mov ax, $0000
  719. if | des fichiers de type TEXT \ 2D7E E802FB call TU_WRITE_ENTIE
  720. { ' — la possibilité de rediriger un fichier TEXT vers la disquette ou vers un fichier de caractére 2D81 E84FE2 call TU_I10_CHEXK
  721. | | q 2D84 BF4801 mov di, $0148
  722. À { 2D87 1E push ds
  723. | 5.5.5.2 LES PERIPHERIQUES COMME FICHIERS TEXT | 2D88 E8A9F7 call TU_DEB_W_TEXT
  724. | À 2D8B A16202 mov ax, [$0262]
  725. 1 i 2D8E 50 push ax
  726. | Voici un programme qui émet directement des caractères vers des périphériques autres que le | 2D8F B80000 mov ax, $0000
  727. | | périphérique standard: 1 2D92 E8EEFA call TU_WRITE_ENTIE
  728. | | 2D95 E83BE2 call TU_1O_CHECK
  729. i 0 (* 001 write4 *) À 2D98 BF4CO01 mov di, $014C
  730. quil 1 (*11avr87*) ) 2D9B 1E push ds
  731. 2 $ | 2D9C E895F7 ¢ al l TU_DEB_W_TEXT
  732. 1 3 (*$r+*) 4 2D9F A16202 mov ax, ($0262]
  733. Wy 4 PROGRAM desassemble_write_standard; | 2DA2 50 push ax
  734. | 3 VAR entier: INTEGER; q 2DA3 B80000 mov ax, $0000
  735. 6 BEGIN 1 2DA6 E8DAFA ‘call TU_WRITE_ENTIE
  736. | WRITE(CON, entier); 1 2DA9 E827E2 call TU_10_CHECK
  737. 8 WRITE(TRM, entier); |
  738. 9 WRITE(KBD, entier); À 2DAC BF5001 mov di, $0150
  739. | | 10 WRITE(LST, entier); i 2DAF 1E push ds
  740. || 11 END. 4 2DB0 E881F7 call TU_DEB_W_TEXT
  741. |. À 2DB3 A16202 mov ax, [$0262]
  742. ! Fig. 5.115 Le programme desassemble_write_standard. 2DB6 50 push ax
  743. iq À 2DB7 B80000 mov ax, $0000
  744. i 4 2DBA E8C6FA call TU_WRITE_ENTIE
  745. 14 | 2DBD E813E2 call TU_I1O_CHECK
  746. 1
  747. 1 AU COEUR DE TURBO PASCAL 314 AU COEUR DE TURBO PASCAL — AU COEUR DE TURBO PASCAL 315 AU COEUR DE TURBO PASCAL
  748. | if
  749. Ng 4
  750. ==================== PAGE 7 ====================
  751. LE CODE COMPILE 5
  752. 5 LE CODE COMPILE 5 ‘
  753. 55 readied WAS 5.5 read et write 5.5
  754. : D64 8BEC mov bp, sp
  755. 2DC0 £90000 jmp FIN 2D66 E814DF call TU-TAILLE_CODE
  756. hex VoO0 shen te
  757. 2DC3 33C0 FIN Kor ax, ax 2D69 5300 ;
  758. peser ae a 2D6D £90000 SAUT_PRINCIPAL jmp PRINCIPAL
  759. Fig. 5.116 vets des périphériques standard Ÿ à 2D70 BF4801 PRINCIPAL in6Ÿ di, $0148
  760. a 2D73 1E push ds
  761. 2D74 E88EF7 call tie
  762. a 2D77 BF6202 mov di,
  763. a Poe 2D7A IE push ds
  764. 4 i | — le code est identique au code d’affichage vers un fichier TEXT. Seule l’adresse du bloc de 2D7B E8C2F9 call TU_READ_ENTIER
  765. : ! rap dron modifiée a is ie 2D7E E852E2 call TU_IO_CHECK
  766. — ces fichiers TEXT sont ouverts par défaut. Il n’est pas nécessaire d’exécuter un A et un à
  767. 4 RESET ou REWRITE a ape heen dot A LE ROR
  768. 4 — les autres fichiers (AUX et USR) sont situés aux adresses $0154 et $0158. uy À ah 5 E87DF7 A 11 TU DEB READ TE
  769. | | — l'émission vers LST ne garantit pas que la transmission fonctionnera. Encore faut-il que la el BF6202 ae di) )$0060 1.)
  770. liaison série ait été initialisée correctement auparavant a Spa BIE push ds :
  771. a 2D8C E8B1F9 call TU_READ_ENTIER
  772. | 2D8F E841E2 call: - TWO, CHECK
  773. De façon similaire pour READ, nous avons: il 2D92 BF4C01 batho di, $014C
  774. ‘| 206 ES vs DEB_READ_TE
  775. va 2D96 E86CF7 ca a, ha A
  776. hate net t a 2D99 BF6202 mov di, $0262
  777. ii nc Sa 4 2D9C 1E push ds
  778. 3 (sree). ti 2D9D E8A0F9 call TU_READ_ENTIER
  779. 4 PROGRAM desassemble read_ standard; ne 2DAQ see ni TUDIOLCHECK
  780. 2. SANS INTEGER: ll 2DA3 BF5001 mov di, $0150
  781. 7 READ(CON, entier): 194 2DA6 1E push ds
  782. i SRE) ae 2DA7 E85BF7 call TU_DEB_READ_TE
  783. pete tng A a 2DAA BF6202 mov di, $0262
  784. 9 READ(KBD, entier); BY 2DAD 1E push ay
  785. EO, te ed Mimi ot 2DAE E88FF9 call TU_READ_ENTIER
  786. i . oe 2DB1 E81FE2 call TU_1IO_CHECK
  787. Fig. 5.117 Le programme desassemble_read_standard. 54 2DB4 E90000 jmp FIN
  788. y ‘1 2DB7 3300 FIN Kor ax ax
  789. y TE pe. | DB9 E884DE call TUL)
  790. L avec le code suivant: + ‘À 2DBC 0000 by 0000
  791. | | 2D4D E849DD dau TU_PARAGRAPHS $ i Fig. 5.118 READ des périphériques TEXT
  792. | 2D50 0600 hex 0600 ; options a
  793. | 2D52 780B hex 780B, (7) es VA
  794. À 2D54 3C15 hex 3C1S us al
  795. 1 2D56 DCO02 hex DCO02 ; code a
  796. | 2D58 2700 hex 2700 ; globales à
  797. | 2D5A 0004 hex 0004 ; min piles M
  798. 1 2D5C 00A0 hex OOAO ; max piles
  799. | 2D5E 1000 hex 1000 ; fichiers
  800. | 2D60 0000 hex 0000 ; input
  801. iW | 2D62 0000 hex 0000 ; output |
  802. | 1
  803. | | ÿ
  804. | uf hi,
  805. AU COEUR DE TURBO PASCAL 316 AU COEUR DE TURBO PAS. AU COEUR DE TURBO PASCAL 317 AU COEUR DE TURBO PASCAL
  806. ye
  807. Nuch
  808. ==================== PAGE 8 ====================
  809. 5 LE CODE COMPILE
  810. 5.5 read et write
  811. Wn
  812. 5.5.5.3 LE BLOC DE CONTROLE DES FICHIERS TEXT
  813. \ contenant:
  814. — aux deux premiers octets le numéro de fichier
  815. 1 — aux deux octets suivant: L |
  816. 1 — dans les bits 0 à 3, sur 4 bits le fichier logique
  817. est déja lu)
  818. | Voici un programme qui affiche ces blocs de contrôle:
  819. Actuellement, pour lès fichiers TEXT sur disque, TURBO utilise un bloc de contrôle limité, 1
  820. — dans le bit 5, une étiquette indiquant qu'un entier a été lu par READ (le caractère suivaniil
  821. — dans le bit 6, une étiquette indiquant que le fichier est un fichier qui peut être écrit
  822. — dans le bit 7, une étiquette indiquant que le fichier est un fichier qui peut être lu
  823. O (*O21fcbit *)
  824. " 1, (f28myn87 ()
  825. | 2
  826. iM 3 (*Sr+*}
  827. 4 PROGRAM teste_fcb_turbo_texte;
  828. H 5 TYPE ¢_array_16_caracteres= ARRAY/0..15] OF CHAR;
  829. a 6 VAR choix: CHAR;
  830. i 7 avant: t_array_16 caracteres;
  831. 4 8 fichier_texte: TEXT/$20];
  832. 9 apres: t_array_16_caracteres;
  833. | 10
  834. il 11 PROCEDURE affiche_octet_hexadecimal(p_octet: BYTE);
  835. | | 52 Le ks_hex: ARRAY/(0..15] OF CHAR= '0123456789ABCDEF' ;
  836. 1m 13 B
  837. ik 14 WRITE(ks_hex/(p_octet AND $F0) SHR 4], ks_hex[p_octet AND $0F]);
  838. 1 15 END; (* affiche_octet_hexadecimal *)
  839. | 16
  840. | 17 PROCEDURE affiche_entier_hexadecimal(p_entier: INTEGER);
  841. il 18 BEGIN
  842. Hi! | 19 affiche_octet_hexadecimal(HI(p_entier));
  843. | 20 affiche_octet_hexadecimal(LO(p_entier));
  844. Hl 21 END; (* affiche_entier_hexadecimal *)
  845. 4l 22
  846. 4 | 23 PROCEDURE affiche_memoire(p_segment, p_decalage_debut,
  847. q | 71 END; (* affiche_memoire *)
  848. Hi 72
  849. 13 PROCEDURE affiche fcb;
  850. | 74 VAR fcb_texte: RECORD
  851. | 75 numero: INTEGER;
  852. 118 76 etiquette: INTEGER;
  853. | 77 decalage_tampon: INTEGER;
  854. Mh 78 taille_tampon: INTEGER;
  855. ly 79 decalage_prochain_caractere: INTEGER;
  856. i 80 decalage fin_tampon: INTEGER;
  857. | 81 END ABSOLUTE fichier _texte;
  858. |
  859. AU COEUR DE TURBO PASCAL 318 AU COEUR DE TURBO PASC
  860. LE CODE COMPILE 5
  861. read et write 5.5
  862. 82 BEGIN (* affiche _fcb *);
  863. 83 WITH fcb_texte DO
  864. 84 BEGIN
  865. 85 affiche_entier_hexadecimal(numero);
  866. 86 CASE etiquette AND $000F OF
  867. 87 0: WRITE(’ disque’);
  868. 88 1: WRITE( CON’);
  869. 89 2: WRITE(’ KBD ’);
  870. 90 3: WRITE(’ LST ’);
  871. 91 4: WRITE(’ AUX ’);
  872. 92 5: WRITE(’ USR ’);
  873. 93 END;
  874. 94 [is
  875. i WRITE (etiquette AND $0010) SHR 4: 2);
  876. )
  877. 97 WRITE((etiquette AND $0020) SHR 5: 2);
  878. 98 WRITE((etiquette AND $0040) SHR 6: 2);
  879. 99 WRITE((etiquette AND $0080) SHR 7: 2);
  880. 100 WRITE(’ ’);
  881. 101 affiche_entier_hexadecimal(decalage_tampon); WRITE(’ ');
  882. 102 affiche_entier_hexadecimal(taille_ tampon); WRITE(’ ');
  883. 103 affiche_entier_hexadecimal(decalage_prochain_caractere); WRITE(’ ’);
  884. 104 affiche_entier_hexadecimal(decalage_fin_tampon);
  885. 105 WRITELN;
  886. 106 END;
  887. Fe END; (* affiche_le_fcb *)
  888. 10:
  889. 109 PROCEDURE affiche_fcb_turbo_texte_disque;
  890. 110 VAR | _caractere: CHAR;
  891. 111 Lentier: INTEGER;
  892. 112 [ ligne: STRING/80];
  893. 113 BEGIN (* affiche _fcb_turbo_texte *)
  894. 114 ASSIGN(ichier_texte, 'TEXT.TXT');
  895. 115 REWRITE(fichier_texte);
  896. 116 (* interdit:
  897. He READ(fichier_texte, l_caractere);
  898. 119 affiche_memoire(SEG(fichier_texte), OFS(fichier_texte)- 16,
  899. os OFS(fichier_texte)+ SIZEOF (fichier_texte)+ 16- 1);
  900. 122 WRITE( ligne <5678> ?’);
  901. i READLN(I_ ligne);
  902. 125 WRITELN(’'num sortie f o i tamp taille proch fin’);
  903. 126 affiche_fcb;
  904. 127
  905. 128 WRITELN(fichier_texte, |_ligne);
  906. 129 affiche_fcb;
  907. 130 WRITELN(fichier_texte, |_ligne);
  908. 131 affiche_fcb;
  909. 132 WRITELN(fichier_texte, |_ligne);
  910. 133 affiche_fcb;
  911. 134
  912. 135 CLOSE(fichier_texte);
  913. pee affiche_fcb; WRITELN;
  914. AU COEUR DE TURBO PASCAL 319 AU COEUR DE TURBO PASCAL
  915. ==================== PAGE 9 ====================
  916. LE CODE COMPILE
  917. read et write
  918. 138
  919. 139
  920. 140
  921. 141
  922. 142
  923. 143
  924. | 145
  925. Hi 146
  926. a 147
  927. it 148
  928. | 149
  929. M 152
  930. q 153
  931. | 154
  932. 155
  933. a 156
  934. 1 157
  935. 158
  936. 159
  937. 161
  938. L 162
  939. q
  940. | 163
  941. 164
  942. 11 i 165
  943. 166
  944. 167
  945. 168
  946. 169
  947. 170
  948. | 171
  949. | 172
  950. 173
  951. 174
  952. 175
  953. 176
  954. 177
  955. | 178
  956. Hil 179
  957. | 180
  958. | 181
  959. | 182
  960. 184
  961. 185
  962. | 186
  963. | i 188
  964. 1 189
  965. | 190
  966. | 191
  967. iy 192
  968. |) i 193
  969. ASSIGN(fichier_texte, 'TEXT.TXT');
  970. RESET(fichier_texte);
  971. (* interdit:
  972. WRITE(fichier_texte, l_ligne);
  973. i
  974. affiche_memoire(SEG(fichier_texte), OFS(fichier_texte)- 16,
  975. j OFS(fichier_texte)+ SIZEOF (fichier_texte)+ 16- 1);
  976. affiche_fcb;
  977. READ(fichier_texte, |_entier); WRITELN(’ L_entier=", entier);
  978. affiche_fcb;
  979. READ(fichier_texte, |_caractere); WRITELN(’ #, ORD(I_caractere));
  980. affiche_fcb;
  981. READLN(fichier_texte, |_entier); WRITELN(’ |_entier=’, l_entier);
  982. affiche_fcb;
  983. READ(fichier_texte, |_caractere); WRITELN(’ #, ORD(!_caractere));
  984. affiche_fcb;
  985. CLOSE(fichier_texte);
  986. affiche_fcb;
  987. END; (* affiche_fcb_turbo_texte_disque *)
  988. PROCEDURE affiche _fcb_turbo_texte_con;
  989. VAR !_caractere, |_deux: C
  990. HAR;
  991. 1 éntier: INTEGER;
  992. BEGIN (* affiche_fcb_turbo_texte_con *)
  993. ASSIGN(fichier_texte, 'CON.’);
  994. RESET (fichier_texte);
  995. affiche_fcb;
  996. WRITE(’ entier <5678> ?’);
  997. READ(fichier_texte, |_entier); WRITELN(’ | _entier=', |_entier);
  998. affiche_fcb;
  999. WRITE(’ caractere ?’);
  1000. READ(fichier_texte, |_caractere); WRITELN(’ #, ORD(!_caractere));
  1001. affiche_fcb;
  1002. WRITE(’ entier ?’);
  1003. READLN(fichier_texte, |_entier); WRITELN(’ Lentier=", l_entier);
  1004. affiche_fcb;
  1005. WRITE(’ caractere ?');
  1006. READ(fichier_texte, |_caractere); WRITELN(’ #, ORD(/_caractere));
  1007. affiche_fcb;
  1008. CLOSE(fichier_texte);
  1009. END; (* affiche_fcb_turbo_texte_con *)
  1010. PROCEDURE initialise;
  1011. BEGIN
  1012. avant:= ’AAAAAAAAAAAAAAAA’ ;
  1013. apres:= ’BBBBBBBBBBBBBBBB' ;
  1014. END; (* initialise *)
  1015. BEGIN (* principal *)
  1016. initialise;
  1017. REPEAT
  1018. WRITELN;
  1019. Hi $1677
  1020. | AU COEUR DE TURBO PASCAL
  1021. 320
  1022. AU COEUR DE TURBO PASCA!
  1023. À 5 LE CODE COMPILE 5
  1024. 5.5 read et write 5.5
  1025. 4 q 194 WRITE(‘f(cb disque, fc(b CON:, q(uitte ?’);
  1026. 1 195 READ(KBD, choix); WRITELN(choix);
  1027. | 196 CASE choix OF
  1028. 1 ( 197 ’c’ : affiche_fcb_turbo_texte_con;
  1029. A, 1 198 ’f : affiche _fcb_turbo_texte disque;
  1030. À 199 ND;
  1031. i 200 UNTIL choix= ’q’;
  1032. 4 i 201 END. (* principal *)
  1033. Voici un exemple d’exécution avec un fichier TEXT sur disque:
  1034. 1 Fig. 5.119 Le programme teste_fcb_turbo_texte.
  1035. f(cb disque, fc(b con:, q(uitte ? f
  1036. $1677:$0260
  1037. ‘ $1677:$0268
  1038. { $1677:$0270
  1039. q $1677:$0270
  1040. i $1677:$0278
  1041. if $1677:$0280
  1042. À $1677:$0288
  1043. \ $1677:$0290
  1044. 1 $1677:$0298
  1045. $1677: $02A0
  1046. D $1677 :$02A8
  1047. q $1677:$02B0
  1048. 4 $1677:$02B8
  1049. a $1677:$02B8
  1050. i $1677: $02C0
  1051. Y $1677:$02C8
  1052. :$02D0
  1053. :$02D8
  1054. : $02D8
  1055. $41
  1056. $41
  1057. $06
  1058. $BF
  1059. $2E
  1060. $00
  1061. $00
  1062. $00
  1063. $00
  1064. $00
  1065. $00
  1066. $00
  1067. $00
  1068. $00
  1069. $00
  1070. $42
  1071. $42
  1072. $41
  1073. $41
  1074. $00
  1075. $02
  1076. $00
  1077. $00
  1078. $00
  1079. $00
  1080. $00
  1081. $00
  1082. $00
  1083. $00
  1084. $00
  1085. $00
  1086. $00
  1087. $42
  1088. $42
  1089. $41
  1090. $41
  1091. $40
  1092. $DF
  1093. $58
  1094. $00
  1095. $00
  1096. $00
  1097. $00
  1098. $00
  1099. $00
  1100. $00
  1101. $00
  1102. $00
  1103. $00
  1104. $00
  1105. $42
  1106. $42
  1107. $41
  1108. $41
  1109. $02
  1110. $45
  1111. $00
  1112. $00
  1113. $00
  1114. $00
  1115. $00
  1116. $00
  1117. $00
  1118. $00
  1119. $00
  1120. $00
  1121. $00
  1122. $41
  1123. $41
  1124. $20
  1125. $58
  1126. $00
  1127. $00
  1128. $00
  1129. $00
  1130. $00
  1131. $00
  1132. $00
  1133. $00
  1134. $00
  1135. $00
  1136. $00
  1137. $41
  1138. $41
  1139. $00
  1140. $54
  1141. $00
  1142. $00
  1143. $00
  1144. $00
  1145. $00
  1146. $00
  1147. $00
  1148. $00
  1149. $00
  1150. $00
  1151. $00
  1152. $42 $42
  1153. $42 $42
  1154. ? 5678
  1155. 0 02BF
  1156. 0 02BF
  1157. 0 02BF
  1158. 0 02BF
  1159. 0 02BF
  1160. $41
  1161. $41 $41
  1162. $41
  1163. À $1677
  1164. ) $1677
  1165. i $1677:$02E0 $42
  1166. | $1677:$02E8 $42
  1167. x ligne <5678>
  1168. 0006 disque
  1169. i 0006 disque
  1170. 4 0006 disque
  1171. i 0006 disque
  1172. | FFFF disque
  1173. 0020
  1174. 0020
  1175. 0020
  1176. 0020
  1177. 0020
  1178. $41 $41
  1179. $41 $41
  1180. oooceo
  1181. Ome mn
  1182. iN $1677:$0260
  1183. 4 | $1677:$0268 $41
  1184. | $1677:$0270 $41
  1185. $41
  1186. $41
  1187. ae
  1188. $00
  1189. $00
  1190. $00
  1191. $00
  1192. $00
  1193. $00
  1194. $42
  1195. $42
  1196. 02BF
  1197. 02C5
  1198. 02CB
  1199. 02D1
  1200. 02BF
  1201. $41
  1202. $41
  1203. 02DF
  1204. 02DF
  1205. 02DF
  1206. 02DF
  1207. 02DF
  1208. $41
  1209. $41
  1210. : AAAAAAAA
  1211. : AAA
  1212. ‘ B
  1213. : BBBBBBBB
  1214. : BBBBBBB
  1215. AAAAA
  1216. AU COEUR DE TURBO PASCAL 321
  1217. AU COEUR DE TURBO PASCAL
  1218. ==================== PAGE 10 ====================
  1219. LE CODE COMPILE
  1220. read et write
  1221. $1677
  1222. $1677
  1223. $1677
  1224. $1677
  1225. $1677
  1226. $1677
  1227. $1677
  1228. $1677
  1229. $1677
  1230. $1677
  1231. $1677
  1232. $1677
  1233. $1677
  1234. $1677
  1235. $1677
  1236. $1677
  1237. :$0270
  1238. :$0278
  1239. :$0280
  1240. :$0288
  1241. :$0290
  1242. :$0298
  1243. :$02A0
  1244. : $02A8
  1245. :$02B0
  1246. $1677:
  1247. :$02B8
  1248. :$02C0
  1249. :$02C8
  1250. :$02D0
  1251. :$02D8
  1252. :$02D8
  1253. $1677:
  1254. :$02E8
  1255. $02B8
  1256. $02E0
  1257. $02
  1258. $45
  1259. $00
  1260. $00
  1261. $00
  1262. $00
  1263. $00
  1264. $00
  1265. $00
  1266. $36
  1267. $38
  1268. $0A
  1269. $00
  1270. $42
  1271. $42
  1272. num sortie
  1273. 0006 disque
  1274. l_entier=
  1275. 0006 disque
  1276. #13
  1277. 0006 disque
  1278. l_entier=
  1279. 0006 disque
  1280. #53
  1281. 0006 disque
  1282. FFFF disque
  1283. $20
  1284. $58
  1285. $00
  1286. $00
  1287. $00
  1288. $00
  1289. $00
  1290. $00
  1291. $00
  1292. $37
  1293. $0D
  1294. $00
  1295. $00
  1296. $42
  1297. $42
  1298. fo
  1299. 5678
  1300. 110
  1301. coo ono
  1302. oo O©Oc©
  1303. $00
  1304. $38
  1305. $OA
  1306. $00
  1307. $00
  1308. $42
  1309. $42
  1310. $06
  1311. $BF
  1312. $2E
  1313. $00
  1314. $00
  1315. $00
  1316. $00
  1317. $00
  1318. $00
  1319. $00
  1320. $0D
  1321. $35
  1322. $00
  1323. $00
  1324. $42
  1325. $42
  1326. i
  1327. 1
  1328. 1
  1329. tamp
  1330. 02BF
  1331. 02BF
  1332. 02BF
  1333. 02BF
  1334. 02BF
  1335. 02BF
  1336. f(cb disque, fc(b con:, q(uitte ? q
  1337. $00
  1338. $02
  1339. $54
  1340. $00
  1341. $00
  1342. $00
  1343. $00
  1344. $00
  1345. $00
  1346. $00
  1347. $OA
  1348. $36
  1349. $00
  1350. $00
  1351. $42
  1352. $42
  1353. $80
  1354. $BF
  1355. $58
  1356. $00
  1357. $00
  1358. $00
  1359. $00
  1360. $00
  1361. $00
  1362. $00
  1363. $35
  1364. $37
  1365. $00
  1366. $00
  1367. $42
  1368. $42
  1369. $42
  1370. $42
  1371. taille proch
  1372. 0020
  1373. 0020
  1374. 0020
  1375. 0020
  1376. 0020
  1377. 0020
  1378. 02BF
  1379. 02C4
  1380. 02C4
  1381. 02CB
  1382. 02CC
  1383. 02CC
  1384. : BBBBBBBB
  1385. : BBBBBBB
  1386. fin
  1387. 02BF
  1388. 02D1
  1389. 02D1
  1390. 02D1
  1391. 02D1
  1392. 02D1
  1393. Fig. 5.120 Affichage du bloc de contrôle d’un fichier TEXT sur disque
  1394. Notez que:
  1395. = lorsqu'un fichier TEXT est ouvert à l’aide de REWRITE, vous n’avez pas le droit de lire ce,
  1396. fichier
  1397. — lorsqu'un fichier TEXT est ouvert à l’aide de RESET, vous n’avez pas le droit d’écrire dans ce”
  1398. fichier
  1399. i
  1400. 5 LE CODE COMPILE 5
  1401. 5.5 read et write $:5
  1402. —— -
  1403. PP . i
  1404. Voici ce que donne l’exécution de ce programme lorsque notre fichier est redirigé vers la console:
  1405. f(cb disque, fc(b con:, q(uitte ? c
  1406. f(cb disque, fc(b con:, q(uitte ? q
  1407. num sortie f o i tamp taille proch fi
  1408. FFFF CON 0 1 1 02BF 0020 Po2cc 02D1
  1409. entier <5678> ? 5678
  1410. l_entier= 5678
  1411. FFFF COON 1 1 1 02BF 0020 02CC 02D1
  1412. Ee a gag ? #13
  1413. CON 0 1 1 02BF 0020 02CC
  1414. entier ? <8765> 8765 pt
  1415. l_entier= 8765
  1416. FFFF CON 0 1 1 02BF 0020 02CC 02D1
  1417. caractere ? A
  1418. #65
  1419. FFFF CON 0 1 1 02BF 0020 02CC 02D1
  1420. Notez que:
  1421. — le fichier associé à la console n’utilise
  1422. ouverte)
  1423. Fig. 5.121 Le bloc de contrôle d’un fichier TEXT lié à la console
  1424. — les zones concernant le tampon ne sont plus utilisées
  1425. — le même comportement se retrouve pour la lecture d’entiers par READ.
  1426. {5.5.6
  1427. RESUME
  1428. pas un nouveau numéro de fichier (la console étant déjà
  1429. Pour gérer les fichiers:
  1430. — le code effectue des appels à la librairie en respectant la mécanique d
  1431. DOS (utilisation d’un numéro de fichier tained handle), qui pe
  1432. au DOS de gérer le véritable FCB du fichier)
  1433. — TURBO PASCAL continue à utiliser un bloc de contrôle réduit
  1434. si vous lisez un entier par READ, le prochain caractère (le RETURN, qui est le seul caractère,
  1435. qui ne provoquera pas d’erreur) est conservé, et sera utilisé par le prochain READ. Dans ni
  1436. exemple, c’est la lecture du caractère qui suit qui hérite du RETURN. Si vous lisez un entier €!
  1437. i} utilisant READLN, le RETURN et l’INTERLIGNE seront bien consommés
  1438. AU COEUR DE TURBO PASCAL 322 AU COEUR DE TURBO PAS
  1439. jet
  1440. AU COEUR DE TURBO PASCAL 323 AU COEUR DE TURBO PASCAL
  1441. ==================== PAGE 11 ====================
  1442. 5 LE CODE COMPILE
  1443. 5.6 if, case, repeat, while, for 5
  1444. (5.6 LES INSTRUCTIONS DE CONTROLE
  1445. instructions de répétition (REPEAT, WHILE et FOR).
  1446. 5.6.1 (IK
  1447. Voici un programme utilisant IF:
  1448. Fig. 5.122 Le programme desassemble_if. 4
  1449. Voici le code compilé: À
  1450. 2D4D E849DD call TU_PARAGRAPHS ne
  1451. 2D50 0600 — hex 0600 ; options |
  1452. 2D52 7B06 hex 7B06 ; cs i
  1453. 2D54 3F10 hex BRIO) (3) a8 {
  1454. 2D56 DB02 hex DBO2 ; code i
  1455. 2D58 2700 hex 2700 ; globales À
  1456. 2D5A 0004 hex 0004 ; min piles ©
  1457. 2D5C 00A0 hex 00A0 ; max piles q
  1458. 2D5E 1000 hex 1000 ; fichiers ad
  1459. 2D60 0000 hex 0000 ; input wl
  1460. 2D62 0000 hex 0000 ; output i
  1461. 2D64 8BEC mov bp, sp Al
  1462. 2D66 E814DF call TU_TAILLE_CODE i
  1463. 2D69 4400 hex 4400 ; taille |
  1464. 2D6B 6D2D adr SAUT_PRINCIPAL i
  1465. 2D6D E90000 SAUT_PRINCIPAL jmp PRINCIPAL 4
  1466. AU COEUR DE TURBO PASCAL 324
  1467. AU COEUR DE TURBO PAS 4
  1468. Examinons à présent comment TURBO compile les instructions de test (IF et CASE) et les
  1469. 0 (*001IF *)
  1470. 1! (iliavr 817) À
  1471. 2 4
  1472. 3. (*Sr+ *) af
  1473. 4 PROGRAM desassemble_if; q
  1474. § VAR entier: INTEGER; |
  1475. 6 BEGIN |
  1476. 7 IF entier= $11 4
  1477. 8 THEN entier:= $22; À
  1478. 9 IF entier= $33 q
  1479. 10 THEN entier:= $44
  1480. 11 ELSE entier:= $55;
  1481. 12 IF TRUE |
  1482. 13 THEN ; AY
  1483. 14 END. |
  1484. 5 LE CODE COMPILE 5
  1485. = if, case, repeat, while, for 5.6
  1486. 2p70 A16202 PRINCIPAL mov ax, [$0262
  1487. 2D73 3D1100 cmp ax, $0011
  1488. 2D76 7403 je THEN1
  1489. 2D78 £90600 jmp FIN_IFI
  1490. 2D7B B82200 THENI mov ax, $0022
  1491. 2D7E A36202 mov [$0262], ax
  1492. 2D81 A16202 FIN_IFI mov ax, [$0262
  1493. 2D84 3D3300 cmp ax! 13033
  1494. 2D87 7403 Te THEN2
  1495. 2D89 E90900 jmp ELSE2
  1496. 2D8C B84400 THEN2 mov ax, $0044
  1497. 2D8F A36202. mov [$0262], ax
  1498. 2D92 E90600 jmp FIN_IF2
  1499. 2D95 B85500 ELSE2 mov ax, $0055
  1500. 2D98 A36202 mov [$0262], ax
  1501. 2D9B B80100 FIN_IF2
  1502. 2D9E OBCO ve || Be sila
  1503. 2DA0 7503 jnz FIN_IF3
  1504. 2DA2 E90000 jmp FIN_IF3
  1505. 2DA5 E90000 FIN_IF3 jmp FIN
  1506. 2DA8 33C0 FIN
  1507. 2DAA E893DE call TU HALT
  1508. Fig. 5.123 Le code du programme desassemble_if.
  1509. Notez que:
  1510. - a Boy la condition de test évaluée, le code saute soit au THEN soit au ELSE ou à la fin du
  1511. — comme la taille du code à exécuter lorsque la condition est vraie n°
  1512. tail xé € n’est pas connue au mom
  1513. de la compilation de la condition, le code met en oeuvre un saut long: m vi
  1514. calcul de la condition
  1515. saut court au THEN
  1516. saut long après le code exécuté lorsque la condition est vraie
  1517. 3 ree optimisation n'est effectuée pour accélérer l'évaluation de la condition (IF FALSE
  1518. ND autre_condition calculera entièrement autre_condition, bien que la condition soit déjà
  1519. fausse). Il est vrai que WIRTH n’avait pas demand i i
  1520. pu à Pp andé que les expressions booléennes soient
  1521. AU COEUR DE TURBO PASCAL 325 AU COEUR DE TURBO PASCAL
  1522. ==================== PAGE 12 ====================
  1523. 5 LE CODE COMPILE À
  1524. 5.6 if, case, repeat, while, for } 5 LE CODE COMPILE 5
  1525. « 3.6 if, case, repeat, while, for 5.6
  1526. RESUME à Ce programme génère le code suivant:
  1527. |
  1528. La structure de IF condition THEN instruction est la suivante b ap4D ES 4 9DD cada TU_PARAGRAPHS
  1529. ï 2D50 hex 0600 ; options
  1530. calcul de la condition i 2D52 7B06 hex 7806 ; cs
  1531. i Jxx debut_then | 2054 bai DOC ve
  1532. i Sn D ex Paes d
  1533. | JMP fin_if q 2058 Fae 4 mae 2700 ; gioperes
  1534. ; , de 2D ex 0004 ; min piles
  1535. fi debut_then instruction a 2D5C 00A0 hex OOAO ; max eites
  1536. q | fin_if À 2D5E 1000 hex 1000 ; fichiers
  1537. ae 4 2D60 0000 hex 0000 ; input
  1538. ti me 2D62 0000 hex 0000 ; output
  1539. if 1 et la structure de IF condition THEN instruction] ELSE instruction2: a 2D64 8BEC mov “ee
  1540. 4 calcul de la condition ;: D 7800 en TERR TS
  1541. a | Jxx debut_then à | 2D6B 6D2D adr SAUT_PRINCI PAL
  1542. | JMP debut_else i 2D6D E90000 SAUT_PRINCIPAL jmp PRINCIPAL
  1543. : A , H
  1544. nm | debut_then D 4 2070 A16202 PRINCIPAL mov ax, [$0262]
  1545. 14 ing c + $0
  1546. i debut_else instruction2 4 2D76 7403 SPA PARA
  1547. i # 7 2D78 £90900 jmp TEST_2
  1548. L | . " al
  1549. | | fin_if 7 2D7B B82200 CAS_1 mov ax, _ $0022
  1550. 1 ' 2D7E A36402 mov [$0264], ax
  1551. 4 | À 2D81 E95500 jmp FIN_CASE
  1552. i
  1553. q ‘ 2D84 3D2200 TEST_2 cm 0022
  1554. À a 2D87 7C05 je. TEST 21
  1555. nn [5.6.2 CASE à 2D89 3D3300 cmp ax, $0033
  1556. 1 2D8C 7E03 118 O3
  1557. | Voici un programme contenant un CASE: 2D8E E90900 TEST_21 jmp TEST_3
  1558. i i 2D91 B84400 CAS: 2 mov ax, $0044
  1559. | | 0 (* 001 CASE *) | Do: 436402 mov [$0264], ax
  1560. | 1 (*11 avr 87*) } 7 E93F00 jmp FIN_CASE
  1561. M 2. 4 2D9A 3DAAAA T AAAA
  1562. | EST:3
  1563. | Sy(ter+ *) i q 2D9D 7403 : à ie CAS 3
  1564. | 4 PROGRAM desassemble_case; ‘ 2D9F E90900 i T
  1565. i | 5 VAR selecteur, entier: INTEGER; a jmp TEST_4
  1566. 6 BEGIN ‘à 2DA2 B85500
  1567. ‘4 CAS_3 mov , $0055
  1568. 9 $22..$33 : entier:= $44; jmp = FIN_CASE
  1569. i) i gigi mena Mo À De SE TEST_4 cmp ax, $0025
  1570. i 12 $40, $50..$60, $70 : entier:= $77; à re i CASA,
  1571. | 13 END; j al
  1572. 1] 14 END. : De B86600 CAS_4 mov ax, $0066
  1573. 1 Fig. 5.124 Le programme desassemble_case. 4 mov [$0264], ax
  1574. i, ig prog a 1 2DB9 E91D00 jmp FIN_CASE
  1575. }
  1576. 1 R RBO PASC CRT -
  1577. M AU COEUR DE TURBO PASCAL 326 AU COEUR DE TU ’ AU COEUR DE TURBO PASCAL 327 AU COEUR DE TURBO PASCAL
  1578. #
  1579. ==================== PAGE 13 ====================
  1580. 5 LE CODE COMPILE i 5 LE CODE COMPILE
  1581. 5.6 if, case, repeat, while, for .( 5.6 if, case, repeat, while, for 5 4
  1582. * — .
  1583. 2DBC 3D4000 TEST_5 cmp ax, $0040 4 RESUME
  1584. 2DBF 7412 je CAS 5 i
  1585. 2DC1 3D5000 . cmp ax, $0050
  1586. 2DC4 1608 \ jl Dor een a 1
  1587. 2DC6 3D6000 cmp axl. A La structure du CASE P
  1588. 2DC9 7E08 jle CAS_5 ; € du est la suivante:
  1589. 2DCB 3D7000 TES 1 cmp aa 7 i 8
  1590. 2DCE 7403 je Al a | :
  1591. 2DD0 E90600 jmp $FIN_CASE : évaluation de la valeur du sélecteur
  1592. L 4 CMP AX, éti
  1593. LL. 2DD3 B87700 CAS_5 mov ax, $0077 a Fo) cee alana
  1594. a | 2DD6 A36402 mov [$0264], ax i : iy
  1595. à MI CMP AX, borne_inféri
  1596. 0 2DD9 E90000 FIN_CASE jmp FIN 1 JL Hear meg 9
  1597. n 7 CMP AX, &ri
  1598. (] 2DDC 33C0 FIN xor ax, ax 4 Mao en
  1599. a | 2DDE E85FDE call TU_HALT 4 j m
  1600. À i ‘ . étiquette_suivante_14
  1601. | Fig. 5.125 Le code du programme desassemble_case. CMP AX, detniére_étiquette_1
  1602. | JE traite_cas
  1603. nn 4 JMP teste_liste_étiquettes_2 ou fin_case
  1604. i” | Notez que: ‘ traite_cas instructions
  1605. 1 hs JMP fi
  1606. 1 _ le CASE est implémenté strictement comme une cascade de IF 4 ano
  1607. a - il n’y a donc pas de limite maximale à la valeur scalaire que peuvent prendre les étiquette ! teste_liste_étiquettes_2
  1608. | (dans la limite de MAXINT) i
  1609. | i — ceci explique aussi: LA
  1610. À — la possibilité d’utiliser des plages d'étiquettes q
  1611. D | — que lorsque plusieurs étiquettes ont la même valeur (ou qu’une valeur est située dans fin_case
  1612. | plage des valeurs d’un autre cas) c’est la première valeur rencontrée qui est utilisée 4
  1613. (fl — lorsque le nombre de valeurs distinctes dépasse 20, les sauts courts ne peuvent pas accéder
  1614. li | code du cas. Un JMP_S relai est alors placé dans le code (non présenté ici) i
  1615. i i À
  1616. i) |
  1617. i ' n q
  1618. | i , { 5.6.3 REPEAT
  1619. (A ‘0
  1620. (M | " 1
  1621. 1 | 4 Voici un programme avec des REPEAT:
  1622. | Mi
  1623. | 4 0 (*00] REPEAT *)
  1624. i À ; (* 11 avr 87 *)
  1625. 4
  1626. i À 4 PROGRAM desassemble repeat;
  1627. || a 5 VAR entier: INTEGER;
  1628. | \ 6 BEGIN
  1629. | ï. d REPEAT
  1630. | 8 entier:= $11;
  1631. | L: 9 UNTIL entier> $22;
  1632. (| ‘ 10 REPEAT:
  1633. 1 11 UNTIL FALSE;
  1634. il 12 END.
  1635. | | À Fig. 5.126 Le programme desassemble_repeat.
  1636. iW
  1637. AU COEUR DE TURBO PASCAL 328 AU COEUR DE TURBO PAS CA . AU COEUR DE TURBO PASCAL 329 AU COEUR DE TURBO PASCAL
  1638. ==================== PAGE 14 ====================
  1639. 5 LE CODE COMPILE
  1640. 5.6 if, case, repeat, while, for 1 . LE CODE COMPILE 5
  1641. 5.6 if, case, repeat, while, for 5.6
  1642. — É
  1643. Voici le code généré: RESUME
  1644. 2D4D E849DD ©. call TU _PARAGRAPHS ~
  1645. 2D50 0600 hex 0600 ; options Voici la structure de REPEAT instruction UNTIL condition:
  1646. 2D52 7B06 pie Sere ; is
  1647. 2D54 3F10 ex Tehri ks i
  1648. 2D56 DAO2 hex DAO02 ; code debut_repeat instruction
  1649. 2D58 2700 hex 2700 ; globales uw
  1650. 2D5A 0004 hex 0004 ; min piles © calcul de condition
  1651. 2D5C 00A0 hex 00A0 ; max piles | Jxx fin_repeat
  1652. 2D5E 1000 hex 1000 ; fichiers | fi JMP debut_repeat
  1653. 2D60 0000 hex 0000 ; input i in_repeat
  1654. 2D62 0000 hex 0000 ; output 4
  1655. #3
  1656. 2D64 8BEC mov bp, sp 4
  1657. 2D66 E814DF call © TU_TAILLE_CODE
  1658. 2D69 2A00 hex 2A00 ; taille a
  1659. 2D6B 6D2D adr SAUT_PRINCI PAL q {5.6.4 WHILE
  1660. 2D6D E90000 SAUT_PRINICPAL jmp PRINCI PAL : Voici un pates aline WHILE:
  1661. 2D70 PRINCIPAL stu y
  1662. 4 2D70 B81100 DEBUT_REPATI mov ax, 11 \
  1663. 11 2D73 A36202 mov [$0262], ax ‘ Pere
  1664. LL: 2D76 A16202 mov ax, [$0262] 7
  1665. ‘M k 3 (*$r+ *)
  1666. l oe rear bs | sh, Seuss 4 PROGRAM desassemble while;
  1667. jnle FIN_REPEATI 5 VAR entier: ,
  1668. 7 | 2D7E E9EFFF jmp DEBUT_REPEATI 2 Saar INTEGER;
  1669. | °
  1670. i 2D81 FIN_REPEATI £ WHILE entier> $11 DO
  1671. i! 2D81 B80000 DEBUT_REPEAT2 mov ax, $0000 9 entier:= $22;
  1672. ff À 2D84 OBCO or Oe Vex
  1673. a 2D86 7503 jnz FIN_REPEAT2 10 Te ee
  1674. : 2D88 E9F6FF jmp DEBUT_REPEAT2 12 WHILE FALSE AND (entier> $33) DO;
  1675. q 2D8B E90000 FIN_REPEAT2 jmp FIN 13 END.
  1676. i | 2DSE 33C0 FIN ind diet él i Fig. 5.128 Le programme desassemble_while.
  1677. i 2D90 E8ADDE call TU_HALT À
  1678. | | Fig. 5.127 Le code du programme desassemble_repeat. À et le code correspondant:
  1679. i Notez que: À
  1680. | [ _ le saut arrière est effectué par un JMP, ce qui permet de traiter par une même mécanique, pe EAU call TU_PARAGRAPHS
  1681. Ny sauts longs et courts 2D52 7B06 es ob ; Options
  1682. ex 7 ee
  1683. i + 3F10 hex 3F10 ; ds
  1684. i, q 2Dse DC02 hex DCO2 ; code
  1685. 1 4 Hi hex 2700 ; globales
  1686. À à 2Dèc 0004 hex 0004 ; min piles
  1687. | , 2D3E 00A0 hex OOAO ; max piles
  1688. 2060 1000 hex 1000 ; fichiers
  1689. 1 ‘à 2D62 0000 hex 0000 ; input
  1690. il 0000 hex 0000 ; output
  1691. |
  1692. | AU COEUR DE TURBO PASCAL 330 AU COEUR DE TURBO P SC. Wire
  1693. | AU COEUR DE TURBO PASCAL 331 AU COEUR DE TURBO PASCAL
  1694. |
  1695. *
  1696. ==================== PAGE 15 ====================
  1697. LE CODE COMPILE
  1698. if, case, repeat, while, for
  1699. 2D64 8BEC
  1700. 2D66 E814DF
  1701. M 2D69 4D00
  1702. à 2D6B 6D2D
  1703. R | 2D6D E90000
  1704. 2D70 A16202
  1705. | 2D73 3D1100
  1706. ji. 2D76 7F03
  1707. i 2D78 £90900
  1708. 2D7B B82200
  1709. i 2D7E A36202
  1710. il 2D81 E9ECFF
  1711. (l
  1712. t 4
  1713. IA 2D84 B80100
  1714. | | 2D87 OBCO
  1715. rn 2D89 7503
  1716. | | 2D8B E90300
  1717. i 2D8E E9F3FF
  1718. 2D91 B80000
  1719. fl 50
  1720. A16202
  1721. j : 2D98 3D3300
  1722. i 2D9B B80100
  1723. 2D9E 7FO1
  1724. Je
  1725. N
  1726. ie)
  1727. ve)
  1728. un
  1729. il | 2DA8 E90300
  1730. 2DAB E9E3FF
  1731. 2DAE E90000
  1732. 2DB1 33C0
  1733. E88ADE
  1734. Notez:
  1735. SAUT _PRINCI PAL
  1736. PRINCIPAL
  1737. TESTE_WHILE1
  1738. DEBUT_WHILE1
  1739. FIN_WHILE1
  1740. TESTE_WHILE2
  1741. DEBUT_WHILE2
  1742. FIN_WHILE2
  1743. TESTE_WHILE3
  1744. TESTE_WHILE31
  1745. DEBUT_WHILE3
  1746. FIN_WAILE3
  1747. FIN
  1748. mov
  1749. call
  1750. hex
  1751. adr
  1752. jmp
  1753. mov
  1754. cmp
  1755. jnle
  1756. jmp
  1757. mov
  1758. mov
  1759. jmp
  1760. mov
  1761. or
  1762. jnz
  1763. jmp
  1764. jmp
  1765. jmp
  1766. xor
  1767. call
  1768. Fig. 5.129 Le code programme desassemble_while.
  1769. bp, sp
  1770. TU_TAILLE_CODE
  1771. 4D00 ; progranme
  1772. SAUT_PRINCI PAL
  1773. PRINCI PAL
  1774. ax, [$0262]
  1775. ax, $0011
  1776. DEBUT_WHILE1
  1777. FIN_WHILE1
  1778. ax, $0022
  1779. [$0262], ax
  1780. TESTE_WHILE1
  1781. ax, $0001
  1782. Nyy 40%
  1783. DEBUT_WHILE2
  1784. FIN_WHILE2
  1785. TESTE_WHILE2
  1786. ax, $0000
  1787. ax
  1788. ax, [$0262]
  1789. ax, $0033
  1790. ax, $0001
  1791. TESTE_WHILE31
  1792. ax
  1793. cx
  1794. Mw OX
  1795. ax) ax
  1796. DEBUT_WHILE3
  1797. FIN_WHILE3
  1798. TESTE_WHILE3
  1799. FIN
  1800. ax, ax
  1801. TU_HALT
  1802. _ l'utilisation des JMP longs pour contourner les instructions du WHILE
  1803. l’avant ou vers l’arrière
  1804. — l’absence d’optimisation de test des expressions booléennes
  1805. AU COEUR DE TURBO PASCAL 332
  1806. AU COEUR DE TURBO PASCA
  1807. AU COEUR DE TURBO PASCAL 333
  1808. 5 LE CODE COMPILE
  1809. i b ,
  1810. 5.6 if, case, repeat, while, for 5.6
  1811. —— -
  1812. RESUME
  1813. Le code généré pour WHILE condition DO instruction est:
  1814. teste_while calcul de la condition
  1815. Jxx debut_while
  1816. JMP fin_while
  1817. debut_while instruction
  1818. JMP teste_while
  1819. fin_while
  1820. 5.6.5 FOR
  1821. Et un programme muni de boucles FOR:
  1822. 0 (* 001 FOR *)
  1823. 1 (* 11 avr 87 *)
  1824. 2
  1825. 3 (*$r+ *)
  1826. 4 PROGRAM desassemble_for;
  1827. 5 VAR indice, bornel, borne2: INTEGER;
  1828. 6 indicel, indice2: INTEGER;
  1829. 7 BEGIN
  1830. 8 FOR indice:= borne! TO borne2 DO
  1831. i WRITELN;
  1832. 11 FOR indicel:= $10 TO $20 DO
  1833. 12 FOR indice2:= $30 TO $40 DO
  1834. li * indice:= SUCC(indice);
  1835. 15 FOR indice:= $22 TO $11 DO
  1836. 16 indice:= SUCC/(indice);
  1837. 17 END.
  1838. Fig. 5.130 Le programme desassemble_for.
  1839. et voici son code:
  1840. AU COEUR DE TURBO PASCAL
  1841. ==================== PAGE 16 ====================
  1842. pa iris 5 | 5. 2 LE CODE COMPILE 5
  1843. À 6 if, ti repeat, while, for 5.6 | 5. if, case, repeat, while, for 5.6
  1844. | 2DA9 “ue ENTRE _FOR2 inc cx
  1845. ; 2DAA A mov [$0268], ax
  1846. call TU_PARAGRAPHS 2DAD 51 BOUCLE_FOR2 push cx
  1847. Pris + a hes ne AR “M à JS ph ba INIT_FOR3 ey ae $0030
  1848. ex ; ! pus ax
  1849. ex ,
  1850. ort Ar hex 2700 ; globales 2DB6 91 iche on
  1851. i 0004 hex 0004 ; min piles 2DB7 2BC8 sub ex ax
  1852. C 00A0 hex 00A0 ; max pile 2DB9 7D03 jnl ENTRE _FOR3
  1853. ae 1000 hex 1000 ; fichiers 2DBB E91700 jmp FIN_FOR3
  1854. 260 0000 BER: OOM a Swe i
  1855. 2D62 0000 hex 0000 ; output 2DBE 41 ENTRE_FOR3 inc cx
  1856. b { 2DC2 Si Sue es ut eat
  1857. mov Pp, Sp \ Ww us cx
  1858. 202 ge tH call TU_TAILLE_CODE q 2DC3 A16202 he ax, [$0262]
  1859. 2D69 A600 hex A600 ; taille 1 2DC6 40 rot vw
  1860. i 2D6B 6D2D adr SAUT_PRINCI PAL i one 426202 mov [$0262], ax
  1861. q pop cx
  1862. SAUT_PRINCIPAL jmp PRINCI PAL à 2DCB 49 dec cx
  1863. | PRINCIPAL inc w [ A]
  1864. r Er NAT AN INIT_FORI mov ax, ($0264] 2DD2 E9EDFF imp BOUCLE_FOR3
  1865. | pus ax q
  1866. | 2D14 À 6602 mov ax, [$0266] 4 po is de age ts
  1867. | ° cx 1 ec cx
  1868. 2D78 31 Leg cx 2DD7 7407 je FIN_FOR2
  1869. n ak
  1870. | 2D7D £91900 imp FIN_FORI ELA aa oa HO i
  1871. qi 2D80 41 ENTRE_FOR1 inc cx i 2DE0 B82200 INIT_FOR4 mov ax, $0022
  1872. FA mov [$0262], ax 1 2DE3 50 if push ax
  1873. 2D81 A36202
  1874. LE_FORI ush cx 2DE4 B81100 mo , $0011
  1875. 2D85 ÉBDAF7 TE call TU_DEB_RW_DEFAU ; 2DE7 59 ee) à
  1876. 2D88 E8B4FB call TU_WRITELN 4 2DE8 91 xchg cx
  1877. 2D8B E845E2 call = TU_IO_CHECK q 2DE9 2BC8 sub cx, ax
  1878. 2D8E 59 pop cx À 2DEB 7D03 jnl _FOR4
  1879. 2D8F 49 $35 oe NRA a 2DED E91700 jmp FIN_FOR4
  1880. 2D96 E9EBFF jmp BOUCLE _FOR1 1 2DF1 A36202 mov [$0262], ax
  1881. q bts 51 she BOUCLE _FOR4 push cx
  1882. N_FOR1 2DF5 A16 , [$0262
  1883. 2099 B81000 INIT. FOR2 mov ax, $0010 2DF8 40 may en [$ ]
  1884. 2D9C 50 push ax 2DF9 A36202 mov [$0262], ax
  1885. 2D9D B82000 oh ak $0020 preg pop ex
  1886. ec cx
  1887. oe 4 xchg cx 2DFE 7407 je FIN_FOR4
  1888. jn in 1 4 jm ICLE_F
  1889. 2Da6 £53700 imp FIN_FOR2 an
  1890. | 2E07 E90000 FIN_FOR4 jmp FIN
  1891. | q 2E0A 33C0 FIN xor ax | ax
  1892. | | 2E0C E831DE call TU_HALT
  1893. Fig. 5.131 Le code du programme desassemble_for.
  1894. } AU COEUR DE TURBO PASCAL 335 AU COEUR DE TURBO PASCAL
  1895. AU COEUR DE TURBO PASCAL
  1896. : AU COEUR DE TURBO PASCAL 334
  1897. ==================== PAGE 17 ====================
  1898. 5 LE CODE COMPILE 5 À 5 LE CODE COMPILE 5
  1899. 5.6 if, case, repeat, while, for 5.6 | 5.6 if, case, repeat, while, for 5.6
  1900. ;
  1901. Notez que: 4 |
  1902. — le code comporte une partie initialisation, les instructions du FOR et l’incrémentation du :
  1903. compteur
  1904. — pendant l’initialisation, la valeur de la première borne est sauvée sur la pile (pour ne pas étre q Voici un programme comportant une instruction EXIT:
  1905. | modifiée par l’initialisation de la seconde borne, au cas où celle-ci était réalisée par une
  1906. fonction ayant des effets de bord)
  1907. | O (* 001 EXIT *)
  1908. — la valeur du compteur est indéterminée après la boucle: i à (* 10 avr 87 *)
  1909. — si à l’entrée dans le FOR, la valeur de la borne de départ est supérieure à celle de la borne b 3 PROGRAM desassemble_exit;
  1910. il d’arrivée, nous ne rentrons jamais dans la boucle, et la valeur du compteur n'est pas ( 4 BEGIN
  1911. | modifiée par le FOR 14 5 EXIT;
  1912. — si nous rentrons dans la boucle, sa valeur est égale à la borne finale à ; on
  1913. f b
  1914. — TURBO n’empéche pas de placer dans la boucle FOR des instructions qui modifient la valeur Mf : :
  1915. | du compteur (et par conséquent modifient le nombre de répétitions) } Fig. 5.132 Le programme desassemble_exit.
  1916. | — il est interdit de sauter par un GOTO dans le corps du FOR (parce que CX n'est pas sur la i
  1917. pile). Le GOTO en dehors du FOR nécessite de méme des instructions spéciales pour dépiler
  1918. CX. Ce cas sera examiné plus bas. à ui
  1919. — le cas de DOWNTO est similaire au cas de TO, en remplaçant les INC par des DEC. À Voici son code:
  1920. | Des trois instructions de répétition, FOR est, comme d’habitude, la plus complexe. |
  1921. a 2D4D E849DD call TU_PARAGRAPHS
  1922. i 2D50 0600 hex 0600 ; options
  1923. i 2D52 780B hex 780B ; cs
  1924. j RESUME i 2D54 3C15 hex 2013: Be
  1925. a 2D56 D902 hex D902 ; code
  1926. À 2D58 2700 hex 2700 ; globales
  1927. Le code généré pour FOR compteur:= debut TO fin DO instruction est: A 2D5A 0004 hex 0004 ; min piles
  1928. pl 2D5C 00A0 hex OOAO ; max piles
  1929. 4 2D5E 1000 hex 1000 ; fichiers
  1930. calcul des bornes q 2D60 0000 hex 0000 ; input
  1931. stockage du nombre de répétitions dans CX 4 2D62 0000 hex 0000 ; output
  1932. JGE entre_for iq
  1933. JMP fin_for 4 2D64 8BEC mov bp, sp
  1934. Î 2D66 E814DF call TU_TAILLE_CODE
  1935. entre_for INC CX qi 2D69 1B00 hex 1B00 ; taille
  1936. MOV [compteur], debut i 2D6B 6D2D adr SAUT_PRINCI PAL
  1937. \\
  1938. i
  1939. boucle_for PUSH CX à 2D6D E90000 SAUT _PRINCIPAL jmp PRINCIPAL
  1940. Va
  1941. instruction if 2D70 E90900 PRINCIPAL jmp $2D7C
  1942. \
  1943. POP CX i] 2D73 E8ACF7 call TU_WRITE_DEFAUT
  1944. DEC CX i 2D76 E8C6FB call TU_WRITELN
  1945. JE fin_for i 2D79 E857E2 call TU_10_CHECK
  1946. INC W [compteur] it
  1947. JMP boucle_for jo 2D7C E90000 LR_2D7C jmp FIN
  1948. fin_for a 2D7F 33C0 FIN xor AX, ae
  1949. 2D81 E8BCDE call TU_HALT
  1950. | 2D84 0000 hex 0000
  1951. 1
  1952. ! Fig. 5.133 Le code de desassemble_exit.
  1953. i %
  1954. i i
  1955. it a
  1956. IN si |
  1957. AU COEUR DE TURBO PASCAL 336 AU COEUR DE TURBO PASCAL q AU COEUR DE TURBO PASCAL 337 AU COEUR DE TURBO PASCAL
  1958. | i
  1959. ==================== PAGE 18 ====================
  1960. x] LE CODE COMPILE 5
  1961. p : : 5 LE CODE COMPILE 4
  1962. 5.6 if, case, repeat, while, for 5.6 36 ify ivaalitephenn vhs ited 56
  1963. | Notez que: 2D70 PRINCIPAL
  1964. | — le code généré effectue simplement un saut’a la fin du programme. Ceci est aussi le cas pour les 2D70 B81100 AVANT mov ax, $0011
  1965. | EXIT o procédures . 4 NÉ 2D73 A36202 mov [$0262], ax
  1966. | | 2D76 E9F7FF © jmp AVANT
  1967. | {5.67 L’INSTRUCTION GOTO q 2079 ee jmp APRES
  1968. 1 2D7C B82200 mov ax, $0022
  1969. | Voici un programme avec des GOTO: 4 2D7F A36202 mov [$0262], ax
  1970. | L' | 2D82 E90000 APRES jmp. FIN
  1971. 0 (* 001 GOTO * |
  1972. 1 ts 10 avr 87 *) ; q 2D85 33C0 FIN xor ax, ax
  1973. 2. 4 2D87 E8B6DE call TU_HALT
  1974. 3 (*$r+*) q 2D8A 0000 hex 0000
  1975. \ 4 PROGRAM d bl to; hi
  1976. 5 LABEL | Aer ARTE j Fig. 5.135 Un programme avec des GOTO .
  1977. 6 VAR entier: INTEGER; fl,
  1978. mJ BEGIN a
  1979. 8, avant: À
  1980. \ | 9 entier:= $11; Notez que:
  1981. i 1 iT i . i
  1982. Pare, prs — le GOTO est mis en oeuvre par de simples sauts.
  1983. 12 entier:= $22; |
  1984. i, 13 apres:
  1985. 14 END. j ù :
  1986. | Par contre lorsque nous souhaitons sortir d’une boucle FOR, le code est un peu plus compliqué:
  1987. | Fig. 5.134 Le programme desassemble_goto. À
  1988. | } 0 (* 001 gotof*)
  1989. À 1 (* 10 avr 87 *)
  1990. | Le code de ce programme est: i” 2
  1991. ig 3 (*$r+*)
  1992. 4 eq desassemble_goto for;
  1993. 2D4D E849DD call TU_PARAGRAPHS 4 5 LABEL avant, apres;
  1994. 2D50 0600 hex 0600 ; options a 6 VAR compteur: INTEGER;
  1995. 2D52 780B hex 780B ; cs q 7 BEGIN
  1996. | 2D54 3C15 hex 30715; ds 8 avant:
  1997. i 2D56 D902 hex D902 ; code | 9 FOR compteur:= $11 TO $22 DO
  1998. 2D58 2700 hex 2700 ; globales À 10 BEGIN
  1999. | 2D5A 0004 hex 0004 ; min piles 4 11 GOTO avant;
  2000. . 2D5C 00A0 hex 00A0 ; max piles & 12 GOTO apres;
  2001. 2D5E 1000 hex 1000 ; fichiers 4 13 END;
  2002. 2D60 0000 hex 0000 ; input À 14 apres:
  2003. | | 2D62 0000 hex 0000 ; output 1 15 END.
  2004. | 2D64 8BEC mov bp, sp Fig. 5.136 Le programme desassemble_goto_for.
  2005. Il 2D66 E814DF call TU_TAILLE_ OCDE 1
  2006. À 2D69 2100 hex 2100 ; taille 4
  2007. | 2D6B 6D2D adr SAUT_PRINCI PAL q ‘ay
  2008. 1 \ dont voici le code:
  2009. | 2D6D E90000 SAUT_PRINCIPAL jmp PRINCI PAL 4
  2010. L !
  2011. ll
  2012. !
  2013. AU COEUR DE TURBO PASCAL 338 AU COEUR DE TURBO PASCAL
  2014. AU COEUR DE TURBO PASCAL 339 AU COEUR DE TURBO PASCAL
  2015. ==================== PAGE 19 ====================
  2016. |
  2017. |
  2018. ï
  2019. |
  2020. i]
  2021. |
  2022. q
  2023. |
  2024. If
  2025. à LE CODE COMPILE 5
  2026. 5.6 if, case, repeat, while, for 5.6
  2027. 2D4D E849DD call TU_PARAGRAPHS
  2028. 2D50 0600 hex 0600 ; options
  2029. 2D52 780B ah hex 1808108
  2030. 2D54 3C15 hex Sees as
  2031. 2D56 DBO2 hex DBO2 ; code
  2032. 2D58 2700 hex 2700 ; globales |
  2033. 2DS5A 0004 hex 0004 ; min piles 1
  2034. 2D5C 00A0 hex 00A0 ; max piles \
  2035. 2D5E 1000 hex 1000 ; fichiers |
  2036. 2D60 0000 hex 0000 ; input 4
  2037. 2D62 0000 hex 0000 ; output À
  2038. 2D64 8BEC mov bp, sp i
  2039. 2D66 E814DF call §TU_TAILLE_CODE 4
  2040. 2D69 3D00 hex 3D00 ; taille M
  2041. 2D6B 6D2D adr SAUT_PRINCI PAL
  2042. 2D6D E90000 SAUT_PRINCIPAL jmp PRINCIPAL
  2043. 2D70 PRINCIPAL i
  2044. 2D70 B81100 AVANT mov ax, $0011 |
  2045. 2D73 50 push ax q
  2046. 2D74 B82200 mov ax, $0022 4
  2047. 2D710) 59 pop cx i)
  2048. 2D78 91 xchg cx if
  2049. 2D79 2BC8 sub CX, ax q
  2050. 2D7B 7D03 jnl ENTRE_FOR k
  2051. 2D7D E91600 jmp FIN_FOR |
  2052. 2D80 41 ENTRE _FOR inc cx 1
  2053. 2D81 A36202 mov [$0262], ax 4
  2054. 2D84 51 BOUCLE_FOR push cx q
  2055. 2D85 E91100 jmp RELAI_GOTO_1 q
  2056. 2D88 E91200 jmp RELAI_GOTO_2 À
  2057. 2D8B 59 pop cx 4
  2058. 2D8C 49 dec cx À
  2059. 2D8D 7407 je FIN_FOR 4
  2060. 2D8F FF066202 inc w [$0262] à
  2061. 2D93 E9EEFF jmp BOUCLE _ FOR :
  2062. À
  2063. 2D96 FIN_FOR 7
  2064. 2D96 E90800 APRES jmp FIN P
  2065. 2D99 58 RELAI_GOTO_1 pop ax 4
  2066. 2D9A E9D3FF jmp AVANT a
  2067. 2D9D 58 RELAI_GOTO_2 pop ax À
  2068. 2D9E E9FSFF jmp APRES q
  2069. 2DA1 33C0 FIN xor ax, ax 4
  2070. 2DA3 E89ADE call TU_HALT
  2071. 2DA6 0000 hex 0000
  2072. Fig. 5.137 Des GOTO hors d’une boucle FOR. Al
  2073. AU COEUR DE TURBO PASCAL 340 AU COEUR DE TURBO PASCAL —
  2074. i
  2075. 4
  2076. { 5.7.1 UN APPEL DE ROUTINE 8088
  2077. 5 LE CODE COMPILE 3
  2078. 5.6 if, case, repeat, while, for 5.6
  2079. Notez que:
  2080. — lorsqu’un GOTO vers un label situé plus loin est rencontré, le compilateur ne sait pas encore si
  2081. ce label sera situé en dehors du FOR ou non. Il ne peut donc pas savoir s’il faut dépiler CX ou
  2082. non. D'où les instructions spéciales, coincées à la fin du bloc, et utilisées pour tous les GOTO
  2083. en dehors d’une boucle FOR.
  2084. RESUME
  2085. Les instructions EXIT et GOTO sont exécutées au moyens de sauts.
  2086. Lorsqu’un GOTO ou un EXIT saute hors d’une boucle FOR, des
  2087. instructions placées en fin de bloc se chargent de dépiler le nombre de
  2088. répétitions.
  2089. {5.7 LES APPELS DE PROCEDURES |
  2090. Nous allons ici examiner le code généré par les appels de procédures. Une bonne compréhension
  2091. de ce paragraphe est essentielle pour la programmation en PASCAL en général, et surtout pour la
  2092. mise en oeuvre d’extensions de TURBO PASCAL (dépasser 64K de code, rendre des procédures
  2093. résidentes, effectuer des EXIT de plusieurs niveaux...)
  2094. Nous allons examiner:
  2095. — un appel de routine en 8088
  2096. — un appel de procédure simple
  2097. — la pile des variables locales
  2098. — la chaîne d’appel
  2099. — l'accès aux variables visibles
  2100. — les paramètres valeur
  2101. — les paramètres variable
  2102. — les appels de fonctions
  2103. Commençons par examiner en détail comment est effectué un appel de routine en 8088. Voici un
  2104. petit programme comportant un tel appel:
  2105. ; 001 AFFA.ASM
  2106. 29 avr 87
  2107. org $0100
  2108. call sous_routine
  2109. ret
  2110. AU COEUR DE TURBO PASCAL 341 AU COEUR DE TURBO PASCAL
  2111. ==================== PAGE 20 ====================
  2112. 5 LE CODE COMPILE 5
  2113. ST les appels de procédures SF
  2114. sous_routine push ds
  2115. mov ax, $B000
  2116. mov dsijolax
  2117. mov Bhyoar
  2118. mov [$0280] > a4
  2119. pop ds
  2120. ret
  2121. Fig. 5.138 Un programme en assembleur avec appel de sous-routine
  2122. Voici le code de ce programme aprés assemblage:
  2123. 0100:
  2124. 0100:
  2125. 0100:
  2126. 0100:
  2127. 0100:E80100
  2128. 0103:C3
  2129. 0104:
  2130. 0104:
  2131. 0104:
  2132. 0104:1E
  2133. 0105 ee at
  2134. ; 001 AFFA.ASM
  2135. ; 29 avr 87
  2136. org $0100
  2137. call sous_routine
  2138. ret
  2139. sous_routine push ds
  2140. mov ax, $B000
  2141. 0108:8 mov ds, ax
  2142. 010A:
  2143. 010A:B041 mov al 1347
  2144. 010C:A28002 mov [$0280], al
  2145. 010F:
  2146. 010F:1F pop ds
  2147. 0110:C3 ret
  2148. Fig. 5.139 Le code du programme
  2149. Nous chargeons le fichier .COM correspondant. En supposant que la première adresse disponible
  2150. soit $067B:$0000, MS-DOS:
  2151. — construit une zone de données de $067B:$0000 à $067B:$00FF (le Program Segment Prefix)
  2152. — charge le programme à l’adresse $067B:$0100
  2153. — place les valeurs $067B dans les registres de segment CS, DS, SS et ES
  2154. — place la valeur $0100 dans le compteur programme (PC)
  2155. — place la valeur $10000 dans le pointeur de pile 8088 (SP) et pousse $0000 sur la pile (pour
  2156. permettre le retour à MS-DOS)
  2157. Voici le déroulement de l’exécution à partir de cet instant:
  2158. — juste après le chargement, la valeur du compteur programme, PC, est $0100 et la valeur du
  2159. pointeur de pile, SP, est $FFFE:
  2160. AU COEUR DE TURBO PASCAL 342
  2161. AU COEUR DE TURBO PASCAL
  2162. 5 LE CODE COMPILE 5
  2163. 57 les appels de procédures 57
  2164. $00000
  2165. SYSTEME
  2166. $067B0 CS DS SS ES
  2167. PSP de AFFA.COM
  2168. $068B0 call... le code de AFFA.COM PC= $0100
  2169. $068B3 Tet
  2170. $068B4 push...
  2171. $068C1
  2172. $167CE $00 SP= $FFFE
  2173. $167CF $00
  2174. $167B0
  2175. inutilisé
  2176. $70000 sommet de la mémoire vive 448K
  2177. SYSTEME
  2178. $FFFFF
  2179. Fig. 5.140 La mémoire juste aprés le chargement
  2180. — le 8088 exécute l’appel de la sous-routine. Pour cela il pousse l’adresse de retour (ici'$0103)
  2181. sur la pile et place dans PC l’adresse de la première instruction de la sous-routine (ici $0104):
  2182. $00000
  2183. SYSTEME
  2184. $067B0 CS DS SS ES
  2185. PSP de AFFA.COM
  2186. $068B0 call... le code de AFFA.COM
  2187. $068B3 ret
  2188. $068B4 push... PC= $0104
  2189. $068C1
  2190. $167CC $03 SP= $FFFC
  2191. $167CD $01
  2192. $167CE $00
  2193. $167CF $00
  2194. $167B0
  2195. inutilisé
  2196. $70000 sommet de la mémoire vive 448K
  2197. SYSTEME
  2198. $FFFFF
  2199. Fig. 5.141 La mémoire juste après l’appel
  2200. AU COEUR DE TURBO PASCAL 343 AU COEUR DE TURBO PASCAL
  2201. ==================== PAGE 21 ====================
  2202. 5 LE CODE COMPILE 5
  2203. S7 les appels de procédures Sit
  2204. ‘ AU COEUR DE TURBO PASCAL 344
  2205. — le 8088 exécute le code de la sous-routine, et arrive au RET de cette sous-routine (ici $0110). A
  2206. ce moment, le 8088:
  2207. — dépile la valeur située, sur le sommet de la pile
  2208. — place cette valeur dans PC:
  2209. $00000
  2210. SYSTEME
  2211. $067B0 CS DS SS ES
  2212. PSP de AFFA.COM
  2213. $068B0 call... le code de AFFA.COM
  2214. $068B3 ret PC= $0103
  2215. $068B4 push...
  2216. $068C1
  2217. $167CE $00 SP= $FFFE
  2218. $167CF $00
  2219. $167B0
  2220. inutilisé
  2221. $70000 sommet de la mémoire vive 448K
  2222. SYSTEME
  2223. $FFFFF
  2224. Fig. 5.142 La mémoire juste aprés le retour
  2225. Le programme se poursuit donc:
  2226. — à l'instruction qui suit l’appel
  2227. — SP ayant la même valeur qu’avant l’appel
  2228. Notez que:
  2229. — lors d’une instruction PUSH, le 8088:
  2230. — commence par réduire la valeur de SP de 2
  2231. — puis stocke la valeur à cette adresse, l’octet faible en tête.
  2232. Si SP a la valeur $1234 par exemple et que AX contient la valeur $5678, alors après push ax:
  2233. — SP aura la valeur 1232
  2234. — l'adresse $1232 contiendra $78
  2235. — l'adresse $1233 contiendra $56
  2236. AU COEUR DE TURBO PASCAL
  2237. 5 LE CODE COMPILE 5
  2238. 5.7 les appels de procédures 1
  2239. $00000
  2240. $01232 $78 <-- SP
  2241. $01233 $56
  2242. $01234 <-- SP XX
  2243. $01235
  2244. $FFFFF
  2245. Fig. 5.143 L’instruction PUSH
  2246. — l’instruction POP place dans le registre ou la mémoire les 2 octets pointés par SP et incrémente
  2247. SP de 2
  2248. — voici comment s’opére le retour à MS-DOS (le RET situé en $0103):
  2249. — SP est égal à $FFFE
  2250. — notre instruction ret (ici en $01) retire du sommet de la pile l’adresse de retour. Ici elle a
  2251. pour valeur $0000 (elle a été placée par MS-DOS lors du lancement du programme). Cette
  2252. adresse est la première du PSP. A cet endroit MS-DOS a placé une instruction pour
  2253. redonner la main à MS-DOS (ici l’instruction INT $20)
  2254. Fondamentalement, le 8088 transfère le contrôle à la sous-routine, en sauvegardant
  2255. automatiquement l’adresse de retour sur la pile 8088.
  2256. {5.7.2 APPEL DE PROCEDURE SIMPLE
  2257. ’ En PASCAL, un appel de procédure correspond aussi à un transfert de contrôle puis un retour,
  2258. mais il faut en plus gérer les variables locales et les paramétres.
  2259. Ces données sont placées sur la pile du 8088. Elles forment pour chaque procédure appelée une
  2260. zone comportant:
  2261. — les valeurs transmises par la procédure qui appelle
  2262. — l’adresse de retour
  2263. — l’espace nécessaire aux objets locaux
  2264. AU COEUR DE TURBO PASCAL 345 AU COEUR DE TURBO PASCAL
  2265. ==================== PAGE 22 ====================
  2266. 5
  2267. 5.7
  2268. LE CODE COMPILE
  2269. les appels de procédures
  2270. 5
  2271. 54
  2272. Voici alors un programme comportant une seule procédure, sans variable locale ni paramètre
  2273. appelée depuis le programme principal:
  2274. (* 001 proc *)
  2275. (* 11 avr 87 *)
  2276. *$r+*
  2277. PROGRAM desassemble_appel_ procedure;
  2278. PROCEDURE deux;
  2279. BEGIN
  2280. WRITELN;
  2281. END;
  2282. 11 BEGIN
  2283. 13 END.
  2284. © © 00 -J A Un BR Ww ND = ©
  2285. Fig. 5.144 Le programme desassemble_appel_ procedure.
  2286. Voici le code du programme:
  2287. 2D4D E849DD call TU_PARAGRAPHS
  2288. 2D50 0600 hex 0600 ; options
  2289. 2D52 7B06 hex 7B06 ; cs
  2290. 2D54 3F10 hex 3F10 ; ds
  2291. 2D56 DA02 hex DAO2 ; code
  2292. 2D58 2700 hex 2700 ; globales
  2293. 2D5A 0004 hex 0004 ; min piles
  2294. 2D5C 00A0 hex OOAO ; max piles
  2295. 2D5E 1000 hex 1000 ; fichiers
  2296. 2D60 0000 hex 0000 ; input
  2297. 2D62 0000 hex 0000 ; output
  2298. 2D64 8BEC mov bp, sp
  2299. 2D66 E814DF call TU_TAILLE_CODE
  2300. 2D69 2F00 hex 2F00 ; taille
  2301. 2D6B 6D2D adr SAUT _PRINCI PAL
  2302. 2D6D E91700 SAUT_PRINCIPAL jmp PRINCIPAL
  2303. 2D70 55 DEUX push bp
  2304. 2D71 8BEC mov bp, sp
  2305. 2D73., 55 push bp
  2306. 2D74 E90000 jmp DEBUT _DEUX
  2307. 2D77 E8A8F7 DEBUT_DEUX call TU_DEB_RW_DEFAU
  2308. 2D7A E8C2FB call TU_WRITELN
  2309. 2D7D E853E2 call TU_IO_CHECK
  2310. 2D80 E90000 jmp FIN_DEUX
  2311. 2D83 8BE5 FIN_DEUX mov sp, bp
  2312. 2D85 5D pop bp
  2313. 2D86 C3 ret
  2314. AU COEUR DE TURBO PASCAL 346 AU COEUR DE TURBO PASCAL
  2315. 5 LE CODE COMPILE 5
  2316. 57 les appels de procédures $7
  2317. 2D87 B90600 PRINCI PAL mov cx, $0006
  2318. 2D8A E8FS5E1 call TU_STACK_CHECK
  2319. 2D8D E8EO0FF call DEUX
  2320. 2D90 E90000 jmp FIN
  2321. 2D93 33C0 FIN xor AXE
  2322. 2D95 E8A8DE call TU_HALT
  2323. Fig. 5.145 Le code du programme desassemble_appel_procedure.
  2324. Plaçons nous à l'endroit où le programme principal appelle la procédure (en $2D8D) et suivons le
  2325. déroulement de l’appel.
  2326. — initialement PC est égal à $2D8D et SP est égal à $FFFE
  2327. $00000
  2328. SYSTEME
  2329. $067B0 PSP et code de PROC.COM
  2330. PC= $2D8D
  2331. $068C1
  2332. $6FFFE | $0000 | SP= $FFFE
  2333. $70000 sommet de la mémoire vive 448K
  2334. SYSTEME
  2335. $FFFFF
  2336. Fig. 5.146 La mémoire avant l’appel
  2337. — l’appel en $2D8D pousse l’adresse de retour $2D90 sur la pile et transfère le contrôle à
  2338. r
  2339. adresse $2D70
  2340. $00000
  2341. SYSTEME
  2342. $067B0 PSP et code de PROC.COM
  2343. PC= $2D70
  2344. $068C1
  2345. $6FFFC $2D90 SP= $FFFC
  2346. : $6FFFE $0000
  2347. $70000 sommet de la mémoire vive 448K
  2348. SYSTEME
  2349. $FFFFF
  2350. Fig. 5.147 La mémoire avant l’appel
  2351. AU COEUR DE TURBO PASCAL 347 AU COEUR DE TURBO PASCAL
  2352. ==================== PAGE 23 ====================
  2353. 5 LE CODE COMPILE 5
  2354. 5.7 les appels de procédures 5.7
  2355. — en $2D70 la procédure:
  2356. — pousse BP
  2357. — place SP dans BP et pousse BP:
  2358. $00000
  2359. SYSTEME
  2360. $067B0 PSP et code de PROC.COM
  2361. PC= $2D74
  2362. $068C1
  2363. $6FFF8 $FFFA SP= $FFF8
  2364. $6FFFA BP_PREC
  2365. $6FFFC $2D90
  2366. $6FFFE $0000
  2367. $70000 sommet de la mémoire vive 448K
  2368. SYSTEME
  2369. $FFFFF
  2370. Fig. 5.148 La mémoire en $2D74
  2371. — les instructions de $2D77 à $2D80 sont exécutées
  2372. — pour retourner:
  2373. — en $2D83 SP prend la valeur contenue dans BP, ici $6FFA
  2374. — en $2D85, BP retrouve la valeur qu’il avait avant l’entrée dans cette procédure
  2375. — en $2D86 l'instruction RET dépile $2D90 et place cette valeur dans PC, ce qui constitue le
  2376. retour dans le programme principal
  2377. Notez que:
  2378. — le registre BP si soigneusement sauvegardé à l’entrée dans la procédure, et restauré avant le
  2379. retour, est utilisé pour gérer les données locales, comme nous allons le voir plus bas
  2380. — pour simplifier la gestion de la pile 8088 utilisée par certaines routines de la librairie, TURBO
  2381. préfère sauvegarder la valeur de SP et la restaurer avant le retour (plutôt que de faire
  2382. correspondre le nombre de PUSH avec le nombre de POP)
  2383. — il y a donc ici en tout 6 octets pour sauvegarder l’environnement (adresse de retour, BP et SP).
  2384. Avant l’appel de la procédure, en $2D8A, TURBO vérifie à l’aide de la routine
  2385. TU_STACK_CHECK qu'il reste au moins 6 octets de mémoire libre
  2386. — le saut en $2D6D permet de sauter le code de la procédure, qui est généré avant celui du
  2387. programme principal, compte tenu de la syntaxe PASCAL et de la compilation en une passe
  2388. — le saut entre le début et le corps de la procédure en $2D74 est prévu pour contourner les
  2389. éventuelles constantes typées de la procédure
  2390. AU COEUR DE TURBO PASCAL 348
  2391. AU COEUR DE TURBO PASCAL
  2392. 5 LE CODE COMPILE 5
  2393. 5.7 les appels de procédures 5.7
  2394. RESUME
  2395. L'appel d’une procédure est réalisé:
  2396. — en vérifiant que la pile contient assez de place pour accomoder la
  2397. procédure è
  2398. — en effectuant un CALL
  2399. Le code de la procédure comporte:
  2400. — les instructions de sauvegarde du contexte d’appel (ici PC et SP)
  2401. — la mise en place de la pile locale
  2402. — les instructions de la procédure
  2403. — la restauration du contexte de l’appel
  2404. {5.7.3 UNE PROCEDURE AVEC DES VARIABLES LOCALES
  2405. Voyons a présent comment sont gérées les variables locales.
  2406. Voici un programme avec des variables locales:
  2407. (* 001 locales *)
  2408. (* 28 avr 87 *)
  2409. ( * $ r+*
  2410. PROGRAM desassemble_procedure_avec_locales;
  2411. PROCEDURE deux;
  2412. VAR | entier: INTEGER;
  2413. l caractere: CHAR;
  2414. BEGIN
  2415. Lentier:= $77;
  2416. ! caractere:=’A’;
  2417. END;
  2418. BEGIN
  2419. deux;
  2420. END.
  2421. ee EE
  2422. DU B © D = © 10 00 AU B W D = ©
  2423. Fig. 5.149 Le programme desassemble_procedure_avec_locales.
  2424. Et voici le code correspondant:
  2425. AU COEUR DE TURBO PASCAL 349 AU COEUR DE TURBO PASCAL
  2426. ==================== PAGE 24 ====================
  2427. 5 LE CODE COMPILE sa LE CODE COMPILE 5
  2428. 5.7 les appels de procédures 5.7 0! a les appels de procédures 57
  2429. q
  2430. 2D4D E849DD call TU_PARAGRAPHS | $00000
  2431. 2D50 0600 hex 0600 ; options ; } SYSTEME
  2432. 2D52 7B06 hex 7B06 ; cs $067B0
  2433. 2D54 3F10 ÿ hex 3F10 ; ds 4 PSP et code de LOCALES.COM
  2434. 2D56 DBO2 hex DBO2 ; code q PC= $2D74
  2435. | 2D58 2700 hex 2700 ; globales q
  2436. 2D5A 0004 hex 0004 ; min piles j $068C1
  2437. 2D5C 00A0 hex OOAO ; max
  2438. 2D5E 1000 hex 1000 ; fichiers 7
  2439. 2D60 0000 hex 0000 ; input
  2440. 2D62 0000 hex 0000 ; output q
  2441. | 4
  2442. # $6FFF8 $FFFA SP= $FFF8
  2443. j 2D64 8BEC mov bp, sp 1 = $FFFA
  2444. j 2D66 E814DF call TU_TAILLE_CODE poset peti vias iis |b
  2445. 2D69 3E00 hex 3E00 ; taille À $6FFFE $0000
  2446. 2D6B 6D2D adr SAUT_PRINCI PAL 4 $70000 sommet de la mémoire vive 448K
  2447. | 2D6D E92600 SAUT_PRINCIPAL jmp PRINCIPAL À SFFFFF pee oy
  2448. | 2D70 55 DEUX push bp ‘
  2449. | 2D71 8BEC mov bp, sp ; F :
  2450. | 2D73 55 uae be 1 Fig. 5.151 La mémoire en $2D74
  2451. 7 2D74 E90000 jmp DEBUT _DEUX
  2452. | 2D77 83EC03 DEBUT_DEUX sub sp, $03 i — les variables locales vont être placées en SS:$FFF6 et SS:$FFF7 pour /_entier et en SS:$FFF5
  2453. q 2D7A B87700 mov ax, $0077 #4 poe
  2454. 2D7D 8946FC mov [bp+ $FC], ax ; | Pour éviter que ces données ne soient détruites par des appels subséquents de routines, le code
  2455. 2080 B841 00 ay we $004 1 1 déplace alors le sommet de la pile de 3 octets. C'est le résultat de l'instruction en $2D77.
  2456. | 2D83 B9000 mov cx, $0000 : itüdtions
  2457. | 2D86 BAFF00 po dx. $00FF À | Voilà alors la situation:
  2458. i 2D89 E8E8E1 call TU_RANGE_CHECK À j
  2459. ji 2D8C 8846FB mov [bp+ $FB], al 4 $00000
  2460. | | 2D8F E90000 jmp FIN_DEUX À SYSTEME
  2461. | | | ; $067B0
  2462. | | 2D92 8BES FIN_DEUX mov sp, bp 4 PSP et code de LOCALES.COM
  2463. | 2D94 5D pop bp | PC= $2D77
  2464. | 2D95 C3 ret \ |
  2465. i 4 068C1
  2466. | 2D96 B90900 PRINCIPAL mov cx, $0009 i *
  2467. | | 2D99 E8E6E1 call TU_STACK_CHECK q
  2468. 2D9C E8D1FF call LC_2D70 4 | S6FFFS SP= $FFFS
  2469. 1 2D9F E90000 jmp $2DA2 i )
  2470. q a $6FFF8 $FFFA
  2471. | 2DA2 33C0 LR_2DA2 xor ax, as a $6FFFA BP_PREC BP= $FFFA
  2472. 2DA4 E899DE call TU_HALT 4 S6FFFC $2D90
  2473. | } i $6FFFE $0000
  2474. i Fig. 5.150 Le code de desassemble_procedure_avec_locales. a $70000 sommet de la mémoire vive 448K
  2475. ! SYSTEME
  2476. i ‘ $FFFFF
  2477. || Nous voyons ici comment TURBO utilise la pile 8088 pour stocker les variables locales, en :
  2478. | . utilisant BP pour accéder à ces variables: À Fig. 5.152 La mémoire en $2D77
  2479. * — après la fin du prologue de la procédure, en $2D74, la mémoire a l’allure suivante: 4
  2480. AU COEUR DE TURBO PASCAL 350 AU COEUR DE TURBO PASCAL — AU COEUR DE TURBO PASCAL 351 AU COEUR DE TURBO PASCAL
  2481. ==================== PAGE 25 ====================
  2482. |
  2483. |
  2484. |
  2485. 5 LE CODE COMPILE ke
  2486. 517 les appels de procédures Sf
  2487. — pour stocker la premiére variable locale, qui est un entier et utilise 2 octets, TURBO utilise:
  2488. mov [BP+ $FFFC], ax
  2489. Comme BP a pour valeur $FFFA, et qu’il ne faut pas détruire la valeur de SP préservée sur la
  2490. pile, il faut donc reculer de 4 octets. pour stocker la variable. D'où le décalage de $FFFC par
  2491. rapport à BP: |
  2492. $00000
  2493. SYSTEME
  2494. $067B0
  2495. PSP et code de LOCALES.COM
  2496. PC= $2D80
  2497. $068C1
  2498. $6FFF5 SP= $FFF5
  2499. $6FFF6 $0077 Lentier à l'adresse [BP+ $F FFC]
  2500. $6FFF8 $FFFA
  2501. $6FFFA BP_PREC BP= $FFFA
  2502. $6FFFC $2D90
  2503. $6FFFE $0000
  2504. $70000 sommet de la mémoire vive 448K
  2505. SYSTEME
  2506. $FFFFF
  2507. Fig. 5.153 La mémoire après /_entier:= $77
  2508. — de façon similaire, la variable suivante sera placée à SS:$FFFS, soit [BP+ $FFFB]:
  2509. $00000
  2510. SYSTEME
  2511. $067B0
  2512. PSP et code de LOCALES.COM
  2513. PC= $2D8F
  2514. $068C1
  2515. “
  2516. $6FFF5 $61 | caractere à l'adresse [BP+ $FFFB]
  2517. $6FFF6 $0077 L_entier à l'adresse [BP+ $FFFC]
  2518. ri $FFFA
  2519. FFFA BP_PREC BP= $FFFA
  2520. $6FFFC $2D90 ‘
  2521. $6FFFE $0000
  2522. $70000 sommet de la mémoire vive 448K
  2523. SYSTEME
  2524. $FFFFF
  2525. Fig. 5.154 La mémoire après /_caractere:= ’A’
  2526. AU COEUR DE TURBO PASCAL 352 AU COEUR DE TURBO PASCAL
  2527. 5 LE CODE COMPILE 5
  2528. 5.7 les appels de procédures si
  2529. Notez que:
  2530. — avant l’appel, TURBO vérifie qu’il reste bien 9 octets sur la pile 8088 (6 octets pour le contexte
  2531. et 3 octets pour les variables locales)
  2532. — les variables locales sont placées sur la pile dans l’ordre où le compilateur les a rencontrées (la
  2533. dernière variable rencontrée est à la plus faible adresse) À
  2534. — lorsque le déplacement par rapport à BP est court, le code généré utilise le déplacement sur un
  2535. octet:
  2536. MOV [BP+ $FC], ax
  2537. RESUME
  2538. Les variables locales:
  2539. — sont situées sur la pile, après (plus près de zéro) l’environnement de
  2540. sauvegarde et d’accès de la procédure |
  2541. — sont accédées en utilisant BP avec des décalages négatifs
  2542. dernière variable locale <--- SP
  2543. variable locale2
  2544. première variable locale [BP+ $FFFD]
  2545. valeur du BP actuel
  2546. valeur du BP de l’appelant <--- BP
  2547. adresse de retour
  2548. (5.74 UNE CHAINE D’APPELS
  2549. Voici par conséquent comment se fait une suite d’appels de procédures:
  2550. (* 001 appch *)
  2551. (* 29 avr 87 *)
  2552. (*$r+*
  2553. PROGRAM appel_chaine;
  2554. PROCEDURE deux;
  2555. VAR ! locale_2]: INTEGER;
  2556. | Tocale_22: INTEGER;
  2557. 00 JAN Un B W D = ©
  2558. AU COEUR DE TURBO PASCAL
  2559. AU COEUR DE TURBO PASCAL 353
  2560. ==================== PAGE 26 ====================
  2561. LE CODE COMPILE 5
  2562. 5 LE CODE COMPILE 5
  2563. 5.7 les appels de procédures 5.7 = eS SS eee a2
  2564. p77 83EC04 DEBUT_DEUX sub sp, $04
  2565. 9 BEGIN (* deux *) 2D7A B82211 mov ax, $1122
  2566. 10 1 locale_21:= $1122; 2D7D 8946FC mov [bp+ $FC], ax
  2567. 11 E locale 22:= $2222; 2D80 B82222 mov ax, $2222
  2568. 12 WRITELN; | 2D83 8946FA mov [bp+ SFA], ax
  2569. 7 END; (* deux *) { 2D86 one reek TU_WRITE_DEFAUT
  2570. 8B3F TU_WRITE
  2571. | 15 PROCEDURE rrois; ÿ 2D89 Essia. de haat bill
  2572. 16 VAR 1 locale 3: INTEGER; 1 2D8C Ed : woo
  2573. 17 BEGIN (* trols *) nr on i
  2574. 18 | locale_3:= $3333; i 2D92 8BE5 FIN_DEUX mov sp, bp
  2575. 19 de | 2D94 5D pop bp
  2576. ! 20 END; (* trois *) 2D95 C3 ret
  2577. j 21 |
  2578. 22 PROCEDURE quatre; TROIS h
  2579. 23 VAR | locale_4: INTEGER; 1 4 FRE] ps +p sp
  2580. 24 BEGIN (* quatre *) É 2D99 55 push bp
  2581. 25 l_locale_4:= $4444; : 2D9A E90000 jmp DEBUT_TROIS
  2582. 26 trois; i
  2583. | 4 END; (* quatre *) j 2D9D 4C DEBUT_TROIS dec sp
  2584. Aye» ¥ 2D9E 4C dec s
  2585. | 29 BEGIN (* principal *) À 2D9F B83333 mov ba $3333
  2586. | 30 ig | 2DA2 8946FC mov [bp+ $FC], ax
  2587. | 31 END. (* principal *) ; 2DAS B90A00 mov cx, $000A
  2588. | Fig. 5.155 Le programme appel_chaine. \ A ped coll onal ere
  2589. 1 \ 2DAE E90000 jmp FIN_TROIS
  2590. À B1 8BES FIN_TROIS 5
  2591. Voici le code de ce programme: | = Pe ce pr a bp
  2592. | 1 2DB4 C3 ret
  2593. 2D4D E849DD call TU_PARAGRAPHS | 2DB5 55 ATRE h
  2594. | 2D50 0600 hex 0600 ; options D 2DB6 8BEC pa Lotus mi sp
  2595. | 2D52 bas pin pe pe ; > 2DB8 55 push bp
  2596. 2D54 ex LOS i 1
  2597. peepee “he sa DF02 : code ‘ 2DB9 E90000 jmp DEBUT_QUATRE
  2598. 2 2D58 2700 hex 700 ; globales Y 2DBC 4C DEBUT_QUATRE
  2599. | 2D5A 0004 hex 0004 ; min piles 4 2DBD 4C -Q de $
  2600. | 2D5C, 00A0 hex 00A0 ; max piles 2DBE B84444 mov ax, $4444
  2601. | 2D5E 1000 hex 1000 ; fichiers À 2DC1 8946FC mov [bp+ $FC], ax
  2602. | 2D60 0000 hex 0000 ; input } 2DC4 B90800 mov cx, $0008
  2603. | 2D62 0000 « hex 0000 ; output 2DC7 E8B8E1 call TU_STACK_CHEXK
  2604. | one ais ate a \ 22 E8C9FF call TROIS
  2605. | , ‘4 j
  2606. | Dé D te TU TAILLE. cove | E90000 jmp FIN_QUATRE
  2607. | 2D69 7C00 hex 7 ; taille | 2DD0 8BES FIN_QUATRE
  2608. | 2D6B 6D2D adr SAUT_PRINCIPAL ( 2DD2 sD QU yy
  2609. | 2
  2610. I 2D6D E90000 SAUT_PRINCIPAL jmp PRINCIPAL 4 Dom Ge ao
  2611. i) | 2DD4 B90800 PRINCIPAL mov cx, $0008
  2612. I 2D70 55 DEUX keg DR 4 2DD7 E8A8E1 call TU_STAK_CHEK
  2613. ik 2D71 8BEC Eh de sp \ 2DDA E8D8FF call QUATRE
  2614. ! 2D73 55 pri Pp 4 2DDD E90000 jmp FIN
  2615. il 2D74 E90000 jmp DEBUT _DEUX '
  2616. ll 1 ( 2DE0 33C0 FIN xor ax lex
  2617. | | 2DE2 E85BDE call TU_HALT
  2618. 2DE5 0000 hex 0000
  2619. { Fig. 5.156 Le code du programme appel_chaine.
  2620. AU COEUR DE TURBO PASCAL 354 AU COEUR DE TURBO PASCAL l AU COEUR DE TURBO PASCAL 355 AU COEUR DE TURBO PASCAL
  2621. ==================== PAGE 27 ====================
  2622. pl 5 LE CODE COMPILE 5
  2623. 5.7 les appels de procédures 57 LE CODE COMPILE 5
  2624. 7 les appels de procédures a
  2625. Wn
  2626. Ce programme ne fait que généraliser ce que nous avions vu pour l’appel d’une procédure avec des Notez que:
  2627. variables locales. otez que:
  2628. — la figure est incomplète car nous n’avons pas représenté les zones de la procédure
  2629. D po dde ahs. entier_hexadécimal et affiche_octet_hexadécimale, qui ant situées
  2630. j 1 à : 5 À au-dessus des zones de deux
  2631. — avant l'appel, TURBO vérifie que la pile 8088 dispose d’assez de place, en tenant compte de la : — les adresses de retour dans le programme principal ou dans quatre ou trois ne correspondent
  2632. | place occupée par les variables locales ‘ s à :
  2633. — après l’appel, TURBO protège les locales en déplaçant au-delà d’elles le sommet de la pile | pas à celle du désassemblage, car nous avons inséré les procédures d'affichage de la pile 8088
  2634. 8088. Ceci a lieu même dans deux, car deux peut appeler des routines de la librairie (qui
  2635. appelleront éventuellement des routines de MS-DOS ou du BIOS), et risqueraient par
  2636. conséquent d’écraser les locales de deux.
  2637. | {5.7.5 APPELS EMBOITES
  2638. ! Si nous incorporons dans ce programme la procédure d'affichage du contenu de la mémoire, et que
  2639. nous remplaçons le WRITELN de la procédure deux par: | pre de pu PASCAL sont emboîtées les unes dans les autres, la procédure la plus
  2640. affiche_memoire(SSEG, ofs(l_locale_22), $FFFF); profondément nichée peut utiliser les variables locales de toutes les procédures qui l’englobent.
  2641. | À ‘ Voici un exemple:
  2642. alors nous pourrons examiner le contenu de la pile 8088: P
  2643. Notez en particulier que: . |
  2644. | 1 0 (*001 visib *)
  2645. 1 * 22 *
  2646. $9000:SFFEO ger $22 $22 822 SUE I j } Corner
  2647. $9000:$FFE8 SEA $FF $F Bl +. QA 0 ] PR Pa
  2648. $9000, SEFFO $ $FF $ $FF $D0 $30 par nee are | dr er
  2649. $9000:$FF F2 FA 1 LE ;
  2650. i $9000: $FFFO $44 $44 : DD é PÉEGIN a
  2651. $9000:$FFF8 $FA $FF $FE $FF $15 $32 SUM a any 2 7 END; (* deux *)
  2652. $9000: $FFF8 $00 $00 : aR 8 '
  2653. | i " PROCEDURE rois;
  2654. | Fig. 5.157 Le contenu de la pile 8088 | DEL in ae atoning
  2655. a) l 13 PROCEDURE cinq;
  2656. iM ‘ i BEGIN (* cing *)
  2657. i i :(* cing *
  2658. a) Nous apercevons: à 14 END; (* cinq *)
  2659. 17 *
  2660. _ de SS:$FFFE à SS:$FFFF l'adresse de retour à MS-DOS (via l'instruction INT $20 placée par 18 ENGI rt
  2661. nee “ri le of 4 19 ;
  2662. | — de SS:$FFF6 à SS:$FFFD la zone utilisée par quatre \ 20 fue
  2663. | — de SS:$FFEE à SS:$FFFS la zone utilisée par trois 1 21 ah hese
  2664. iW — de SS:$FFE4 à SS:$FFED la zone utilisée par deux iq 22 END; (* six *)
  2665. | ‘à 23
  2666. | À 24 BEGIN (* trois *)
  2667. | i +(* ic *
  2668. | Chaque procédure utilise bien une zone comportant: : 26 sce tre he
  2669. if à ‘abl \ 11 27 PROCEDURE sepr;
  2670. dernière variable locale ne 4 BEGIN (* sept *)
  2671. Il deuxième variable locale 1 30 ro al
  2672. i} première variable locale (À 31 BEGIN (* principal *)
  2673. D. nn || 32 END. (* principal *)
  2674. sauvegarde du BP actuel ;
  2675. sauvegarde du BP de l'appelant à Fig. 5.158 Le programme visibilite.
  2676. adresse de retour i
  2677. AU PORE aa mre FAREAL +54 AU COEUR DE TURBO PASCAB AG AU COEUR DE TURBO PASCAL 357 AU COEUR DE TURBO PASCAL
  2678. ==================== PAGE 28 ====================
  2679. | 5 LE CODE COMPILE 5 LE CODE COMPILE 5
  2680. | 5.7 les appels de procédures 5.7 les appels de procédures 57
  2681. Il ne faut donc pas confondre: PROCEDURE quatre;
  2682. | À \ VAR | locale_4: INTEGER;
  2683. — la chaîne des appels (qui est un phénomène lié à l’exécution) BEGIN (* quatre *)
  2684. / — l’emboitement (qui est lié à la structure statique du programme) sn
  2685. | — la possibilité d’appeler une procédure (qui est lié à l’emboîtement ET à la position, à cause de
  2686. | la compilation en une passe)
  2687. | locale_4:= $4444;
  2688. 1 locale_3:= $3333;
  2689. [locale~2:= $2222:
  2690. globale:= $1111;
  2691. Dans notre exemple: END; (* quatre *)
  2692. | — la chaîne d’appel est principal -> sept -> trois -> quatre -> cing | 22: BEGIN (* trois *)
  2693. — six et deux ne figurent pas dans cette chaine 3 quatre;
  2694. | AI 24 END; (* trois *)
  2695. il — cing est emboitée dans quatre, dans trois et dans principal | 25
  2696. C PAU | 26 BEGIN (* deux *)
  2697. | — sept figure dans la chaîne d’appel mais cing ne peut accéder à ses données q 27 trois;
  2698. | } ; ; À 28 END; (* deux *)
  2699. | — sept peut appeler deux, mais deux ne peut appeler sept car le compilateur n’a pas encore 4 29
  2700. | rencontré la déclaration de sept lorsqu'il compile deux (nous pourrions bien sûr utiliser une | 30 BEGIN (* principal *)
  2701. déclaration FORWARD qui permet de traiter le cas des procédures qui s'appellent l’une 31 deux:
  2702. l’autre) À 32 END. (* principal *)
  2703. Fig. 5.159 Le programme appel_emboite.
  2704. Les données auxquelles a accès une procédure appartiennent nécessairement à des procédures M
  2705. figurant dans la chaîne d’appel (quatre, trois et principal figurent bien dans la chaîne d’appel de
  2706. cing). L'inverse n’est pas vrai: une procédure n’a pas accès aux données des procédures figurant M Et voici le code généré:
  2707. il dans la chaîne d’appel qui ne l’englobent pas (cing ne peut pas accéder aux données de sept). }
  2708. 2D4D E849DD call TU_PARAGRAPHS
  2709. | 2D50 0600 h à :
  2710. A chaque appel de procédure correspond une zone locale sur la pile 8088. Pour accéder à des 2D52 7B06 Les ee : a’ bit
  2711. données englobantes il aurait été possible de remonter la suite des zones locales, en paramétrant M 2D54 3F10 hex 3F10 ; ds
  2712. soigneusement ces remontées. j 2D56 E002 hex E002 ; code
  2713. À 2D58 2700 he 27 ;
  2714. TURBO a préféré utiliser une autre technique qui place dans chaque zone locale une table 2D5A 0004 ya uns 4 Sie ated
  2715. contenant l’adresse des zones englobantes. 4 2D5C 00A0 hex 00A0 : max piles
  2716. : 2DSE 1000 hex 1000 ; fichiers
  2717. k aH Fe hex 0000 ; input
  2718. 1 h i
  2719. Voici un programme avec des procédures emboitées: Y x ee nn
  2720. it q 2D64 8BEC mov bp, sp
  2721. | À 1 2D66 E814DF call TU_TAILLE_CODE
  2722. | 0 (* 001 appemb *) | 2D69 8700 hex 8700 ; taille
  2723. | : (* 29 avr 87 *) f 2D6B 6D2D adr SAUT_PRINCI PAL
  2724. | 3 (*$r+*) a 2D6D E96F00 SAUT_PRINCIPAL j PRI P
  2725. | 4 PROGRAM appel _emboite; 4 ‘i am Bae,
  2726. i) 5 VAR globale: INTEGER; 2D70 55 DEUX push bp
  2727. | 6 4 2D71 8BEC mov bp, sp
  2728. 7 PROCEDURE deux; a 2D73 53 push bp
  2729. | : VAR | _locale_2: INTEGER; à 2D74 E95600 jmp DEBUT_DEUX
  2730. | 10 PROCEDURE trois; | 2D77 55 TROIS push bp
  2731. 11 VAR !_locale_3: INTEGER; 4 ‘ 2D78 8BC4 mov ax, Sp
  2732. 12 | 2D7A FF76FE push [bp+ $FE]
  2733. | 2D7D 8BE8 mov bp, ax
  2734. | ' 2D7F 55 push p
  2735. | ‘4 2D80 E93800 jmp DEBUT_TROIS
  2736. . AU COEUR DE TURBO PASCAL 358 AU COEUR DE TURBO PASCAL 1 AU COEUR DE TURBO PASCAL 359 AU COEUR DE TURBO PASCAL
  2737. ==================== PAGE 29 ====================
  2738. 5 LE CODE COMPILE 5s 5 LE CODE COMPILE 5
  2739. 5.7 les appels de procédures SF ‘ 5.7 les appels de procédures 5.7
  2740. 2D83 55 ATRE ush b | 2DDF B90800 PRINCIPAL mov cx, $0008
  2741. 2D84 8BC4 7 Lier re + Sp À 2DE2 E89DE1 call TU_STACK_CHECK
  2742. 2D86 FF76FE push [bp+ $FE] \ 2DE5 E888FF call ‘DEUX
  2743. 2D89 FF76FC Ms ; push [bp+ $FC] i 2DE8 E90000 jmp FIN
  2744. bp, 4
  2745. att ss pea he aii | 2DEB 33C0 FIN xor ax, ax
  2746. 2D8F £90000 jmp DEBUT_QUATRE 1 2DED E850DE call TU_HALT
  2747. | 2D92 4C DEBUT_QUATRE ui sp | Fig. 5.160 Le code du programme appel_emboite.
  2748. | 2D93 4C dec sp i
  2749. [ 2D94 B84444 mov ax, $4444 4 1 j
  2750. Î 2D97 8946F8 mov [bp+ $F8], ax À Voici comment se déroule l’appel de quatre:
  2751. | 2D9A B83333 mov ax, $3333 — en $2DC3, trois appelle quatre
  2752. | 2D9D 8B5EFC mov bx, [bp+ $FC] - en $2D83, quatre prépare le changement de contexte:
  2753. ath nan ib E | en $2D83 la valeur de BP utilisée par trois est sauvée sur la pile
  2754. PERTE ne On SEW a » — en $2D84 SP est temporairement sauvé dans AX
  2755. 2DA4 B82222 mov ax, $2222 ; — en $2D86 et $2D89 la table des accès de trois est recopiée dans la zone de quatre
  2756. 2DA7 8BSEFE ay bx, [bp+ $FE] À — en $2D8C BP pointe vers le début de la table des accès
  2757. 2DAA 36 seg $s À — en tr à em ns d de BP est ajoutée à la table, au cas où une procédure cing aurait à
  2758. | recopier la table de quatre
  2759. pele bi ent Lt AMbig À — en $2D8F le contournement des constantes typées éventuelles
  2760. 2DAE B81111 mov ax, $1111 4 — en $2D92 et $2D93 l'allocation des 2 octets nécessaires à la variable locale de quatre
  2761. rs ect bre (90263210 1 me nur widow me la table des accès aux procédures qui l’englobent. Au début de
  2762. . i, chaque procédure la table de la procédure immédiatement englobante est recopiée, et
  2763. 2084 90000 Jmp FAALQUATRE | complétée par le BP de la procédure, pour préparer la copie éventuelle par une su
  2764. 2DB7 8BES FIN_QUATRE mov sp, bp emboitée.
  2765. | 2DB9 5D pop bp 3 s 1
  2766. 2DBA C3 ret chématiquement nous avons donc:
  2767. | 2DBB 4C DEBUT_TROIS dec sp q
  2768. 2DBC 4C dec sp }
  2769. 2DBD B90C00 mov cx, $000C |
  2770. 2DC0 E8BFE1 call TU_STACK_CHECK |
  2771. 2DC3 E8BDFF call QUATRE (À
  2772. 2DC6 E90000 jmp FIN_TROIS i
  2773. 2DC9 8BES FIN_TROIS mov sp, bp
  2774. 2DCB 5D pop bp ‘4
  2775. 20 C3 ret i
  2776. | 2DCD 4C DEBUT_DEUX dec sp 4
  2777. | 2DCE 4C dec sp i
  2778. 2DCF B90A00 mov cx, $000A a
  2779. 2DD2 E8ADE1 call TU_STACK_CHECK a
  2780. I! 2DD5 E89FFF call TROIS 1
  2781. | 2DD8 E90000 jmp FIN_DEUX À
  2782. || 2DDB 8BES FIN_DEUX mov sp, bp |
  2783. if 2DDD 5D pop bp ;
  2784. | 2DDE C3 ret
  2785. ==================== PAGE 30 ====================
  2786. 5 LE CODE COMPILE 5
  2787. a3 les appels de procédures ST
  2788. $00000
  2789. SYSTEME
  2790. $067B0
  2791. PSP et code de PROC.COM
  2792. PC= $2D94
  2793. $068C1
  2794. $6FFEO $4444 | locale_4 SP= $FFEO
  2795. $6FFE2 $FFE8 BP de quatre
  2796. $6FFE4 $FFF2 BP de trois
  2797. $6FFE6 $FFFA BP de deux
  2798. $6FFE8 $FF2F BP de trois BP= $FFE8
  2799. $6FFEA $30E9 retour dans trois
  2800. $6FFEC $3333 | locale_3
  2801. $6FFEE $FFF2 BP de trois
  2802. $6FFFO $FFFA BP de deux
  2803. $6FFF2 $FFFA BP de deux
  2804. $6FFF4 $30FB retour dans deux
  2805. $6FFF6 $2222 | locale_2
  2806. $6FFF8 $FFFA BP de deux
  2807. $6FFFA $FFFE BP de principal
  2808. $6FFFC $3199 retour dans principal
  2809. $6FFFE $0000 retour 4 MS-DOS
  2810. $70000 sommet de la mémoire vive 448K
  2811. SYSTEME
  2812. $FFFFF
  2813. Fig. 5.161 La mémoire en $2D94
  2814. Ces tables d’accés sont alors utilisées pour accéder aux données des procédures englobantes.
  2815. Dans le cas de quatre, la zone locale comporte donc $0C octets (l’adresse de retour, les 4
  2816. valeurs de BP et la variable locale). Par rapport à la valeur de BP, la première variable locale
  2817. est donc décalée de $08 octets (par conséquent elle sera accédée par [BP+ $FFF8]
  2818. — en $2D94 et $2D97 nous affectons $4444 à la variable locale de quatre. Cette affectation se fait
  2819. donc par rapport à BP:
  2820. mov [BP+ $F8], ax
  2821. — de $2D9A à $2DA1 nous traitons la variable englobante /_locale_3:
  2822. — le BP de trois est placé dans BX (la valeur de ce BP est située dans la table des accès de
  2823. quatre, 4 octets plus haut, donc à [BP+ $FC])
  2824. — | locale _3 est située dans la zone de trois, à 6 octets du BP de trois (donc accessible par
  2825. (BX+ $FA])
  2826. AU COEUR DE TURBO PASCAL 362 AU COEUR DE TURBO PASCAL
  2827. 5 LE CODE COMPILE 5
  2828. S77 les appels de procédures 67
  2829. ~— même chose pour / locale 2:
  2830. — le BP de deux est placé dans BX (la valeur de ce BP est situé dans la table des accès de
  2831. quatre, 2 octets plus haut, donc à [BP+ $FE])
  2832. — |_locale_2 est située dans la zone de deux, à 4 octets du BP de deux (donc accédée par
  2833. [BX+ $FC])
  2834. — en $2DAE et $2DB1 nous affectons une valeur à une variable globale, en utilisant DS
  2835. comme d’habitude
  2836. Notez que:
  2837. — avant chaque appel, le code teste si la pile a assez de place pour la zone locale de la
  2838. procédure appelée.
  2839. Ainsi en $2DBD, trois vérifie que la pile 8088 a au moins $0C octets pour la zone locale de
  2840. quatre.
  2841. Pour le retour, le code reste le méme:
  2842. — SP pointe le BP de la procédure qui a appelé
  2843. — POP BP permet de restaurer BP vers la pile de l’appelant
  2844. — RET récupère le PC de l’appel
  2845. Si nous ajoutons la procédure d’affichage mémoire, et plagons dans quatre l'appel:
  2846. affiche_memoire(SSEG, OFS(l_locale_4), $FFFF);
  2847. nous obtiendrons:
  2848. $6000:$FFEO $44 $44 $E8 $FF $F2 $FF $FA $FF :DD ED UE
  2849. $6000:S$FFE8 $F2 $FF $E9 $30 .0
  2850. $6000 : $FFE8 $33 $33 $F2 $FF : 39).
  2851. $6000:$FFFO $FA $FF $FA $FF $FB $30 big atta 0
  2852. $6000: $FFFO $22 522 : Ji
  2853. $6000:$FFF8 $FA $FF $FE $FF $99 $31 NSE CH 1
  2854. $6000: $FFF8 $00 $00 :
  2855. Fig. 5.162 Les zones locales sur la pile 8088
  2856. AU COEUR DE TURBO PASCAL 363
  2857. AU COEUR DE TURBO PASCAL
  2858. ==================== PAGE 31 ====================
  2859. 5 LE CODE COMPILE 5
  2860. 5.7 les appels de procédures 5.7
  2861. RESUME
  2862. Dans chaque pile locale nous avons:
  2863. la derniére variable locale <--- SP
  2864. la deuxième variable locale
  2865. ‘| la première variable locale
  2866. la valeur de BP actuelle
  2867. la valeur de BP de la procédure englobante
  2868. la valeur de BP de la premiére procédure
  2869. la valeur de BP de l’appelant <--- BP
  2870. | l’adresse de retour
  2871. Lorsque la procédure est la dernière de la chaîne de l'appel, SP pointe la
  2872. dernière variable locale, et BP pointe la valeur de BP de l’appelant.
  2873. 1 { 5.7.6 LES PARAMETRES VALEUR ET VARIABLE
  2874. Voici à présent une procédure comportant des paramètres valeur et variable:
  2875. 0 (*001 varvall *)
  2876. 1}! (22 jan 87 *)
  2877. 2
  2878. 3" (8r+*)
  2879. 4 PROGRAM desassemble parametres;
  2880. 5 VAR globalel, globale2, globale3, globale4: INTEGER;
  2881. 6
  2882. 7 PROCEDURE deux(p1, p2: INTEGER; VAR pv3, pv4: INTEGER);
  2883. 8 BEGIN (* deux *)
  2884. 9 pl:= $1111; p2:= $2222;
  2885. | 10 pv3:= $3333; pv4:= $4444;
  2886. | 11 END; (* deux *)
  2887. 12
  2888. Hy 13 BEGIN
  2889. 14 deux($AAAA, $BBBB, globale2, globale4);
  2890. 15 END.
  2891. | Fig. 5.163 Le programme desassemble_parametres.
  2892. AU COEUR DE TURBO PASCAL 364
  2893. AU COEUR DE TURBO PASCAL
  2894. 5 LE CODE COMPILE 5
  2895. 5.7 les appels de procédures Sa
  2896. Voici le code généré:
  2897. 2D4D E849DD call TU_PARAGRAPHS
  2898. 2D50 0600 hex 0600 ; options
  2899. 2D52 780B hex 780B ; cs
  2900. 2D54 3C15 hex 3C15.::11d8
  2901. 2D56 DDO02 hex DDO2 ; code
  2902. 2D58 2700 hex 2700 ; globales
  2903. 2D5A 0004 hex 0004 ; min piles
  2904. 2D5C 00A0 hex OOAO ; max piles
  2905. 2D5E 1000 hex 1000 ; fichiers
  2906. 2D60 0000 hex 0000 ; input
  2907. 2D62 0000 hex 0000 ; output
  2908. 2D64 8BEC mov bp, sp
  2909. 2D66 E814DF call TU_TAILLE_CODE
  2910. 2D69 5800 hex 5800 ; taille
  2911. 2D6B 6D2D adr SAUT_PRINCI PAL
  2912. 2D6D E90000 SAUT_PRINCIPAL jmp PRINCI PAL
  2913. 2D70 55 DEUX push bp
  2914. 2D71 8BEC mov bp, sp
  2915. 2D73 55 push bp
  2916. 2D74 E90000 jmp DEBUT_DEUX
  2917. 2D77 B81111 DEBUT _DEUX mov Ad 93111
  2918. 2D7A 89460E mov [bp+ $0E], ax
  2919. 2D7D B82222 mov ax; $2222
  2920. 2D80 89460C mov [bp+ $0C], ax
  2921. 2D83 C47E08 les di, [bp+ $08]
  2922. 2D86 B83333 mov ax, $3333
  2923. 2D89 26 seg es
  2924. 2D8A 8905 mov (di Jt ax
  2925. 2D8C C47E04 les di, [bp+ $04]
  2926. 2D8F B84444 mov ax, $4444
  2927. 2D92 26 seg es
  2928. 2D93 8905 mov Las), ax
  2929. 2D95 E90000 jmp FIN_DEUX
  2930. 2D98 8BE5 FIN_DEUX mov sp, bp
  2931. 2D9A SD pop bp
  2932. 2D9B C20C00 ret 000C ; intra
  2933. AU COEUR DE TURBO PASCAL 365 AU COEUR DE TURBO PASCAL
  2934. ==================== PAGE 32 ====================
  2935. |
  2936. 5 LE CODE COMPILE
  2937. 5.7 les appels de procédures
  2938. 2D9E B91200 PRINCIPAL mov cx, $0012
  2939. 2DA1 E8DEE1 call TU_STACK_CHECK
  2940. 2DA4 B8AAAA mov ax, $AAAA
  2941. 2DA7 50 4 push ax
  2942. 2DA8 B8BBBB mov ax, $BBBB
  2943. 2DAB 50 push ax
  2944. 2DAC BF6402 mov di, $0264
  2945. 2DAF 1E push ds
  2946. 2DB0 57 push di
  2947. 2DB1 BF6802 mov di, $0268
  2948. 2DB4 1E push ds
  2949. 2DBS 57 push di
  2950. 2DB6 E8B7FF call DEUX
  2951. 2DB9 E90000 jmp FIN
  2952. ‘2DBC 33C0 FIN xor AX, AX
  2953. 2DBE E87FDE call TU_HALT
  2954. 2DC1 0000 hex 0000
  2955. Fig. 5.164 Le code du programme desassemble_parametres.
  2956. Notez que:
  2957. — au moment de l’appel:
  2958. — le code vérifie si la pile dispose bien de $12 octets (6 pour l’environnement, 2*2 pour les
  2959. paramètres valeur, 2*4 pour les paramètres variable)
  2960. — pousse la valeur des paramètres valeur sur la pile
  2961. — pousse l'adresse des paramètres variable sur la pile
  2962. — la procédure appelée:
  2963. — met en place son environnement comme d’habitude (ici sauvegarde du BP de l’appelant et
  2964. du BP actuel). La situation est alors la suivante:
  2965. AU COEUR DE TURBO PASCAL 366 AU COEUR DE TURBO PASCAL
  2966. #
  2967. i
  2968. LE CODE COMPILE 5
  2969. les appels de procédures ST
  2970. $00000
  2971. SYSTEME
  2972. $067B0
  2973. PSP et code de PROC.COM 5
  2974. PC= $2D77
  2975. $068C1
  2976. $6FFEC $FFEE BP de deux SP= $FFEC
  2977. $6FFEE $FFFE BP de principal BP= $FFEE
  2978. $6FFFO $2DB9 retour dans principal
  2979. $6FFF2 $0268 décalage de globale4
  2980. $6FFF4 $19F3 segment de globale4
  2981. $6FFF6 $0266 décalage de globale3
  2982. $6FFF8 $19F3 segment de globale3
  2983. $6FFFA $BBBB valeur de globale2
  2984. $6FFFC $AAAA valeur de globalel
  2985. $6FFFE $0000 retour à MS-DOS
  2986. $70000 sommet de la mémoire vive 448K
  2987. SYSTEME
  2988. $FFFFF
  2989. Fig. 5.165 La mémoire en $2D77
  2990. — Les paramètres se trouvent donc sous l’environnement local. Le premier octet des
  2991. paramètres se trouve après le BP du programme appelant, et après l’adresse de retour, donc
  2992. à BP+ 4.
  2993. Par conséquent, pour accéder au premier paramètre valeur, le code utilisera:
  2994. MOV AX, [BP+ $0E]
  2995. En effet ce paramètre se trouve après les 2 paramètres variable (8 octets) et après le second
  2996. paramètre valeur (2 octets). En tout 4+ 8+ 2.
  2997. — pour accéder au paramètre valeur, il suffit de charger son adresse dans ES et DI. Ainsi pour
  2998. le premier paramètre variable (situé avant le second paramètre variable), nous utilisons:
  2999. LES DI, [BP+ $08]
  3000. AU COEUR DE TURBO PASCAL
  3001. 367 AU COEUR DE TURBO PASCAL
  3002. ==================== PAGE 33 ====================
  3003. 5 LE CODE COMPILE
  3004. kW à les appels de procédures
  3005. | Voici pour terminer un appel en utilisant comme paramètres des variables intermédiaires:
  3006. 0 (*001 param2 *)
  3007. 1 (* 22 jan 87 *)
  3008. 2
  3009. 2 Tnt")
  3010. 4 PROGRAM desassemble_parametre2;
  3011. 5
  3012. 6 PROCEDURE deux;
  3013. Û VAR localel, locale2: INTEGER;
  3014. ' à PROCEDURE trois;
  3015. 1
  3016. 11 PROCEDURE quatre(p: INTEGER; VAR pv: INTEGER);
  3017. 12 BEGIN (* quatre *)
  3018. 13 p:= $1111;
  3019. 14 pv:= $2222;
  3020. 15 END; (* quatre *)
  3021. | 16
  3022. ; 17 BEGIN (* trois *)
  3023. | 18 quatre(localel, locale2);
  3024. 19 END; (* trois *)
  3025. 20
  3026. 21 BEGIN (* deux *)
  3027. 22 END; (* deux *)
  3028. 23
  3029. 24 BEGIN (* principal *)
  3030. 25 END. (* END *)
  3031. | Fig. 5.166 Le programme desassemble_parametre2.
  3032. | Voici le code généré:
  3033. 2D4D. E849DD call TU_PARAGRAPHS
  3034. 2D50 0600 hex 0600 ; options
  3035. | 2D52 780B hex 780B : ¢s
  3036. | 2D54 3C15 hex 3GIS Ad's
  3037. | 2D56 DE02 hex DEO02 ; code
  3038. | 2D58 2700 hex 2700 ; globales
  3039. | 2D5A 0004 hex 0004 ; min piles
  3040. | 2D5C 00A0 hex QOAO ; max piles
  3041. | 2D5E 1000 hex 1000 ; fichiers
  3042. | 2D60 0000 hex 0000 ; input
  3043. | 2D62 0000 hex 0000 ; output
  3044. | 2D64 8BEC mov bp, sp
  3045. 2D66 E814DF call TU_TAILLE_CODE
  3046. | 2D69 7400 hex 7400 ; taille
  3047. I 2D6B 6D2D adr SAUT_PRINCI PAL
  3048. |
  3049. Il
  3050. i
  3051. if
  3052. AU COEUR DE TURBO PASCAL 368 AU COEUR DE TURBO PASCAL A
  3053. 5 LE CODE COMPILE §
  3054. 5.7 les appels de procédures sh
  3055. 2D6D E90000 SAUT_PRINCIPAL jmp PRINCI PAL
  3056. 2D70 55 DEUX push bp
  3057. 2D71 8BEC mov bp, sp
  3058. 2D73 52 push bp
  3059. 2D74 E95400 jmp DEBUT _DEUX
  3060. 2D77, 54 TROIS push bp
  3061. 2D78 8BC4 mov ax, sp
  3062. 2D7A FF76FE push [bp+ $FE]
  3063. 2D7D 8BE8 mov bp, ax
  3064. 2D7E 59 push bp
  3065. 2D80 E92700 jmp DEBUT_TROIS
  3066. 2D83 55 QUATRE push bp
  3067. 2D84 8BC4 mov ax, wl
  3068. 2D86 FF76FE push [bp+ $FE]
  3069. 2D89 FF76FC push [bp+ $FC]
  3070. 2D8C 8BE8 mov bp, ax
  3071. 2D8E 55 push bp
  3072. 2D8F E90000 jmp DEBUT_QUATRE
  3073. 2D92 B81111 DEBUT_QUATRE mov ax, $1111
  3074. 2D95 894608 mov [bp+ $08], ax
  3075. 2D98 C47E04 les di, [bp+ $04]
  3076. 2D9B B82222 mov ax, $2222
  3077. 2D9E 26 seg es
  3078. 2D9F 8905 mov [di], ax
  3079. 2DA1 E90000 jmp FIN_QUATRE
  3080. 2DA4 8BES FIN_QUATRE mov sp, bp
  3081. 2DA6 5D pop bp
  3082. 2DA7 C20600 ret 0006 ; intra
  3083. 2DAA B91000 DEBUT_TROIS mov cx, $0010
  3084. 2DAD E8D2E1 call TU_STACK_CHECK
  3085. 2DB0 8B5EFE mov bx, [bp+ $FE]
  3086. 2DB3 36 seg ss
  3087. 2DB4 8B47FC mov ax, [bx+ $FC]
  3088. 2DB7 50 push ax
  3089. 2DB8 8BSEFE mov bx, [bp+ $FE]
  3090. 2DBB 36 seg ss
  3091. 2DBC 8D7FFA lea di, [bx+ $FA]
  3092. 2DBF 16 push ss
  3093. 2DC0 57 push di
  3094. 2DC1 E8BFFF call LC_2D83
  3095. 2DC4 E90000 jmp FIN_TROIS
  3096. 2DC7 8BES FIN_TROIS mov sp, bp
  3097. 2DC9 5D pop bp
  3098. 2DCA C3 ret
  3099. 2DCB 83EC04 DEBUT _DEUX sub sp, $04
  3100. 2DCE E90000 jmp FIN_DEUX
  3101. 2DD1 8BES FIN_DEUX mov sp, bp
  3102. 2DD3 5D pop bp
  3103. 2DD4 C3 ret
  3104. AU COEUR DE TURBO PASCAL 369 AU COEUR DE TURBO PASCAL
  3105. ==================== PAGE 34 ====================
  3106. 5 LE CODE COMPILE 5
  3107. | 5.7
  3108. | les appels de procédures 5.7
  3109. 2DDS5 E90000 PRINCIPAL jmp FIN
  3110. 2DD8 33C0 FIN xor FL PU LÀ
  3111. 2DDA E863DE ( call TU_HALT
  3112. 2DDD 0000 } hex 0000
  3113. Fig. 5.167 Des variables intermédiaires comme paramètres.
  3114. Notez que:
  3115. — pour simplifier le code nous n’avons pas effectué tous les appels
  3116. — l'accès aux paramètres est identique. Cela était prévisible du fait qu’une procédure doit pouvoir
  3117. accéder à plusieurs piles locales (d’où la table des BP englobants), mais n’a qu’un seul jeu de
  3118. paramètres, tous situés avant l’environnement
  3119. — voici par contre comment trois place les paramètres sur la pile avant d’effectuer l’appel. Voici
  3120. la situation juste avant de pousser ces paramètres (en $2DB0):
  3121. —
  3122. BP de trois <-- SP actuel
  3123. BP de deux
  3124. BP de deux <-- BP actuel
  3125. adresse de retour dans deux
  3126. ‘ locale2
  3127. localel
  3128. BP de deux
  3129. BP de principal (BP de deux)
  3130. adresse de retour dans principal
  3131. Pour récupérer la valeur d’un paramètre valeur, l’accès se fait comme d’habitude pour les
  3132. variables intermédiaires:
  3133. | — [BP+ $FE] nous fournit le BP de deux
  3134. — cette valeur est stockée dans BX
  3135. — locale2 se trouve alors à [BX+ $FC] (2 octets pour sauter la copie de BP de deux et 2 pour
  3136. accéder au premier octet de localel) °
  3137. | " Pour récupérer l’adresse de locale2:
  3138. — [BP+ $FE] nous fournit le BP de deux
  3139. — cette valeur est stockée dans BX
  3140. — BX+ $FA contient alors le décalage de locale2. Ce décalage est alors placé dans DI par
  3141. l'instruction
  3142. LEA DI, [BX+$FA]
  3143. — puis SS et DI sont poussés sur la pile
  3144. AU COEUR DE TURBO PASCAL 370 AU COEUR DE TURBO PASCAL
  3145. 5 LE CODE COMPILE 5
  3146. 5.7 les appels de procédures 57
  3147. RESUME
  3148. Les paramètres sont poussés sur la pile par la procédure appelante. Celle ci
  3149. pousse la valeur des paramètres valeur, et l’adresse segmentée des
  3150. paramètres variable.
  3151. La procédure accède à ces paramètres en utilisant BP. Le premier octet de
  3152. ces paramètres est situé à une distance de BP+ 4.
  3153. Pour les paramètres variable, l'adresse segmentée est chargée dans ES et
  3154. DI qui permettent d'accéder à la variable passée comme paramètre.
  3155. La pile comporte donc:
  3156. la dernière variable locale <--- SP
  3157. la deuxième variable locale
  3158. la première variable locale
  3159. la valeur de BP actuelle
  3160. la valeur de BP de la procédure englobante
  3161. la valeur de BP de la première procédure
  3162. la valeur de BP de l’appelant <--- BP
  3163. l’adresse de retour
  3164. dernier paramètre
  3165. premier paramètre
  3166. {5.7.7 LES APPELS DE FONCTIONS
  3167. Voici à présent un appel de fonction:
  3168. AU COEUR DE TURBO PASCAL : 371 AU COEUR DE TURBO PASCAL
  3169. ==================== PAGE 35 ====================
  3170. 5 LE CODE COMPILE 5 LE CODE COMPILE 5
  3171. 5.7 les appels de procédures 5.7 les appels de procédures 5.7
  3172. B90800 PRINCIPAL mov cx, $0008
  3173. O (* 001 sfct *) E8F3E1 call © TU_STACK_CHECK
  3174. 1 (* 29 aou 87 *) 4C i dec sp
  3175. 2 ‘ 4C dec sp
  3176. 3 PROGRAM desassemble appel fonction; i E8DCFF call F_FONCTION
  3177. 4 VAR entier: INTEGER; 2D94 A36202 mov [$0262], ax
  3178. 5 2D97 E90000 jmp FIN
  3179. 6 FUNCTION f entier: INTEGER; |
  3180. 7 BEGIN ~— 2D9A 33C0 FIN xor ax, ax
  3181. 8 f entier:= $77; 4 2D9C E8A1DE call . TU_HALT
  3182. 4 END; (* f_entier *) | 2D9F 0000 hex 0000
  3183. 1
  3184. | 11 BEGIN (* principal *) À Fig. 5.169 Le code de desassemble fonction .
  3185. | 12 entier:= f_entier; À
  3186. | 13 END. 4
  3187. Fig. 5.168 Le programme desassemble_fonction. 1 Notez que:
  3188. — au moment de l’appel, en $2D89, le code vérifie que la pile pourra accomoder la fonction (6
  3189. octets pour l’environnement traditionnel plus 2 octets pour le résultat entier de la fonction). La
  3190. j Et voici le code généré: a pile est alors décrémentée de 2 octets pour laisser la place au résultat de la fonction.
  3191. q — dans le corps de la fonction:
  3192. 2D4D E849DD call TU_PARAGRAPHS 4 — l'affectation de la valeur à la fonction se fait en stockant directement cette valeur en
  3193. 2D50 0600 hex 0600 ; options 4 [BP+ $04], où se trouve l’emplacement réservé pour le résultat de la fonction
  3194. 2D52 780B hex 780B ; cs ( — avant de quitter la fonction, la valeur de celle-ci est chargée dans AX. L’expression utilisant
  3195. 2D54 3C15 hex BC25 |; ds 3 ce résultat entier est donc assuré de trouver cette valeur dans AX.
  3196. 2D56 DBO2 hex DBO2 ; code \
  3197. 2D58 2700 hex 2700 ; globales
  3198. 2D5A 0004 hex 0004 ; min piles \
  3199. | 2D5C O00A0 hex 00A0 ; max piles a Lorsque le résultat de la fonction est un réel ou une chaîne, le mécanisme est similaire:
  3200. | 2DSE 1000 hex 1000 ; fichiers
  3201. | 2D60 0000 hex 0000 ; input |
  3202. | 2D62 0000 hex 0000 ; output \| O (* 001 sfctst *)
  3203. i] 4 1 (* 29 aou 87 *)
  3204. 2D64 8BEC mov bp, sp à 2
  3205. 2D66 E814DF call TU_TAILLE_CODE q 3 PROGRAM desassemble_appel_fonction_string;
  3206. 2D69 3600 hex 3600 ; taille 1 4 TYPE string]1= STRING{11];
  3207. | 2D6B 6D2D adr SAUT _PRINCI PAL i 5 VAR chaine: string11;
  3208. 2D6D E90000 SAUT_PRINCIPAL jmp PRINCIPAL \ ; ee string!1;
  3209. 2D70 55 F_ENTIER push bp 4 9 f chaine:= "ABC";
  3210. 2D71 8BEC mov bp, sp \ 10 END; (* f_entier *)
  3211. 2D73 50 push bp q 11
  3212. 2D74 E90000 jmp DEBUT_F_ENTIER 1} 12 BEGIN (* principal *)
  3213. 4 13 chaine:= f chaine;
  3214. 2D77 B87700 DEBUT_F_ENTIER mov ax, $0077 i 14 END.
  3215. 2D7A 894604 mov [bp+ $04], ax q
  3216. 2D7D E90000 jmp FIN_F_ENTIER t Fig. 5.170 Le programme desassemble_appel_fonction_chaine.
  3217. | 2D80 8B4604 FIN_F_ENTIER mov ax, [bp+ $04] À
  3218. iy 2D83 8BES mov sp, bp \
  3219. | 2D85 5D pop bp
  3220. | 2D86 C20200 ret 0002 ; intra i
  3221. i
  3222. |
  3223. Il ;
  3224. i L
  3225. i) AU COEUR DE TURBO PASCAL 372 AU COEUR DE TURBO PASCAL q AU COEUR DE TURBO PASCAL 373 AU COEUR DE TURBO PASCAL
  3226. ==================== PAGE 36 ====================
  3227. 5
  3228. SA
  3229. LE CODE COMPILE
  3230. les appels de procédures
  3231. Voici le code:
  3232. 2D4D E849DD call TU_PARAGRAPHS
  3233. 2D50 0600 hex 0600 ; options
  3234. 2D52 780B hex 780B ; cs
  3235. 2D54 3C15 hex 30171 (ds
  3236. 2D56 DCO02 hex DCO2 ; code
  3237. 2D58 2700 hex 2700 ; globales
  3238. 2D5A 0004 hex 0004 ; min piles
  3239. 2D5C 00A0 hex 00A0 ; max piles
  3240. 2D5E 1000 hex 1000 ; fichiers
  3241. 2D60 0000 hex 0000 ; input
  3242. 2D62 0000 hex 0000 ; output
  3243. 2D64 8BEC mov bp, sp
  3244. 2D66 E814DF call TU_TAILLE_CODE
  3245. 2D69 4B00 hex 4B00 ; taille
  3246. 2D6B 6D2D adr SAUT_PRINCI PAL
  3247. 2D6D E90000 SAUT_PRINCIPAL jmp PRINCI PAL
  3248. 2D70 55 F_CHAINE push bp
  3249. 2D71 8BEC mov bp, sp
  3250. 2D73 55 push bp
  3251. 2D74 E90000 jmp DEBUT_F_CHAINE
  3252. 2D77 8D7E04 DEBUT_F_CHAINE lea di, [bp+ $04]
  3253. 2D7A 16 push ss
  3254. 2D7B 57 push di
  3255. 2D7C E81CE4 call TU_POUSSE_K_ST
  3256. 2D7F 03 hex 03
  3257. 2D80 414243 asc *ABC’
  3258. 2D83 B10B mov cl, $0B
  3259. 2D85 E829E4 call TU_POP_STRING
  3260. 2D88 E90000 jmp FIN_F_CHAINE
  3261. 2D8B BA0000 F IN_F_CHAINE mov dx, $0000
  3262. 2D8E B10B mov cl, $0B
  3263. 2D90 8BE5 mov sp, bp
  3264. 2D92 5D pop bp
  3265. 2D93 E9C5E6 jmp TU_RESU_FCT_ST
  3266. 2D96 BF6202. PRINCI PAL mov di, $0262
  3267. 2D99 1E push ds
  3268. 2D9A 57 push di
  3269. 2D9B B91200 mov cx, $0012
  3270. 2D9E E8EIEI call TU_STACK_CHECK
  3271. 2DA1 83EC0C sub sp, $0C
  3272. 2DA4 E8C9FF call F_CHAINE
  3273. 2DA7 B10B mov cl, $0B
  3274. 2DA9 E805E4 call TU_POP_STRING
  3275. 2DAC E90000 jmp FIN
  3276. 2DAF 33C0 FIN xor BX ax
  3277. 2DB1 E88CDE call TU_HALT
  3278. 2DB4 0000 hex 0000
  3279. Fig. 5.171 Le code de desassemble_appel_fonction_chaine.
  3280. AU COEUR DE TURBO PASCAL 374 ‘AU COEUR DE TURBO PASCAL
  3281. i
  3282. if LE CODE COMPILE 5
  3283. 5.7 les appels de procédures ST
  3284. Notez que:
  3285. _ Ja fonction pousse la constante sur la pile, dépile cette valeur dans la zone réservée sur la pile à
  3286. la chaîne. L'expression utilisant peut alors utiliser cette valeur qui reste sur la pile après l'appel
  3287. de la fonction.
  3288. RESUME
  3289. Le résultat d’une fonction est placé sur la pile. Dans le cas d’une fonction
  3290. À entière, la fonction place la valeur du résultat dans AX avant de retourner.
  3291. i Dans le cas de réels ou de chaines, la valeur du résultat est laissé sur la pile.
  3292. Pendant l’exécution de la fonction, la pile comporte donc:
  3293. la dernière variable locale <--- SP
  3294. la deuxième variable locale
  3295. | la première variable locale
  3296. la valeur de BP actuelle
  3297. la valeur de BP de la procédure englobante
  3298. 1 la valeur de BP de la première procédure
  3299. la valeur de BP de l’appelant <--- BP
  3300. l’adresse de retour
  3301. dernier paramètre
  3302. premier paramètre
  3303. 1 résultat de la fonction
  3304. AU COEUR DE TURBO PASCAL 375 AU COEUR DE TURBO PASCAL
  3305. “A
  3306. ==================== PAGE 37 ====================
  3307. 5 LE CODE COMPILE 5
  3308. 5.8 les constantes typées 5.8
  3309. {5.8 LES CONSTANTES TYPEES |
  3310. {5.8.1 DEFINITION DES CONSTANTES TYPEES
  3311. TURBO PASCAL a inventé une nouvelle race de données, appelées "constantes typées".
  3312. Ces objets:
  3313. — sont définis après CONST
  3314. — utilisent une syntaxe qui est une combinaison de la syntaxe des déclarations de variables et des
  3315. définitions de types
  3316. — sont modifiables comme n’importe quelle variable
  3317. — Sont stockés au milieu du code du programme
  3318. — sont accédés à l’aide du registre CS
  3319. Voici quelques exemples de déclarations:
  3320. CONST kt_entier: INTEGER= $88;
  3321. kt_caractere: CHAR= ’A’;
  3322. kt_string: STRING[S5]:= "ABC;
  3323. kt_tableau: ARRAY(0..2] OF BYTE= ($11, $22, $33);
  3324. kt_ensemble: SET OF CHARS [’a’..’z’, ’A’];
  3325. Ce qui distingue donc une constante ordinaire d’une constante typée est la présence du type de la
  3326. constante entre le nom de la constante et la valeur de cette constante. La syntaxe de la définition est
  3327. donc:
  3328. CONST nom_constante : type_constante = valeur_constante ;
  3329. qui est une combinaison de la syntaxe de définition des constantes:
  3330. CONST nom_constante = valeur_constante ;
  3331. et de la syntaxe de déclaration de variables:
  3332. VAR nom_variable : type_variable ;
  3333. La valeur des constantes typées est placé au milieu du code du programme. Ceci entraîne que:
  3334. — la valeur est unique. Si vous utilisez la constante en plusieurs endroits, la copie unique sera
  3335. utilisée. Le code contient en effet l’adresse où se trouve la valeur (et non pas une copie de la
  3336. valeur, comme pour les constantes usuelles)
  3337. — les octets utilisés pour les constantes typées diminuent d’autant la place utilisable pour les
  3338. instructions, et augmentent d'autant la place pour les variables globales ou locales
  3339. — ces octets sont accessibles à partir du segment CS du 8088 (et non pas à partir de DS ou SS
  3340. comme pour les ‘variables globales ou locales). Ceci est surtout intéressant lorsqu’un
  3341. programme TURBO PASCAL est rendu résident et que nous y accédons par interruption: au
  3342. moment de l'interruption, seul CS et le compteur programme sont connus.
  3343. AU COEUR DE TURBO PASCAL 376 AU COEUR DE TURBO PASCAL
  3344. 5 LE CODE COMPILE 5
  3345. 5.8 les constantes typées 5.8
  3346. a
  3347. Finalement nous pouvons modifier la valeur d’une constante typée, en utilisant l’affectation ou la
  3348. lecture:
  3349. READLN(kt_entier);
  3350. kt_tableau[3]:= 5;
  3351. Elles se comportent donc de ce point de vue:
  3352. — comme des variables initialisées par le compilateur (au lieu d’être initialisées par nos
  3353. instructions). (
  3354. — comme des variables statiques: les constantes typées d’une procédure existent en dehors de la
  3355. procédure, et gardent leur valeur d’un appel à l’autre. Le fait que la valeur ne soit pas modifiée
  3356. provient de ce qu'elle est stockée, en un seul exemplaire, et dans le code (et non pas créée puis
  3357. détruite sur la pile des variables locales). Si une procédure récursive modifie cette valeur, c’est
  3358. la dernière modification qui sera retenue (alors que pour les variables locales, les valeurs
  3359. empilées seront dépilées dans l’ordre inverse, et la dernière détruite à la sortie du dernier appel).
  3360. Concrètement, ces constantes typées sont utilisées:
  3361. — pour disposer des constantes structurées uh 4
  3362. — pour économiser de la place lorsque la constante est utilisée de nombreuses fois et prend
  3363. beaucoup de place (chaînes de caractères) | |
  3364. — pour éviter d’écrire des instructions d’initialisation de variables et pour éviter de perdre du
  3365. temps à les.initialiser au moment de l’exécution
  3366. — pour disposer de variables statiques
  3367. — pour disposer de variables accessibles par CS
  3368. Il aurait été plus heureux de séparer ces propriétés fort différentes:
  3369. — en permettant l’initialisation de variables sous VAR (au lieu de CONST) \
  3370. — en créant l’attribut STATIQUE pour séparer l'existence d’une variable locale de l'exécution
  3371. d’une procédure ?
  3372. — en créant l’attribut CODE pour imposer le stockage de la variable dans le code du programme
  3373. Quoiqu'il en soit, examinons comment sont traitées ces données.
  3374. { 5.8.2 LES CONSTANTES TYPEES SIMPLES
  3375. Voici un programme utilisant des constantes typées simples:
  3376. (* 001 consttl *)
  3377. (* 11 avr 87 *)
  3378. (*$r+*)
  3379. PROGRAM desassemble_constantes_typees;
  3380. CONST kt_entier: INTEGER= $1711;
  3381. kt_booleen: BOOLEAN= TRUE;
  3382. kt_caractere: CHAR= ’A’;
  3383. kt_reel: REAL= 1.75;
  3384. 00 -J D Un PB W D = ©
  3385. AU COEUR DE TURBO PASCAL 377
  3386. AU COEUR DE TURBO PASCAL
  3387. ==================== PAGE 38 ====================
  3388. > LE CODE COMPILE
  3389. 5.8 les constantes typées
  3390. 9 VAR entier: INTEGER;
  3391. 10 reel: REAL;
  3392. 11 booleen: BOOLEAN;
  3393. 12 caractere: CHAR;
  3394. 13 BEGIN
  3395. 14 kt_entier:= entier,
  3396. LS kt_booleen:= booleen;
  3397. 16 caractere:= kt_caractere;
  3398. 17 kt_reel:= reel;
  3399. 18 END.
  3400. Fig. 5.172 Le programme desassemble_constantes_typées
  3401. Voici le code correspondant:
  3402. 2D4D E849DD call TU_PARAGRAPHS
  3403. 2D50 0600 hex 0600 ; options
  3404. 2D52 780B hex 713806. ¢ cs
  3405. 2D54 3C15 hex Berets as
  3406. 2D56 DCO02 hex DCO2 ; code
  3407. 2D58 2700 hex 2700 ; globales
  3408. 2DSA 0004 hex 0004 ; min piles
  3409. 2D5C 00A0 hex 00A0 ; max piles
  3410. 2DSE 1000 hex 1000 ; fichiers
  3411. 2D60 0000 hex 0000 ; input
  3412. 2D62 0000 hex 0000 ; output
  3413. 2D64 8BEC moy bp, sp
  3414. 2D66 E814DF call TU_TAILLE_CODE
  3415. 2D69 5300 hex 5300 ; taille
  3416. 2D6B 6D2D adr SAUT_PRINCI PAL
  3417. 2D6D E90A00 SAUT_PRINCIPAL jmp PRINCIPAL
  3418. 2D70 1111 adr aN a
  3419. 2D72 01 hex 01
  3420. 2D73 41 asc *A’
  3421. 2D74 810000000060 hex 810000000060
  3422. 2D7A A16202 PRINCI PAL mov ax, [$0262]
  3423. 2D7D: 2E seg cs
  3424. 2D7E A3702D mov [$2D70], ax
  3425. 2D81 A06A02 mov al, [$026A]
  3426. 2D84 32E4 xor ah, ah
  3427. 2D86 B90000 mov cx, $0000
  3428. 2D89 BA0100 mov dx, $0001
  3429. 2D8C E8E5E1 call TU_RANGE_CHECK
  3430. 2D8F 2E seg cs
  3431. 2D90 A2722D mov [$2D72], al
  3432. AU COEUR DE TURBO PASCAL 378 AU COEUR DE TURBO PASCAL
  3433. LE CODE COMPILE 5
  3434. 5
  3435. 5.8 les constantes typées 5.8
  3436. 2E seg cs
  3437. 4 A0732D mov al, [$2D73]
  3438. 2D97 32E4 xor ah, ah
  3439. 2D99 B90000 mov cx, $0000
  3440. 2D9C BAFF00 mov dx, $00FF
  3441. 2D9F E8D2E1 call TU_RANGE_CHECK
  3442. 2DA2 A26B02 mov [$026B], al
  3443. 2DA5 BF742D mov di, $2D74
  3444. 2DA8 OE push cs
  3445. 2DA9 57 push di
  3446. 2DAA BF6402 mov di, $0264
  3447. 2DAD 1E push ds
  3448. 2DAE E885EB call TU_POUSSE_REEL
  3449. 2DB1 E8A2EB call TU_POP_REEL_DI
  3450. 2DB4 E90000 jmp FIN
  3451. 2DB7 33C0 FIN xor ax ax
  3452. 2DB9 E884DE call TU_HALT
  3453. 2DBC 0000 hex 0000
  3454. Fig. 5.173 Traitement des constantes typées simples
  3455. Notez que:
  3456. — le code contient bien les valeurs des constantes telles que nous les avons initialisées
  3457. — le programme saute par dessus la zone de ces constantes, pour débuter à la première instruction
  3458. 8088. Cette technique est aussi appliquée dans le cas des procédures
  3459. — l’accés aux constantes typées se fait de la façon suivante:
  3460. — pour toutes les instructions qui chargeaient des valeurs simples dans AX au moyen de
  3461. MOV, les traitements sont simplement préfixés par SEG CS
  3462. — pour toutes les instructions qui poussaient le segment de la donnée sur la pile, c’est
  3463. simplement CS qui est poussé (au lieu de DS)
  3464. {5.8.3 LES CONSTANTES TYPEES COMPLEXES
  3465. Voici un exemple de constante typée plus complexe:
  3466. (* 001 constt2 *)
  3467. (* 11 avr 87 *)
  3468. (*$r+*)
  3469. PROGRAM desassbmle_constante_typee2;
  3470. TYPE t_record= RECORD
  3471. nom: STRING/$3];
  3472. age: INTEGER;
  3473. END;
  3474. t_tableau_record= ARRAY/$10..$11] OF t_record;
  3475. 10 CONST kt_tableau_record: t_tableau_record=
  3476. \O 00 JA Un PB & D = ©
  3477. (
  3478. 12 (nom: ’ABC’ ; age: $1F),
  3479. i (nom: "DEF"; age: $2F) );
  3480. AU COEUR DE TURBO PASCAL 379 AU COEUR DE TURBO PASCAL
  3481. ==================== PAGE 39 ====================
  3482. 5 r LE CODE COMPILE 5 LE CODE COMPILE 5
  3483. 5.8 les constantes typées 5.8 les constantes typées 5.8
  3484. 14 VAR indice: INTEGER; A16202 mov ax, [$0262]
  3485. | 15 BEGIN vi 2D1000 sub ax, HO
  3486. 16 kt tableau recordlindice].age:= $FF; B90200 mov CX 2
  3487. 17 WITH kr tableau _record[indice] DO E8C5E1 call TU_INDEX_CHECK
  3488. 18 age:=$77;., — D1E0 shl ax.
  3489. 19 END. 8BC8 mov cxT)iax
  3490. D1E0 shl axpok
  3491. Fig. 5.174 Le programme desassemble_constante_typee2. 03C1 add ax, Cx
  3492. Hf, i 97 xchg di
  3493. 81C7702D add di, $2D70
  3494. 0E push cs
  3495. Li ici : 57 push di
  3496. | Voici son code: C47EFC les di, [bp+ $FC]
  3497. | B87700 mov ax, $0077
  3498. 2D4D E849DD call TU_PARAGRAPHS 26 seg es.
  3499. 2D50 0600 hex 0600 ; options 894504 mov [di+ $04], ax
  3500. 2D52 780B hex 780B ; cs 83C404 add sp, $04
  3501. 2D54 3C15 hex 3015 3) ds ‘
  3502. 2D56 DDO2 hex DD02 ; code £90000 jmp FIN
  3503. 2D58 2700 hex 2700 ; globales
  3504. 2D5A 0004 hex 0004 ; min piles 33C0 FIN xor ax, ax
  3505. | 2D5C 00A0 hex OOAO ; max piles E877DE call TU_HALT
  3506. 2D5E 1000 hex 1000 ; fichiers 0000 hex 0000
  3507. 2D60 0000 h 0000 ; i t L
  3508. 2D62 0000 hee 0000 ; saga Fig. 5.175 Constantes typées structurées .
  3509. 2D64 8BEC mov bp, sp j
  3510. 2D66 E814DF call TU_TAILLE_CODE d
  3511. i 2D69 6000 hex 6000 ; taille | Notez que:
  3512. 2D6B 6D2D d SAUT _PRINCI PAL i
  3513. | ; tinh sma 4 — pour accéder à la zone, l’instruction MOV est simplement préfixée par CS
  3514. 2D6D E90C00 SAUT_PRINCIPAL jmp PRINCIPAL q — dans le cas du WITH, c’est le segment CS qui est poussé sur la pile. Les autres instructions
  3515. | Fe | sont alors similaires à celles du WITH normal.
  3516. | 2D70 03 hex 03 à
  3517. | 2D71 414243 asc ? ABC’ \
  3518. 2D74 1F00 hex 1F00 |
  3519. | 2D76 03 hex 03 {5.8.4 RESUME
  3520. | 2D77 444546 asc * DEF’ |
  3521. 2D7A 2F00 \ hex 0000
  3522. Les constantes typées:
  3523. ( 202 }
  3524. | JD 501000 Matt tin js qu Bit À — sont des variables initialisées stockées dans le code du programme et
  3525. | 2D82 B90200 mov cx, $0002 4 accessible par CS
  3526. | 2D85 E8E2E1 call TU_INDEX_CHECK | : Ë
  3527. nl. 2D88 DIEO shl ax, 1 1 — pour traiter ces variables, le code:
  3528. \ 2D8A 8BC8 mov Cx, ax | k |
  3529. | 2D8C DIEO shl ax, 1 1 — préfixe les instructions de transfert par le segment CS
  3530. | 2D8E 03C1 add ax. cx À — pousse CS sur la pile pour les instructions ou les routines de la
  3531. | 2D90 97 xchg ih 4 librairie qui attendent le segment de la donnée sur la pile
  3532. 2D91 B8FF00 mov ax, $OOFF 4
  3533. 2D94 2E seg cs M
  3534. i} 2D95 8985742D mov [di+ $2D74], ax \
  3535. 1 AU COEUR DE TURBO PASCAL 380 AU COEUR DE TURBO PASCAL q AU COEUR DE TURBO PASCAL 381 AU COEUR DE TURBO PASCAL
  3536. ==================== PAGE 40 ====================
  3537. 5 LE CODE COMPILE 5
  3538. 5.9 les variables absolues 5.9
  3539. {5.9 LES VARIABLES ABSOLUES |
  3540. {5.9.1 DEFINITION DES VARIABLES ABSOLUES
  3541. TURBO PASCAL permet au programmeur de ge mnped à quel endroit est stockée une variable.
  3542. Pour cela il suffit d'utiliser l’attribut ABSOLUTE. Par exemple:
  3543. VAR entier: INTEGER ABSOLUTE $1234:$5678;
  3544. Il existe 4 types de variables absolues:
  3545. — les variables absolues situées dans le segment CS:
  3546. VAR options: INTEGER ABSOLUTE CSEG: $2D50;
  3547. — les variables absolues situées dans le segment DS:
  3548. VAR handle! : INTEGER ABSOLUTE DSEG: $0242;
  3549. — les variables absolues situées à la même adresse qu’une autre donnée (variable globale, locale,
  3550. paramètre). Par exemple:
  3551. VAR chaine: STRING[15];
  3552. taille: BYTE ABSOLUTE chaine;
  3553. — des variables absolues situées à une adresse quelconque:
  3554. VAR equipement: BYTE ABSOLUTE $0040: $0010;
  3555. {5.9.2 ACCES AUX VARIABLES ABSOLUES
  3556. Voici comment le compilateur traite les variables absolues:
  3557. — les variables absolues par rapport à DS sont traitées comme n’importe quelle variable globale.
  3558. Le compilateur utilise simplement le décalage que vous lui fournissez, au lieu de le calculer
  3559. lui-même
  3560. — les variables absolues par rapport à CS sont traitées comme les constantes typées
  3561. — les variables absolues greffées sur une autre variable sont traitées comme les variables du
  3562. segment où se trouve la variable (DS ou SS)
  3563. — les variables situées à une adresse quelconque sont traitées comme des constantes typées.
  3564. AU COEUR DE TURBO PASCAL 382 AU COEUR DE TURBO PASCAL
  3565. LE CODE COMPILE 5
  3566. 5.9 les variables absolues 5.9
  3567. Examinons le dernier cas à l’aide d’un petit exemple:
  3568. (* 001 abso *)
  3569. (* 18 aou 87 *)
  3570. 0
  3571. 1
  3572. ?
  3573. 3 PROGRAM desassemble absolute;
  3574. 4 VAR absolue: INTEGER ABSOLUTE $1234: $5678;
  3575. 5 entier: INTEGER;
  3576. 6 BEGIN
  3577. 7 entier:= absolue;
  3578. 8 END.
  3579. Fig. 5.176 Le programme desassemble_absolue.
  3580. Voici le code correspondant:
  3581. 2D4D E849DD call TU_PARAGRAPHS
  3582. 2D50 0600 hex 0600 ; options
  3583. 2D52 780B hex 780B ; cs
  3584. 2D54 3C15 hex 3015): ds
  3585. 2D56 D902. hex D902 ; code
  3586. 2D58 2700 hex 2700 ; globales
  3587. 2D5A 0004 hex 0004 ; min piles
  3588. 2D5C 00A0 hex 00A0 ; max piles
  3589. 2DS5E 1000 hex 1000 ; fichiers
  3590. 2D60 0000 hex 0000 ; input
  3591. 2D62 0000 hex 0000 ; output
  3592. 2D64 8BEC mov b
  3593. Pp, s
  3594. 2D66 E814DF call TU. TATLLE_CODE
  3595. td 1E00 hex 1E00 ; taille
  3596. D6B 6D2D adr SAUT_PRINCI PAL
  3597. 2D6D E90400 SAUT_PRINCIPAL jmp PRINCI PAL
  3598. 2D70 7856 h
  3599. ‘2D72 3412 han 3419
  3600. 2D74 2E PRINCIPAL Ss
  3601. 2D75 C43E702D tes di [$2D70]
  3602. 2D79 26 seg es”
  3603. 2D7A 8B05 mov ax, [di]
  3604. 2D7C A36202 mov [$0262], ax
  3605. 2D7F E90000 jmp FIN
  3606. 2D82 33C0 FIN
  3607. 2D84 E8B9DE call TU HALT
  3608. 2D87 0000 hex 0000
  3609. Fig. 5.177 Une variable absolue .
  3610. AU COEUR DE TURBO PASCAL 383 AU COEUR DE TURBO PASCAL
  3611. ==================== PAGE 41 ====================
  3612. 5 LE CODE COMPILE 5
  3613. 5.9 les variables absolues 5.9
  3614. Notez que:
  3615. — l’utilisation du code pour stocker l’adresse de la variable facilite son accès en utilisant LES DI.
  3616. Elle permet aussi de ‘bénéficier de la mécanique des constantes typées, en évitant d’avoir à
  3617. créer une nouvelle technique d’accès. :
  3618. {5.9.3 RESUME
  3619. Les variables absolues sont traitées:
  3620. ~ comme des variables globales (absolues DSEG ou greffées sur une
  3621. globale)
  3622. - comme des constantes typées (absolues CSEG ou à une adresse
  3623. absolue)
  3624. _ comme des variables locales (absolues greffées sur des variables
  3625. locales ou des paramètres)
  3626. {S.A SYNTHESE)
  3627. Le code TURBO PASCAL distingue 2 types de données:
  3628. — les données manipulables dans les registres
  3629. — les données dont la taille peut dépasser la capacité des registres disponibles.
  3630. Pour les données trop volumineuses, le code utilise systématiquement la pile
  3631. — pour stocker les valeurs à traiter
  3632. — pour placer le segment de ces données (ce segment pouvant être DS, CS, SS ou ES). DI est
  3633. alors utilisé pour connaitre de déplacement.
  3634. Les données traitées ainsi comprennent les réels, les chaines, les tableaux et les enregistrements
  3635. lorsqu’ils sont manipulés globalement et les ensembles.
  3636. Pour les données manipulables dans les registres:
  3637. — toute l’arithmétique est effectuée dans AX, en sauvant les valeurs intermédiaires sur la pile et
  3638. en les récupérant dans CX
  3639. — les accès par le biais de sélecteurs (tableaux, enregistrements, pointeurs)
  3640. — sont calculés directement chaque fois que le compilateur connaît les valeurs à utiliser pour
  3641. le calcul
  3642. — sont effectuées en utilisant DI pour calculer le décalage, plus un décalage relatif constant
  3643. dépendant des indices de départ ou des zones sélectionnées. ES est alors utilisé comme
  3644. segment.
  3645. — dans le cas de WITH, l'adresse de base est poussée sur la pile et récupérée dans ES et DI à
  3646. l’aide de BP
  3647. AU COEUR DE TURBO PASCAL 384 AU COEUR DE TURBO PASCAL
  3648. LE CODE COMPILE 5
  3649. synthèse 5.A
  3650. 5.A
  3651. ——
  3652. _ J’accés aux variables locales et aux paramètres est effectué à l’aide de BP
  3653. _ l'accès aux variables intermédiaires est effectué en utilisant la table des pointeurs des pi
  3654. englobantes stockés dans chaque pile locale. PO S piles
  3655. à Dans le cas de l'affectation, le calcul de l’adresse peut être séparé des instructions de stockage. La
  3656. À sauvegarde sur la pile des adresses calculées est alors effectuée.
  3657. Le traitement des fichiers utilise systématiquement la librairie, qui fait appel au DOS.
  3658. à (5.8 CONCLUSION)
  3659. } Dans ce chapitre nous avons examiné:
  3660. 4 — par quelles instructions le code manipulait:
  3661. — les données simples et structurées
  3662. — globales, locales, sur le tas, dans le code
  3663. i — en mémoire ou vers un périphérique
  3664. AU COEUR DE TURBO PASCAL 385
  3665. AU COEUR DE TURBO PASCAL
  3666. ==================== PAGE 42 ====================
  3667. LES OPTIONS DE COMPILATION 6
  3668. CHAPITRE 6
  3669. LES OPTIONS DE COMPILATION
  3670. Dans ce chapitre nous allons:
  3671. — décrire les options de compilation
  3672. — indiquer leur effet sur le code généré
  3673. A l'issue de ce chapitre vous serez en mesure:
  3674. — d'éviter l’arrêt d'exécution lorsqu'une erreur d’entrée / sortie se produit
  3675. — d'utiliser des lectures clavier non tamponnées
  3676. — de modifier le nombre de fichiers ou de dimensionner les tampons d'entrée
  3677. AU COEUR DE TURBO PASCAL 387 AU COEUR DE TURBO PASCAL