File: Assembly-HOWTO.pl.html

package info (click to toggle)
doc-linux-pl 2002.06.14-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, jessie, jessie-kfreebsd, lenny, squeeze, wheezy
  • size: 6,900 kB
  • ctags: 968
  • sloc: makefile: 66
file content (1435 lines) | stat: -rw-r--r-- 61,842 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
<META HTTP-EQUIV="content-type" content="text/html; charset=iso-8859-2">
<TITLE>Assembly HOWTO</TITLE>


</HEAD>
<BODY>
<H1>Assembly HOWTO<BR></H1>

<H2>Autor: Franois-Ren Rideau 
<A HREF="fare@tunes.org">fare@tunes.org</A><BR>
v0.4n, 22 Sierpnia 1998<BR>
<B>Wersja polska: Zbigniew Micha Kempczyski
<A HREF="mailto:wegorz@bydgoszcz.pkobp.pl">wegorz@bydgoszcz.pkobp.pl</A><BR> </B>
v1.0, 30 Stycznia 1999 r. </H2>
<P><HR>
<EM>Dokument ten zosta napisany w standardzie ISO-8859-2. Orygina tego dokumentu znajduje sie pod adresem 
<A HREF="http://www.tunes.org/~fare/Assembly-HOWTO">http://www.tunes.org/~fare/Assembly-HOWTO</A>.
<EM>To jest
Linux Assembly HOWTO.</EM>
Ten dokument opisuje metody programowania w assemblerze
z uyciem <EM>WOLNYCH</EM> narzdzi programistycznych,
koncentrujc si na Systemie Operacyjnym Linux na platformach i386.
Zaczony materia moe, ale nie musi by zgodny,
z innym sprztem i/lub oprogramowaniem.
Przewodnictwo na tym bdzie mile widziane.
<EM>Sowa kluczowe</EM>:
        assemblacja, assembler, wolny, makroprocesor, preprocesor,
        asm, inline asm, 32-bitowy, x86, i386, gas, as86, nasm</EM>
<HR>
<H2><A NAME="s1">1. WPROWADZENIE</A></H2>

<H2>1.1 Legal Blurp</H2>

<P>Copyright &copy; 1996,1997,1998 by Franois-Ren Rideau.
<P>Ten dokument jest wolnym oprogramowaniem, moesz go redystrybuowa
i/lub modyfikowa zgodnie z zaoeniami GNU General Public License
opublikowanym przez Free Software Foundation;
wersja 2 Licencji, lub (w twoim przypadku) inna pniejsza wersja.
<P>
<H2>1.2 Wana Informacja</H2>

<P>To jest interaktywnie rozwijany dokument: jeste specjalnie proszony do
zadawania pyta, 
udzielania odpowiedzi na pytania,
poprawiania odpowiedzi,
dodawania nowych odpowiedzi na FAQ, 
wskazywania na inne oprogramowanie, 
wskazywania osobie prowadzcej bdy lub braki na stronach.
Jeli jeste zmotywowany, mgby
<EM>przej prowadzenie tego HOWTO</EM>.
Sowem, dziaaj !
<P>By przej prowadzenie skontaktuj si z kimkolwiek, kto wydaje si prowadzi
Assembly-HOWTO. W trakcie tego pisania to jestem ja, np.
<A HREF="mailto:fare@tunes.org">Franois-Ren Rideau</A>.
Jakkolwiek, mino troch czasu od kiedy poszukiwaem mocnego gocia
by podmieni mnie jako prowadzcego ten dokument. Niekorzyci jest to,
i musisz spdzi troch czasu trzymajc dokument na czasie, poprawiajc go,
i uczc si narzdzi publikacyjnych LDP. Korzyci jest to, i zdobdziesz 
troch sawy <EM>i</EM> moesz otrzyma wolne kopie kompendiw HOWTO.
<P>
<H2>1.3 Przed sowem</H2>

<P>Ten dokument ma na celu udzielenie odpowiedzi na najczciej zadawane pytania przez ludzi,
ktrzy programuj lub chc programowa w 32-bitowym assemblerze x86
uywajc <EM>wolnych</EM> assemblerw, 
zwaszcza w systemie operacyjnym Linux.
Moe on take wskazywa inne dokumenty o 
nie-wolnych, nie-x86, lub nie-32-bitowych assemblerach, 
chocia nie jest to jego pierwszorzdnym celem.
<P>Poniewa gwnym celem programowania w assemblerze jest budowa 
wntrznoci systemw operacyjnych, interpretatorw, kompilatorw, i gier,
gdzie kompilator C zawodzi nie dostarczajc potrzebnych rodkw wyrazu,
(wykonanie jest coraz rzadszym tematem),
skoncentrujemy si na rozwoju takiego oprogramowania.
<P>
<H3>Jak uywa tego dokumentu</H3>

<P>Ten dokument zawiera odpowiedzi na pewne najczciej zadawane pytania.
W wielu miejscach, zostay umiejscowione adresy URL by wskaza na pewne 
oprogramowanie lub magazyny dokumentacji.
<P>Sprawd gdzie s skopiowane najbardziej uyteczne magazyny,
i sprbuj dobra si do najbliszej z nich;
uchronisz w ten sposb Internet przed niepotrzebym ruchem w sieci,
i zaoszczdzisz swj cenny czas.
<P>W szczeglnoci pewne wielkie magazyny na caym wiecie,
sa kopiami innych popularnych magazynw.
Powiniene si nauczy i zapamita miejsca umiejscowione blisko ciebie (roztropno-sieciowa).
Czasami, lista takich kopii jest wypisana w pliku, 
lub we wiadomoci wejciowej. Miej na uwadze te porady.
W przeciwnym wypadku zapytaj archie o oprogramowaniu ktrego szukasz...
<P>Najwiesze wersje tego dokumentu znajduj si w
<A HREF="http://www.tunes.org/~fare/Assembly-HOWTO">http://www.tunes.org/~fare/Assembly-HOWTO</A>
lub
<A HREF="http://www.tunes.org/~fare/Assembly-HOWTO.sgml">http://www.tunes.org/~fare/Assembly-HOWTO.sgml</A><P>ale to co jest w magazynach Linux HOWTO <EM>powinno</EM> by take na czasie 
(ale tego nie wiem):
<P>
<A HREF="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/">ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/</A> (?)
<P>Francuska wersja tego HOWTO moe by znaleziona w
<P>
<A HREF="ftp://ftp.lip6.fr/pub/linux/french/HOWTO/">ftp://ftp.lip6.fr/pub/linux/french/HOWTO/</A><P>
<H3>Inne zalene dokumenty</H3>

<P>
<P>
<UL>
<LI>Jeli nie wiesz czym jest <EM>wolne</EM> oprogramowanie,
prosz przeczytaj <EM>ostronie</EM> GNU General Public License,
ktra jest uywana w wielu wolnych programach,
i jest pierwowzorem dla wikszoci takich licencji.
Oglnie pojawia si w pliku o nazwie <CODE>COPYING</CODE>, 
z wersj biblioteczn w pliku o nazwie <CODE>COPYING.LIB</CODE>.
Literatura z 
<A HREF="http://www.fsf.org">FSF</A>
(fundacja wolnego oprogramowania) moe take ci pomc.
</LI>
<LI>W szczeglnoci, interesujcym rzecz w takim typie wolnego oprogramowania
przychodzcego ze rdami jest to, i moesz je sprawdzi, poprawi
a take czasami z nich zapoyczy. 
Przeczytaj ostronie szczegy licencji i skorzystaj.
</LI>
<LI>Jest lista FAQ na comp.lang.asm.x86, ktra odpowie na wiele oglnych pyta
o programowaniu w assemblerze x86, i pytaniach o pewnych komercyjnych
assemblerach w 16-bitowym rodowisku DOS-a.
Pewne z nich zahaczaj o wolnym 32-bitowym programowaniu, wic moesz chcie
przeczyta to FAQ... 

<A HREF="http://www2.dgsys.com/~raymoon/faq/asmfaq.zip">http://www2.dgsys.com/~raymoon/faq/asmfaq.zip</A>
</LI>
<LI>FAQ-i i dokumenty istniej o programowaniu na twojej ulubionej platformie,
jakakolwiek ona jest, wic powiniene skonsultowa tematy specyficzne dla niej 
nie bezporednio zwizane z programowaniem w assemblerze. </LI>
</UL>
<P>
<H2>1.4 Historia</H2>

<P>Kada wersja zawiera kilka napraw i mniejszych korekt,
ktrych nie bdzie trzeba cigle poprawia.
<DL>
<DT><B>Version 0.1      23 Kwiecie 1996</B><DD><P>Francois-Rene "Far" Rideau &lt;fare@tunes.org&gt;
tworzy i publikuje pierwsze mini-HOWTO,
poniewa ``Jestem chory od cigego odpowiadania na te same pytania
na comp.lang.asm.x86''
<P>
<DT><B>Version 0.2      4 Maj 1996</B><DD><P>*
<P>
<DT><B>Version 0.3c     15 Czerwiec 1996</B><DD><P>*
<P>
<DT><B>Version 0.3f     17 Padziernik 1996</B><DD><P>*
<P>
<DT><B>Version 0.3g     2 Listopad 1996</B><DD><P>Utworzenie Historii. Dodanie wskanikw w sekcji o cross-kompilacji.
Dodanie sekcji o programowaniu I/O pod Linux-em (w szczeglnoci video).
<P>
<DT><B>Version 0.3h     6 Listopad 1996</B><DD><P>wicej o cross-kompilacji - Zobacz na sunsite: devel/msdos/ 
<P>
<DT><B>Version 0.3i     16 Listopad 1996</B><DD><P>NASM atwo przechodzi
<P>
<DT><B>Version 0.3j     24 Listopad 1996</B><DD><P>wskazanie na tumaczenie francuskie
<P>
<DT><B>Version 0.3k     19 Grudzie 1996</B><DD><P>Co ? Zapomniaem wskazac na terse???
<P>
<DT><B>Version 0.3l     11 Stycze 1997</B><DD><P>*
<P>
<DT><B>Version 0.4pre1  13 Stycze 1997</B><DD><P>tekst mini-HOWTO przeksztaca si w pene linuxdoc-sgml-owe HOWTO,
by zobaczy jak wygldaj narzdzia SGML.
<P>
<DT><B>Version 0.4      20 Stycze 1997</B><DD><P>pierwsze jako takie wypuszczenie tego HOWTO.
<P>
<DT><B>Version 0.4a     20 Stycze 1997</B><DD><P>dooono sekcj Wyrazy Uznania  
<P>
<DT><B>Version 0.4b     3 Luty 1997</B><DD><P>przesunicie NASM: teraz jest przed AS86
<P>
<DT><B>Version 0.4c     9 Luty 1997</B><DD><P>Dodano sekcj "CZY POTRZEBUJESZ ASSEMBLACJI ?"
<P>
<DT><B>Version 0.4d     28 Luty 1997</B><DD><P>Vapor oznajmia o nowym przewodnictwie Assembly-HOWTO.
<P>
<DT><B>Version 0.4e     13 Luty 1997</B><DD><P>Wypuszczenie o DrLinux
<P>
<DT><B>Version 0.4f     20 Marzec 1997</B><DD><P>*
<P>
<DT><B>Version 0.4g     30 Marzec 1997</B><DD><P>*
<P>
<DT><B>Version 0.4h     19 Czerwiec 1997</B><DD><P>wci wicej na temat "jak nie uywa assemblacji";
unowoczenienie o NASM, GAS.
<P>
<DT><B>Version 0.4i     17 Lipiec 1997</B><DD><P>info o 16-bitowym trybie dostpu z Linux-a.
<P>
<DT><B>Version 0.4j     7 Sierpie 1997</B><DD><P>*
<P>
<DT><B>Version 0.4k     19 Padziernik 1997</B><DD><P>*
<P>
<DT><B>Version 0.4l     16 Listopad 1997</B><DD><P>wypuszczenie o szstej edycji LSL.
<P>
<DT><B>Version 0.4m     23 Marzec 1998</B><DD><P>poprawki o wywoaniu gcc 
<P>To jest jeszcze inne ostatnie-wydanie-przez-Far-przed-przejciem-przez-nowego prowadzcego (?)
<P>
</DL>
<P>
<H2>1.5 Wyrazy Uznania</H2>

<P>Chaciabym podzikowa nastpujcym osobom, w kolejnoci wystpowania:
<UL>
<LI>
<A HREF="mailto:buried.alive@in.mail">Linus Torvalds</A>
za Linux-a 
</LI>
<LI>
<A HREF="mailto:bde@zeta.org.au">Bruce Evans</A>
za bcc z ktrego jest wycignity as86
</LI>
<LI>
<A HREF="mailto:anakin@pobox.com">Simon Tatham</A> i
<A HREF="mailto:jules@earthcorp.com">Julian Hall</A>
za NASM
</LI>
<LI>
<A HREF="mailto:jim-neil@digital.net">Jim Neil</A>
za Zwizo
</LI>
<LI>
<A HREF="mailto:gregh@sunsite.unc.edu">Greg Hankins</A>
za prowadzenie HOWTO
</LI>
<LI>
<A HREF="mailto:raymoon@moonware.dgsys.com">Raymond Moon</A>
za jego FAQ   
</LI>
<LI>
<A HREF="mailto:dumas@linux.eu.org">Eric Dumas</A>
za tumaczenie mini-HOWTO na francuski
(smutna rzecz, e autor jest francuzem i pisze po angielsku)
</LI>
<LI>
<A HREF="mailto:paul@geeky1.ebtech.net">Paul Anderson</A>
i
and 
<A HREF="mailto:rahim@megsinet.net">Rahim Azizarab</A>
za pomoc, jeli nie przejcie HOWTO.
</LI>
<LI>
<A HREF="mailto:pcg@goof.com">Marc Lehman</A>
za wgld w wywoania GCC.       
</LI>
<LI>Wszystkim ludziom ktrzy woone pomysy, uwagi i wsparcie moralne.</LI>
</UL>
<P>
<P>
<H2><A NAME="doyouneedasm"></A> <A NAME="s2">2. CZY POTRZEBUJESZ ASEMBLACJI?</A></H2>

<P>No, nie chciabym przeszkadza w tym co robisz,
ale tu jest kilka porad ciko zarobionego dowiadczenia.
<P>
<H2>2.1 Za i Przeciw</H2>

<P>
<P>
<H3>Korzyci Assemblacji</H3>

<P>Assemblacja moe wyrazi mocno niskopoziomowe rzeczy:
<UL>
<LI>masz dostp do zalenych-od-maszyny rejestrw i I/O.
</LI>
<LI>moesz kontrolowa dokadnie zachowanie kodu
w krytycznych sekcjach ktre mog wywoa martwe punkty
pomidzy wieloma wtkami programowymi lub urzdzeniami.  
</LI>
<LI>moesz zama ustalenia zwykego kompilatora,
ktry moe pozwala na pewne optymalizacje
(jak chwilowe amanie zasad o przydzielaniu pamici, 
wtkach, konwencji wywoa, itd).      
</LI>
<LI>moesz budowa interfejsy pomidzy fragmentami kodu
uywajcego pewnych niekompatybilnych konwencji
(np. produkowanego przez rne kompilatory, 
lub oddzielonego nisko-poziomowym interfejsem).
</LI>
<LI>masz dostp do nieuywanych trybw twojego procesora 
(np. 16 bitowy tryb interfejsu startowego, instrukcji chip-owych 
(przyp.tum.) lub dziedziczonego kodu na Intel PC)
</LI>
<LI>moesz produkowa rozsdnie szybki kod dla zwartych ptli
by poradzi sobie ze zym nie-zoptymalizowanym kompilatorem
(po co, s przecie dostpne wolne zoptymalizowane kompilatory!)
</LI>
<LI>moesz produkowa kod gdzie
ale tylko na procesorach ze znanym czasem instrukcji,
ktry oglnie wycza cay przepyw .... 
</LI>
<LI>moesz produkowa rcznie-zoptymalizowany kod
ktry jest perfekcyjnie dostosowany do twojej szczeglnej konfiguracji sprztowej,
a zatem do nikogo wicej.
</LI>
<LI>moesz pisa pewien kod dla twojego kompilatora nowego jzyka
(to jest co ktrzy mog zrobi nieliczni, i take oni, nie czsto).</LI>
</UL>
<P>
<P>
<P>
<H3>Niekorzyci Assemblacji</H3>

<P>Assemblacja jest bardzo nisko-poziomowym jzykiem
(najniszym jest rczne-kodowanie w kodach binarnych instrukcji).
<P>To znaczy
<UL>
<LI>jest dugo i monotonnie pisa wszystko od pocztku,
</LI>
<LI>jest mocno podatna na bdy,
</LI>
<LI>bdy bd bardzo trudne do wyledzenia,
</LI>
<LI>jest to bardzo trudno zrozumie i modyfikowa,
np. utrzymywa
</LI>
<LI>rezultat jest bardzo nie-przenony na inne architektury,
aktualne i przysze,
</LI>
<LI>twj kod bdzie zoptymalizowany tylko w pewnych implementacjach
na tej samej architekturze:  

dla przykadu, pord platform Intelowskich,
kady wariant CPU i jego odmian
(wzgldy ukryte, przepustowo, pojemno
jednostek obliczeniowych, cache'y, RAM-u, szyny, dyskw,
obecnoci FPU, rozszerze MMX, itd)   

daje potencjalnie cakowicie rne techniki optymalizacji.   

Warianty CPU ju wczone 
Intel 386, 486, Pentium, PPro, Pentium II;
Cyrix 5x86, 6x86; AMD K5, K6.
        
Nowe warianty pojawiaj si wic nie spodziewaj si, e kady listing
twojego kodu bdzie na czasie.
</LI>
<LI>twj kod moe by take nieprzenony przez rne 
platformy systemowe na tej samej architekturze, przez brak waciwych narzdzi
(no, GAS wydaje si pracowa na wszystkich platformach;
NASM wydaje si pracowa lub by w stanie pracowa na platformach intelowskich).
</LI>
<LI>spdzisz wicej czasu na kilku detalach, 
i nie bdziesz mg skoncentrowa si na maych i duych algorytmach,
ktre s w stanie przynie najwiksz cz przyspieszenia.
[np. moesz spdzi troch czasu budujc bardzo szybkie
prymitywy manipulacji na listach/tablicach w assemblerze;
tylko hash-tablice (przyp.tum.) mog mocno przyspieszy twj program;
lub i innym przypadku, drzewka binarne;
lub pewne wysokopoziomowe struktury rozprowadzane przez klaster 
CPU] 
</LI>
<LI>maa zmiana w konstrukcji algorytmu mogaby cakowicie
uniewani twj cay istniejcy assemblowany kod.
Tak wic take ty masz by gotowy (i w stanie) by przepisa to wszystko,
lub bdziesz przywizany do poszczeglnych rozwiza algorytmicznych;
</LI>
<LI>W kodzie ktry nie wypada daleko od standardowych testw, 
komercyjne zoptymalizowane kompilatory wykonuj prawe rcznie-kodowany assembler
(no, to jest mniejsz prawd na architekturze x86
ni na architekturach RISC-owych;
i by moe mniejsz prawd ni dla szeroko dostpnych/wolnych kompilatorach;
jakkolwiek, dla typowego kodu w C, GCC jest cakiem dobry);   
</LI>
<LI>I w dowolnym przypadku, jak powiedzia wstrzemiliwy John Levine na comp.compilers,
``kompilatory mocno uatwiaj uywanie zoonych struktur danych,
i kompilatory nie daj znudzenia w poowie drogi
i generuj cakiem dobry kod.''   
One take bd <EM>prawidowo</EM> przechodzi transformacje kodu
poprzez cay (olbrzymi) program
podczas optymalizacji kodu pomidzy procedurami i granicami moduw.</LI>
</UL>
<P>
<P>
<H3>Ocenianie</H3>

<P>Podsumowujc, chocia moesz uzna 
e uycie assemblacji jest czasami konieczne,
a nawet poyteczne w kilku przypadkach gdzie nie jest konieczne,
bdziesz chcia:
<P>
<UL>
<LI>minimalizowa uycie kodu assemblera,
</LI>
<LI>hermetyzowa ten kod w dobrze zdefiniowanych interfejsach
</LI>
<LI>mie kod assemblera generowany automatycznie 
ze wzorcw wyraonych w wysokopoziomowym jzyku
ni w assemblerze (np. assemblerowe makra GCC inline)
</LI>
<LI>mie narzdzia automatyzujce tumaczenie tych programw 
w kod assemblera
</LI>
<LI>mie ten kod zoptymalizowany jeli jest to moliwe
</LI>
<LI>Nade wszystko,
np. pisa (rozszerza do) zoptymalizowanych wntrznoci kompilatora.</LI>
</UL>
<P>Nawet w przypadkach kiedy Assemblacja jest konieczna (np. rozwj OS)
moesz uzna, e nie a do tego stopnia
i trzyma si w/w zasad.
<P>Obejrzyj roda jdra Linux-a zwracajc uwag:
jak mao assemblacji jest konieczne,
by uzyska szybki, niezawodny, przenony, utrzymywalny OS.
Take udana gra taka jak DOOM zostaa prawie cakowicie napisana w C,
z maa czci napisan w assemblerze tylko do przypieszenia jej dziaania.
<P>
<H2>2.2 Jak NIE uywa Assemblera</H2>

<P>
<P>
<H3>Oglne zasady uzyskania efektywnego kodu</H3>

<P>Jak rzek Charles Fiterman na comp.compilers
o 'czowieku kontra kod assemblera wygenerowany przez komputer', 
<P>``Czowiek powinien zawsze wygra i oto przyczyna.
<UL>
<LI>Po pierwsze czowiek pisze cao w jzyku wysokiego poziomu.
</LI>
<LI>Po drugie zarysowuje gdzie mog wystpi gorce punkty gdzie program spdza swj czas.
</LI>
<LI>Po trzecie ma kompilator produkujcy kod assemblera dla tych maych
sekcji kodu.
</LI>
<LI>Po czwarte rcznie dostosowuje je by znale mae korzyci 
nad wygenerowanym przez maszyn kodem.</LI>
</UL>

Czowiek wygrywa poniewaz umie uywa maszyny.''
<P>
<H3>Jzyki ze zoptymalizowanymi kompilatorami</H3>

<P>Jzyki takie jak 
ObjectiveCAML, SML, CommonLISP, Scheme, ADA, Pascal, C, C++,
wsrd innych,
wszystkie maj wolne zoptymalizowane kompilatory,
ktre zoptymalizuj mas twoich programw,
i czsto bd lepsze ni rczny kod assemblera nawet dla szczelnych ptli,
umoliwiajc ci skoncentrowanie si na wysokopoziomowych szczegach,
i bez zakazywania ci zapania
kilku procent wykonania w wyej wymieniony sposb
w momencie gdy osigniesz stabilny rozwj.
Oczywicie, s take komercyjne zoptymalizowane kompilatory
dla wikszoci z tych jzykw.
<P>Pewne jzyki maj kompilatory produkujce kod w C,
ktry moe by dalej zoptymalizowany przez dany kompilator C.
Takimi s LIST, Scheme, Perl i wiele innych.
Prdko jest cakiem dobra.
<P>
<H3>Oglne zasady przypieszania twojego kodu</H3>

<P>W celu przyspieszenia kodu
powiniene robi zrobi to tylko dla fragmentw programu
ktre narzdzie profilujce konsekwentnie okrela
jako wskie gardo wykonania. 
<P>Std, jeli okrelisz fragmenty kodu jako zbyt wolne, powiniene
<UL>
<LI>najpierw sprbowa lepszego algorytmu;
</LI>
<LI>nastpnie sprbowa skompilowa go zamiast interpretowa;
</LI>
<LI>nastpnie sprbowa wczy optymalizacje twojego kompilatora;
</LI>
<LI>nastpnie da kompilatorowi wskazwki jak optymalizowa
(wypisywanie informacji w LISP-ie; uywanie rejestrw w GCC;
i peno innych opcji w wikszoci kompilatorw, itd).
</LI>
<LI>nastpnie mona cofn si do programowania w assemblerze</LI>
</UL>
<P>Na kocu, przed zejciem do pisania w assemblerze,
powiniene przeledzi wygenerowany kod,
sprawdzajc czy problem nie ley faktycznie w zej generacji kodu,
co jest moliwe ale nie w wypadkach:
kod wygenerowany przez kompilator moe by lepszy ni mgby napisa,
w szczeglnoci na nowoczesnych architekturach!
Wolne czci programu mog by rwnie zagmatwane.
Najwikszym problemem nowoczesnych architektur z szybkimi procesorami
s pewne opnienia dostpu do pamici, nietrafiony dostp do cache,
i TLB oraz bdy stronnicowania;
optymalizacja z uyciem rejestrw staje si wtedy mniej uyteczna,
i zyskaby wicej po przemyleniu struktury danych oraz wykorzystujc
wtkowanie gdy uzyskaby lepsze umiejscowienie w dostpie do pamici.
By moe poniej dopiero cakowicie odmienne spojrzenie na problem, pomoe go rozwiza.
<P>
<H3>Sprawdzanie kodu generowanego przez kompilator</H3>

<P>Jest wiele powodw do sprawdzenia kodu generowanego przez kompilator.
Tu jest zawarte co robi z takim kodem:
<UL>
<LI>sprawdzi czy generowany kod
moe by wzmocniony rcznym kodem assemblera
(lub przeczaniem przecznikw kompilatora)
</LI>
<LI>gdy zachodzi taka moliwo
rozpocz z tak wygenerowanego kodu i zmodyfikowa go;
zamiast rozpoczyna wszystko od pocztku
</LI>
<LI>bardziej oglnie, uywa generowanego kodu jako kawakw do modyfikacji,
ktry co najmniej daje waciw drog
twoim funkcjom w assemblerze interfejs do wiata zewntrznego 
</LI>
<LI>wyapa bdy w kompilatorze (oby jak najrzadziej)</LI>
</UL>
<P>Standardow metod uzyskania kodu assemblera 
jest wywoanie twojego kompilatora z flag <CODE>-S</CODE>.
Dziaa to dla wikszoci Unix-owych kompilatorw,
wczajc w to GNU C Compiler (GCC), ale YMMV.
Dla GCC, bardziej zrozumiay kod assemblera bdzie wyprodukowany
po uyciu opcji <CODE>-fverbose-asm</CODE>.
Oczywicie, jeli chcesz dosta dobry kod assemblera,
nie zapomnij uy opcji optymalizacji i wskazwek!
<P>
<H2><A NAME="s3">3. ASSEMBLERY</A></H2>

<P>
<P>
<H2>3.1 Inline Assemblera GCC</H2>

<P>Dobrze znany kompilator GNU C/C++ (GCC),
zoptymalizowany 32-bitowy kompilator bdcy sercem projektu GNU,
wspiera cakiem dobrze architektur x86,
wczajc w to zdolno wstawiania kodu assemblera w programach w C,
w sposb gdzie zarzdzanie rejestrami moe by wyspecyfikowane lub pozostawione GCC.
GCC dziaa na wikszoci dostpnych platform,
dla godnych uwagi Linux-a, *BSD, VST, OS/2, *DOS-a, WIN*, itd.
<P>
<H3>Gdzie znale GCC</H3>

<P>Orginalny adres GCC jest adresem FTP GNU
<A HREF="ftp://prep.ai.mit.edu/pub/gnu/">ftp://prep.ai.mit.edu/pub/gnu/</A>
razem ze wszystkimi wersjami aplikacji z projektu GNU.
Przekompilowane i skonfigurowane dla Linux-a wersje s w 
<A HREF="ftp://sunsite.unc.edu/pub/Linux/GCC/">ftp://sunsite.unc.edu/pub/Linux/GCC/</A>
Istnieje wiele kopii FTP obu adresw,
na caym wiecie a take na nonikach CD.
<P>Rozwj GCC zosta podzielony niedawno na dwie czci.
Wicej na temat eksperymentalnej wersji egcs mozna znale na
<A HREF="http://www.cygnus.com/egcs/">http://www.cygnus.com/egcs/</A><P>rda przystosowane do twojej ulubionego OS, oraz przekompilowane binaria
mona znale na zwykych adresach FTP.
<P>Najbardziej popularny port GCC dla DOS-a nosi nazw DJGPP
i moe by znaleziony w katalogach o takiej nazwie na adresach FTP. Zobacz:
<P>
<A HREF="http://www.delorie.com/djgpp/">http://www.delorie.com/djgpp/</A><P>Jest take port GCC na OS/2 nazwany EMX,
dziaajcy take pod DOS-em, 
zawierajcy wiele bibliotek emulujcych wywoania funkcji unix-a.
Zobacz:
<P>
<A HREF="http://www.leo.org/pub/comp/os/os2/gnu/emx+gcc/">http://www.leo.org/pub/comp/os/os2/gnu/emx+gcc/</A><P>
<A HREF="http://warp.eecs.berkeley.edu/os2/software/shareware/emx.html">http://warp.eecs.berkeley.edu/os2/software/shareware/emx.html</A><P>
<A HREF="ftp://ftp-os2.cdrom.com/pub/os2/emx09c/">ftp://ftp-os2.cdrom.com/pub/os2/emx09c/</A><P>
<H3>Gdzie znale dokumentacje GCC Inline Asm</H3>

<P>Dokumentacja GCC zawiera pliki w formacie texinfo.
Moesz przekompilowa je TeX-em i wydrukowa rezultat,
lub przekonwertowa je do .info i oglda emacs-em,
lub przekonwertowa je do .html.
Moesz przekonwertowa je (waciwymi narzdziami) do tego co lubisz najbardziej, lub czyta takie jakie s.
Pliki .info s oglnie dostarczane z kad dobr instalacj GCC.
<P>Waciw sekcj do sprawdzenia jest:
<CODE>C Extensions::Extended Asm::</CODE>
<P>Sekcja
<CODE>Invoking GCC::Submodel Options::i386 Options::</CODE>
moe by ci take pomocna.
W szczeglnoci, podaje ci specyficzne ograniczenia nazw rejestrw:
abcdSDB koresponduj do
<CODE>%eax</CODE>, <CODE>%ebx</CODE>, <CODE>%ecx</CODE>, <CODE>%edx</CODE>,
<CODE>%esi</CODE>, <CODE>%edi</CODE>, <CODE>%ebp</CODE>
wyczajc (nie ma litery dla <CODE>%esp</CODE>).
<P>Zasoby gier dla DJGPP (nie tylko dla hackerw gier) maj swoj stron
specjalnie o assemblerze:
<P>
<A HREF="http://www.rt66.com/~brennan/djgpp/djgpp_asm.html">http://www.rt66.com/~brennan/djgpp/djgpp_asm.html</A><P>Jest jeszcze strona www nazwana ``DJGPP Quick ASM Programming Guide'',
zawierajca od URL-i do FAQ,
AT&amp;T Skadnia ASM x86 ,
Pewne informacje o inline ASM,
i konwertowanie plikw .obj/.lib:
<P>
<A HREF="http://remus.rutgers.edu/~avly/djasm.html">http://remus.rutgers.edu/~avly/djasm.html</A><P>GCC zaley od GAS podczas assemblacji, i ledzi jego skadni (patrz poniej);
pamitajc e inline asm wymaga znakw procent podczas cytowania
by mogy przej do GAS.
Zobacz ponisz sekcj o GAS.
<P>Znajdziesz <EM>peno</EM> uytecznych przykadw w podkatalogu <CODE>linux/include/asm-i386/</CODE>
rde jdra Linux-a.
<P>
<H3>Jak waciwie wywoywa GCC z kodem inline assemblera.</H3>

<P>Poniewa funkcje assemblera w rdach jdra
(i bardzo prawdopodobnie twoje wasne nagwki,
jeli sprbujesz stworzy twoje oprogramowanie w assemblerze tak czyste
jak to jest w jdrze linuxa)
s osadzone w funkcjach <CODE>extern inline</CODE>,
GCC musi zosta wywony z <CODE>-O</CODE> flag (or <CODE>-O2</CODE>, <CODE>-O3</CODE>, itd),
by te funkcje byy dostpne.
Jeli nie, twj kod moe si skompiluje, ale nie zostanie waciwie zlinkowany,
gdy bdzie szuka funkcji <CODE>extern</CODE> ktre nie s inline
w bibliotekach z ktrymi twj program bdzie linkowany !!!.
Innym sposobem jest zlinkowanie z bibliotekimi zawierajcymi wycofane
wersje tych funkcji.
<P>Assemblacja inline moe zosta wyczona opcj <CODE>-fno-asm</CODE>,
ktra kae zaprzesta kompilatorowi dziaania gdy zostanie uyte rozszerzenie skadni o inline asm,
w przeciwnym wypadku wygeneruje wywoanie funkcji zewntrznej o nazwie <CODE>asm()</CODE>,
ktra nie zostanie waciwie rozwizana przez linker.
Opcja <CODE>-fasm</CODE> przywraca dziaanie sowa kluczowego <CODE>asm</CODE>.
<P>Bardziej oglnie, dobrymi opcjami dla GCC na platformie x86 s
<HR>
<PRE>
        gcc -O2 -fomit-frame-pointer -W -Wallpp
</PRE>
<HR>
<P><CODE>-O2</CODE> jest dobrym poziomem optymalizacji w wikszoci przypadkw.
<P>Optymalizacja ponadto zajmuje wicej czasu, otrzymujc kod ktry jest mocno duszy, ale tylko troch szybszy;
taka optymalizacja moe by uyteczna tylko dla ciasnych ptli (jeli takie s),
ktr moesz jakkolwiek zrealizowa w assemblerze.
W przypadkach gdy koniecznie potrzebujesz silnej optymalizacji ze strony kompilatora dla kilku plikw, rozwa uycie <CODE>-O6</CODE>.
<P><CODE>-fomit-frame-pointer</CODE> pozwala generowa kod omijajcy gupie
zarzdzanie ramk wskanikw, co daje mniejszy i szybszy kod,
i zwalnia rejestry do dalszych optymalizacji.
Wyklucza to atwe uycie narzdzi odpluskwiajcych (<CODE>gdb</CODE>),
ale kiedy chcesz ich uy, nie martw si o rozmiar i prdko kodu.
<P><CODE>-W -Wall</CODE> wcza generowanie wszytkich ostrzee i pomaga wychwyci
gupie bdy.
<P>Moesz doda specyficzne dla danego procecora <CODE>-m486</CODE> lub inne flagi tak, e
GCC wyprodukuje kod bardziej zaadaptowany dla danego komputera.
Zauwa, e EGCS (i chyba GCC 2.8) maj <CODE>-mpentium</CODE> i tego typu flagi,
podczas gdy GCC 2.7.x i starsze wersje nie.
Niezy wybr flag specyfikujcych procesor powinien by w jdrze Linux-a.
Sprawd dokumentacj texinfo o zainstalowanej u ciebie wersji GCC.
<P><CODE>-m386</CODE> pomoe zoptymalizowa wielko,
a take prdko na komputerach gdzie pami jest w peni wykorzystana,
odkd wielkie programy s przyczyn wymiany pamici,
jakakolwiek "optymalizacja" jest sensowna dla wikszego kodu.
Przy takich ustawieniach, moe by pomocne przestanie korzystania z C, 
i w zamian skorzystanie z jzyka uatwiajcego kod faktoryzujcy (przyp.tum.)
taki jak funkcjonalny jzyk i/lub FORTH;
i uywa implementacji bazujcej na wykorzystaniu bajtw i sw.
<P>Zapamitaj, e moesz uywa ronych flag dla rnych plikw,
wic uywaj maksymalnej optymalizacji tam, gdzie program wykonuje si najduej,
podczas gdy pozostae pliki optymalizuj pod wzgldem rozmiaru.
<P>Do optymalizacji moe by pomocna opcja <CODE>-mregparm=2</CODE>
i/lub korespondujce atrybuty funkcji,
ale mog stwarza wiele problemw podczas linkowania obcego kodu, 
<EM>wczaj w to libc</EM>.
S sposoby by waciwie zadeklarowa uycie obcych funkcji,
tak, e zostan wygenerowane waciwe wywoania,
lecz moesz by zmuszony rekompilowa obce biblioteki tak,
by uyway takich samych konwencji wywoa opartych na rejestrach...
<P>Zapamitaj, e moesz ustawi te flagi jako domylne edytujc plik
<CODE>/usr/lib/gcc-lib/i486-linux/2.7.2.3/specs</CODE>
lub gdziekolwiek on jest w twoim systemie (lepiej nie dodawaj tam -Wall).
Dokadn lokalizacj plikw specyfikatorw GCC w <EM>twoim</EM> systemie
moesz uzyska woaj <CODE>gcc -v</CODE>.
<P>
<H2>3.2 GAS</H2>

<P>GAS jest GNU Assemblerem, na ktrym opiera si GCC.
<P>
<H3>Gdzie go znale</H3>

<P>Znajdziesz go w tym samym miejscu gdzie GCC,
w paczce o nazwie binutils.
<P>
<H3>Jaka jest skadnia AT&amp;T </H3>

<P>W zwizku z tym, e GAS zosta pomylany by wspiera 32-bitowe kompilatory unixowe
uywa on standardowej skadni ``AT&amp;T'',
ktra skadni mocno przypomina standardowe assemblery m68k,
i jest standardem w wiecie UNIX-a.
Skadnia nie jest ani gorsza, ani lepsza ni skadnia ``Intel-owska''.
Jest po prostu inna.
Kiedy bdziesz zamierza uywa jej,
zauwaysz bardziej regularna skadni ni w Intel-u,
chocia troch nudniejsz. 
<P>Oto najwaniejsze ostrzeenia odnonie skadni GAS:
<UL>
<LI>Nazwy rejestrw s poprzedzone <CODE>%</CODE>, wic
wygld rejestrw <CODE>%eax</CODE>, <CODE>%dl</CODE> itd
zamiast tylko <CODE>eax</CODE>, <CODE>dl</CODE>, itd.
Dziki temu moliwe jest wczanie zewntrznych symboli w C bezporednio
w kodzie assemblera, bez zamieszania i koniecznoci 
stosowania okropnych podkrele jako przedrostkw.
</LI>
<LI>Kolejno operandw jest nastpujca: pierwsze rdo, ostatnie przeznaczenie,
w przeciwiestwie do konwencji intel-a, gdzie pierwsze jest przeznaczenie,
a ostatnie rdo.
Odtd, to co w skadni intel-a jest <CODE>mov ax,dx</CODE> (wstaw rejestr
<CODE>dx</CODE> w rejestr <CODE>ax</CODE> w skadni att bdzie wygldao nastpujco:
<CODE>mov %dx, %ax</CODE>.</LI>
<LI>Dugo operandu jest wyspecyfikowana przez przyrostek w nazwie instrukcji.
Przyrostkiem jest <CODE>b</CODE> dla (8-bitw) bajtu,
<CODE>w</CODE> dla (16-bitw) sowa, 
i <CODE>l</CODE> dla (32-bitw) podwjnego sowa.

Na przykad, waciw skadni powyszej instrukcji 
bdzie <CODE>movw %dx,%ax</CODE>.
Jakkolwiek, gas nie wymaga cisej skadni att,
wic przyrostek jest opcjonalny, kiedy dugo operandu moe by wywnioskowana z 
rejestrw, w przeciwnym przypadku, domylnie zostanie wstawiony 32-bitowy operand (z ostrzeeniem).
</LI>
<LI>Wymuszajce operandy zaznaczone s przyrostkami <CODE>$</CODE>,
tak jak w <CODE>addl $5,%eax</CODE>
(dodaj wymuszajce long dla warto 5 do rejestru <CODE>%eax</CODE>).
</LI>
<LI>Brak przedrostka w operandzie wskazuje, e jest to adres w pamici;
std <CODE>movl $foo,%eax</CODE>
wstawia zawarto <EM>adresu</EM> zmiennej <CODE>foo</CODE> w rejestr <CODE>%eax</CODE>,
ale <CODE>movl foo,%eax</CODE>
wstawia <EM>zawarto</EM> zmiennej <CODE>foo</CODE> w rejestr <CODE>%eax</CODE>.
</LI>
<LI>Indeksacja lub wskazanie porednie jest realizowane przez umieszczenie 
rejestru indeksowego lub wskazania poredniego (komrki wskazania
poredniego) w nawiasach,
np <CODE>testb $0x80,17(%ebp)</CODE>
(sprawdza najstarszy bit bajtu o offsecie 17
z komrki wskazanej przez <CODE>%ebp</CODE>). </LI>
</UL>
<P>Istnieje program pomagajcy w konwersji programw
ze skadni TASM do skadni AT&amp;T. Zobacz
<P>
<A HREF="ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2asv08.zip">ftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2asv08.zip</A><P>GAS ma obszern dokumentacj w formacie TeXinfo,
ktr mona znale co najmniej w dystrybucji rdowej.
Przegld wycignitych stron .info z Emacs-a lub innych programw.
Zdarzay si pliki o nazwach gas.doc lub as.doc
gdzie w pakietach rdowych GAS, ale zostay wczone w dokumentacje TeXinfo.
Oczywicie, w razie wtpliwoci, alternatywn dokumentacj
s same rda!
Sekcj, ktra szczeglnie ci zainteresuje to
<CODE>Machine Dependencies::i386-Dependent::</CODE>
<P>Znowu, rda Linux-a (jdra systemu), s dobrymi przykadami;
zobacz w linux/arch/i386, nastpujce pliki:
<CODE>kernel/*.S, boot/compressed/*.S, mathemu/*.S</CODE>
<P>Jeli piszesz jaki jzyk, pakiet obsugi wtkw, itd.
moesz obejrze jak inne jzyki (OCaml, gforth, itd.),
lub pakiety obsugi wtkw (QuickThreads, MIT pthreads, LinuxThreads, itd),
lub cokolwiek, zrb to.
<P>Na kocu, po prostu skompiluj program w C do assemblera
dziki czemu zobaczysz interesujc ci skadni.
Zobacz sekcj 
<A HREF="#doyouneedasm">Czy potrzebuj Assemblacji?</A>.
<P>
<H3>Ograniczony tryb 16-bitowy</H3>

<P>GAS jest 32-bitowym assemblerem, zadaniem ktrego jest wspomc 32-bitowy kompilator.
Aktualnie ma on jedno ograniczenie 16-bitowego trybu,
ktry zawiera niedokoczone uycie 32-bitowych przedrostkw do instrukcji,
tak wic piszesz 32-bitowy kod, ktry chodzi w 16-bitowym trybie na 32 bitowym procesorze.
W obu trybach, wspiera on 16-bitowe uywanie rejestrw,
ale nie wspiera 16-bitowego adresowania.
Uycie dyrektywy <CODE>.code16</CODE> and <CODE>.code32</CODE> przecza pomidzy trybami.
Zapamitaj, e dyrektywa inline assembly
<CODE>asm(&quot;.code16\n&quot;)</CODE>
pozwoli GCC wygenerowa 32-bitowy kod, ktry uruchomi si w trybie rzeczywistym!
<P>Stwierdziem ju, e wiksza cz kodu potrzebnego do penego wspomagania
16-bitowego trybu programowania zostaa dodana do GAS przez Bryan'a Ford'a (prosz o potwierdzenie?),
ale ostatecznie, nie pojawia si w adnej dystrybucji ktr sprawdziem,
a do binutils-2.8.1.x ... wicej informacji na ten temat bdzie mile widziane.
<P>Cienkim rozwizaniem jest definiowanie makr (patrz poniej), ktre produkuja
kod binarny (z <CODE>.byte</CODE>) ktry potrzebujesz tylko dla 16-bitowych instrukcji
(prawie adnych jeli uyjesz code16 jak powyej,
i moesz spokojnie zaoy, e kod bdzie dziaa na zgodnych 32-bitowych procesorach x86).
By znale waciwe kodowanie, moesz zainspirowa si
rdami 16-bitowych assemblerami.
<P>
<H2>3.3 GASP</H2>

<P>GASP jest Preprocesorem GAS.
Dodaje makra i troch milsz skadni do GAS.
<P>
<H3>Gdzie znale GASP</H3>

<P>GASP jest zawarty razem z GAS w archiwum GNU binutils. 
<P>
<H3>Jak to dziaa</H3>

<P>Dziaa jako filtr, w stylu cpp i jemu podobnym.
Nie pamitam szczegw, ale przychodzi on z wasn dokumentacj w texinfo,
wic przejrzyj j (w .info), wydrukuj, przeled (?).
GAS z GASP-em wedug mnie jest typowym makro-assemblerem.
<P>
<P>
<H2>3.4 NASM</H2>

<P>Projekt Netwide Assembler wypuszcza jeszcze jeden assembler,
napisany w C, ktry powinien by do modelowy
do ewentualnego wsparcia znanych skadni i formatw obiektw.
<P>
<H3>Gdzie znale NASM</H3>

<P>
<A HREF="http://www.cryogen.com/Nasm">http://www.cryogen.com/Nasm</A><P>Wersja binarna jest na kopii sunsite w 
<CODE>devel/lang/asm/</CODE>
Powinna by take dostpna jako .rpm lub .deb w dystrybucjach RedHat/Debian
w dystrybucyjnym contrib.
<P>
<H3>Co to robi</H3>

<P>W momencie pisania tego HOWTO, wersja NASM to 0.97.
<P>Skadnia jest w stylu Intel-a.
Cz makroprocesora jest zintegrowana.
<P>Wspierane formaty plikw obiektowych to 
<CODE>bin</CODE>, <CODE>aout</CODE>, <CODE>coff</CODE>, <CODE>elf</CODE>, <CODE>as86</CODE>,
(DOS) <CODE>obj</CODE>, <CODE>win32</CODE>, (ich wasny format) <CODE>rdf</CODE>.
<P>NASM moe by uywany jako wspomaganie dla wolnego kompilatora LCC
(pliki wspierajce s zawarte).
<P>NASM rozwija si zbyt szybko by to HOWTO byo aktualne.
Jeeli nie uywasz BCC jako 16-bitowego kompilatora
(ktry wykracza poza to 32-bitowe HOWTO),
powiniene uywa NASM zamiast powiedzmy AS86 lub MASM,
poniewa jest mocno wspierany online
i chodzi na wszystkich platformach.
<P>Uwaga: NASM przychodzi take z disassemblerem, NDISASM.
<P>Jego rcznie napisany parser powoduje, e pracuje szybciej ni GAS,
chocia oczywicie nie wspiera trzech bilionw rnych architektur.
Do x86, on powienien by assemblerem wyboru...
<P>
<H2>3.5 AS86</H2>

<P>AS86 jest 80x86 16- i 32-bitowym assemblerem i jest czci
kompilatora jzyka C (BCC) Bruce'a Evans'a. 
Ma on gwnie skadni Intel-owsk,
chocia rni si nieznacznie np w trybach adresowania.
<P>
<H3>Gdzie dosta AS86</H3>

<P>Cakowicie przestarzaa wersja AS86 jest dystrybuowana przez HJLu
tylko do kompilacji jdra Linux-a,
w pakiecie o nazwie bin86 (aktualna wersja 0.4),
dostpnej w dowolnym magazynie oprogramowania GCC dla Linux-a.
<P>Ale nie radz nikomu uywania go do czegokolwiek innego ni przekompilowania Linux-a.
Ta wersja wspiera tylko plik obiektowy hacked minix, 
ktry nie jest wspierany przez GNU binutils ani nic innego,
i ma par bdw w trybie 32-bitowym,
wic powieniene lepiej trzyma go tylko do kompilacji Linux-a. 
<P>Ostatnie wersje Bruce'a Evans'a (bde@zeta.org.au)
s publikowane wraz z dystrybucj FreeBSD.
No, byy: Nie mog znale rde z dystrybucji 2.1 na :(
Odtd, wkadam rda w moim miejscu:
<P>
<A HREF="http:///www.tunes.org/~fare/files/bcc-95.3.12.src.tgz">http:///www.tunes.org/~fare/files/bcc-95.3.12.src.tgz</A><P>Projekt Linux/8086 (aka ELKS) jest w pewnym stopniu pozostaoci bcc
(chocia nie sdze by zawiera 32-bitowe aty).
Obejrzyj
<A HREF="http://www.linux.org.uk/Linux8086.html">http://www.linux.org.uk/Linux8086.html</A>
<A HREF="ftp://linux.mit.edu/">ftp://linux.mit.edu/</A>.
<P>Midzy innymi, ostatnie wersje, w przeciwiestwie do HJLu's,
wspieraj Linux-owy format GNU a.out,
wic moesz linkowa twj kod z programami Linux-owymi, i/lub uywa zwykych
narzdzi z pakietu GNU binutil do manipulacji danymi.
Ta wersja moe ko-egzystowa bez szkody z poprzedni wersj 
(zobacz ponisze pytanie).
<P>BCC z 12 marca 1995 roku i wczeniejsze jego wersje maj brak skadnika jakim
jest odkadanie/pobieranie ze stosu rejestrw segmentowych jako 16-bitowych,
co jest uciliwe gdy programujesz w trybie 32-bitowym.
ata jest opublikowana w projekcie Tunes
<A HREF="http://www.tunes.org/">http://www.tunes.org/</A>
podstrona
<CODE>files/tgz/tunes.0.0.0.25.src.tgz</CODE>
w rozpakowanym katalogu
<CODE>LLL/i386/</CODE>
ata powinna by take dostpna bezporednio z 
<A HREF="http://www.tunes.org/~fare/files/as86.bcc.patch.gz">http://www.tunes.org/~fare/files/as86.bcc.patch.gz</A>
Bruce Evans zaakceptowa t at, wic jeli ktrego dnia pojawi si
nowa wersja bcc, powinna zawiera t at...
<P>
<H3>Jak wywoa assembler?</H3>

<P>
<P>Oto wpis GNU Makefile do uywania bcc
do transformacji <CODE>.s</CODE> asm
w oba GNU a.out <CODE>.o</CODE> obiekt
i <CODE>.l</CODE> listing:
<P>
<HR>
<PRE>
%.o %.l:        %.s
        bcc -3 -G -c -A-d -A-l -A$*.l -o $*.o $&lt;
</PRE>
<HR>
<P>Usu <CODE>%.l</CODE>, <CODE>-A-l</CODE>, and <CODE>-A$*.l</CODE>,
jeli nie chcesz listingu.
Jeli chcesz czego wicej ni GNU a.out, 
moesz przejrze dokumentacj bcc o wspieranych formatach, 
i/lub uy objcopy z pakietu GNU binutils.
<P>
<P>
<H3>Gdzie znale dokumentacje</H3>

<P>Dokumentacje ktre s, zawieraj si w pakiecie bcc.
Podrczniki s take dostpne gdzie pod adresem FreeBSD.
Kiedy masz wtpliwoci, rda same w sobie s czsto dobr dokumentacj:
to nie jest zbyt dobrze komentowane, ale styl programowania jest zrozumiay. 
Moesz sprbowa obejrze jak as86 jest uywany w Tunes 0.0.0.25...
<P>
<P>
<H3>Co jeli nie mog ju skompilowa Linux-a z now wersj ?</H3>

<P>Linus jest zasypywany listami i moja ata kompilujca Linux-a
z Linuxowym a.out as86 chyba do niego nie dotara (!) (od tum. trudno to przetumaczy - prosz o poprawki).
Teraz, nie powinno to mie znaczenia: trzymaj tylko as86 z pakietu bin86 
w /usr/bin i daj zainstalowa bcc dobry as86 w
/usr/local/libexec/i386/bcc/as
gdzie powinien by. Nie bdziesz nigdy woa wprost tego ``dobrego'' as86,
poniewa bcc robi wszystko waciwie, wczajc konwersj to Linux-owego a.out,
gdy jest wywoany z waciwymi opcjami;
wic assembluj pliki wycznie z bcc jako gownym assemblerem, nie bezporednio z as86.
<P>
<P>
<H2>3.6 INNE ASSEMBLERY</H2>

<P>To s inne, nieregularne, opcje,
w przypadku, gdy powysze ci niesatysfakcjonoway (dlaczego?),
ktrych nie zalecam w przypadku uytkowania (?),
ale mog udowodni uyteczno jeli assembler musi by zintegrowany
w oprogramowaniu ktre rozwijasz (np. OS lub aplikacje rozwojowe).
<P>
<P>
<H3>Win32Forth assembler</H3>

<P>Win32Forth jest <EM>wolnym</EM> 32-bitowym systemem ANS FORTH
ktry dziaa pod Win32s, Win95, Win/NT.
Zawiera wolny 32-bitowy assembler (zawiera przed/przyrostkow skadni)
zintegrowany w jzyku FORTH.
Przetwarzanie makr jest przez
pen moc jzyka FORTH;
jakkolwiek, jedynym wspieranym wejcia i wyjcia jest Win32For
(adnego zrzutu do plikw .obj -- moesz oczywicie doda to samemu).
Znajdziesz to na 
<A HREF="ftp://ftp.forth.org/pub/Forth/win32for/">ftp://ftp.forth.org/pub/Forth/win32for/</A><P>
<P>
<H3>Terse</H3>

<P>Terse jest narzdziem programowania dostarczajcym
<EM>NAJBARDZIEJ</EM> zwart skadnie assemblera
dla rodziny x86!
Zobacz 
<A HREF="http://www.terse.com">http://www.terse.com</A>.
Mwiono, e jest gdzie jaki wolny klon 
ktry zosta porzucony po pustych pretensjach, e skadnia
powinna by wasnoci autora;
i zapraszam ci do przejcia tego,
jeli taka skadnia ci interesuje.
<P>
<P>
<H3>Nie-wolne i/lub Nie-32bitowe x86 assemblery.</H3>

<P>Moesz znale wicej o nich,
wraz z podstawami programowania w assemblerze x86
w FAQ Raymond'a Moon'a dla comp.lang.asm.x86
<A HREF="http://www2.dgsys.com/~raymoon/faq/asmfaq.zip">http://www2.dgsys.com/~raymoon/faq/asmfaq.zip</A><P>Zapamitaj, e wszystkie bazujace na DOS-ie assemblery powinny pracowa w Linuxowym emulatorze DOS-u
tak dobrze jak inne podobne emulatory, wic jeli ju masz jaki
moesz go nadal uywa w prawdziwym OS.
Ostatnie assemblery bazujce na DOS-ie take wspieraj COFF i/lub inne formaty 
plikw obiektowych, ktre s wspierane przez bibliotek GNU BFD,
wic moesz uywa ich razem z wolnymi 32-bitowymi wolnymi narzdziami,
by moe uywaj GNU objcopy (cz binutils) jako filtr konwertujcy.
<P>
<P>
<H2><A NAME="s4">4. METAPROGRAMOWANIE/MAKROPRZETWARZANIE</A></H2>

<P>Assemblacja programw jest nudna,
ale do krytycznych czci programw.
<P>Powiniene uywa waciwego narzdzia do waciwego zadania,
wic nie wybieraj assemblacji kiedy nie jest stosowna;
C, OCAML, perl, Scheme, mog by lepszym wyborem dla wikszoci
twojego programowania.
<P>Jakkolwiek, s wypadki gdy te narzdzia nie daj ci 
wystarczajcej kontroli nad maszyn, i assemblacja jest wtedy uyteczna i konieczna.
W takich wypadkach, docenisz system makroprzetwarzania i metaprogramowania
ktre pozwol ci wraca do raz przygotowanych wzorcw z ktrych
kady z nich jest przygotowany jako wielokrotna definicja,
co pozwala bezpiecznie programowa i automatycznie przechodzi modyfikacj takich wzorcw itd.
"Goy" assembler jest czsto niewystarczajcy,
nawet jeli chcesz robi tylko mae operacje w poczeniu z C.
<P>
<H2>4.1 Co jest zintegrowane w powyszym</H2>

<P>Tak, wiem e ta sekcja nie zawiera uytecznych informacji.
Masz swobod do prowadzenia jej, jeli odkryjesz co ciekawego...
<P>
<P>
<H3>GCC</H3>

<P>GCC pozwala (i wymaga) wyspecyfikowa ograniczenia rejestrw
w twoim kodzie ``inline assembly'', wic optymalizer zawsze wie o tym.
W ten sposb, assemblacja kodu inline jest tak naprawd realizowana przez wzorce,
a nie wymuszana. 
<P>Pniej moesz umieci twj kod assemblera w makrach CPP,
i funkcjach inline w C,
wic kady moe uy go jako funkcje w C lub makro.
<P>Funcje inline s bardzo podobne do makr, ale s czasami czystsze w uyciu.
Strze si tych wypadkw, kod bdzie zduplikowany,
tak wic tylko lokalne etykiety (w stylu <CODE>1:</CODE>) powinny by definiowane w kodzie assemblera.
Jakkolwiek, makro powinno pozwoli nazwie dla nie lokalnej etykiety
by przekazan jako parametr (lub inaczej, powinienes uywa dodatkowych
meta-programowych metod).
Zapamitaj take, e rozejcie si kodu jako inline assemblera bdzie potencjalnie rozprowadza nim bdy, 
wic uwaaj dokadnie w kwestii ogranicze rejestu w kodzie inline asm.
<P>Ostatecznie, jzyk C w sobie moe by rozwaany jako dobra abstrakcja 
programowania w assemblerze,
co przyniesie ci ulg z wikszoci kopotw z assemblacj.
<P>Strze si pewnych optymalizacji ktre zawile przekazuj argumenty do funkcji;
przez rejestry mog powodowa niedopasowanie tych funkcji do wywoa 
z zewntrznych (w szczeglnoci rcznie napisanego kodu assemblera) funkcji
w standardowy sposb; atrybut "asmlinkage" moe chroni 
funkcj przed kopotami z tak flag optymalizacyjn;
obejrzyj rda jdra linux-a dla przykadw.
<P>
<H3>GAS</H3>

<P>GAS ma moliwo wczania pewnych makr, jak opisano w dokumentacji texinfo.
Oprcz tego, podczas gdy GCC rozpoznaje pliki .s jako surowy assembler do wysania do GAS,
take rozpoznaje pliki .S jako pliki do przepuszczenia przez CPP przed
wpuszczeniem ich do GAS.
Znowu, znowu, zobacz rda Linux-a dla przykadw.
<P>
<P>
<H3>GASP</H3>

<P>Dodaje wszelkie uyteczne dodatki makroassemblacji do GAS.
Obejrzyj jego dokumentacj texinfo.
<P>
<P>
<H3>NASM</H3>

<P>NASM take zawiera pewne wsparcie makr.
Zobacz dokumentacj.
Jeli masz jakie dobre pomysy,
moesz chcie skontaktowa si z autorami,
jako, e oni aktywnie go rozwijaj.
W midzyczasie, zobacz poniej zewntrzne filtry.
<P>
<P>
<H3>AS86</H3>

<P>On take ma troch prostego wsparcia makrami, ale nie mogem nigdzie znale dokumentacji.
Teraz rda s bardzo przejrzyste,
wic jeli jeste zainteresowany, atwo powieniene je zrozumie.
Jeli potrzebujesz wicej ni tylko baz, powiniene uy zewntrznego filtra
(zobacz poniej).
<P>
<P>
<H3>INNE ASSEMBLERY</H3>

<P>
<UL>
<LI>Win32FORTH:
CODE i END-CODE s normalne wic nie przeczaj ich z trybu interpretacji
to trybu kompilacji, bdziesz mia wtedy dostp do caej mocy FORTH
podczas assemblacji.</LI>
<LI>TUNES:
nie dziaa jeszcze, ale jzyk Scheme jest prawdziwym wysokopoziomowym jzykiem
ktry pozwala na meta-programowanie.</LI>
</UL>
<P>
<P>
<H2>4.2 Zewntrzne Filtry</H2>

<P>Jakiekolwiek jest wsparcie makr twojego assemblera,
lub jakikolwiek jzyk uywasz (nawet C !),
jeli jzyk nie jest dla ciebie wystarczajco wyrazisty,
moesz chcie przepuci pliki przez zewntrzny filtr
z reguami w Makefile takimi jak te:
<P>
<HR>
<PRE>
%.s:    %.S other_dependencies
        $(FILTER) $(FILTER_OPTIONS) &lt; $&lt; > $@
</PRE>
<HR>
<P>
<P>
<H3>CPP</H3>

<P>CPP nie jest bardzo wyrazisty, ale wystarczajcy do wielu atwych rzeczy,
jest standardem, i jest przezroczycie wywoywany przez GCC.
<P>Dla przykadu jego ogranicze, nie moesz deklarowa obiektw, takich e
destruktory wywoywane automatycznie na kocu deklarowanego bloku;
nie moesz wic zmienia kierunki widocznoci, itd. 
<P>CPP przychodzi wraz z kompilatorem C. Jeli mgby robi to bez niego,
nie zawracaj sobie gowy przynoszeniem CPP (chocia myl jakby mg).
<P>
<P>
<H3>M4</H3>

<P>M4 daje ci pen moc makroprzetwarzania, 
z jzykiem rwnym Turingowi, rekursj, wyraeniami regularnymi, itd.
Moesz robi wszystko czego CPP nie.
<P>Zobacz macro4th/This4th z
<A HREF="ftp://ftp.forth.org/pub/Forth/">ftp://ftp.forth.org/pub/Forth/</A> in Reviewed/ ANS/ (?),
lub rda Tunes 0.0.0.25 jako przykady 
zaawansowanego makroprogramowania z uyciem m4.
<P>Jakkolwiek, jego niefunkcjonalna semantyka cytowania i odcytowywania zmusza ci do uywania
jawnego ogonkowo-kontynuacyjno-przejciowego (przyp. tum.) stylu makr jeli
chcesz robi <EM>zaawansowane</EM> makro programowanie
(czego przypomnieniem jest TeX -- BTW, czy kto prbowa uywa TeX-a jako
makroprocesora do czego innego ni typesetting ?)
To NIE jest gorsze ni CPP, ktry nie pozwala na cytowanie i rekursj.
<P>Waciw wersj m4 jest GNU m4 1.4 (lub pniejsza jeli istnieje)
ktra zawiera wikszo skadnikw i mniej bdw lub ogranicze.
m4 zosta pomylany jakko wolny do czegokolwiek ale prosty w uyciu,
moe by wic nadal dobry dla wikszoci programw w assemblerze
(chyba nie piszesz programw z milionami linii w assemblerze?).
<P>
<P>
<H3>Makroprzetwarzanie z twoim wasnym filtrem</H3>

<P>Moesz pisa twj wasny prosty filtr rozszerzajcy makra
z uyciem zwykych narzdzi: perl, awk, sed, itd.
To jest szybki sposb i moesz wszystko kontrolowa.
Ale oczywicie, moc makroprzetwarzania musi co kosztowa.
<P>
<P>
<H3>Metaprogramowanie</H3>

<P>Zamiast uywania zewntrznych filtrw ktre rozszerzaj makra, 
jedn z drg jest pisanie programw, ktre pisz cz
lub cao innych programw.
<P>Dla przykadu, mgby uy programu produkujcego kod rdowy
<UL>
<LI>do generowania tablic sinus/cosinus/cokolwiek,</LI>
<LI>do wycigania reprezentacji rdowej pliku binarnego,</LI>
<LI>do kompilacji bitmap w szybkie funkcje wywietlajce,</LI>
<LI>do wycigania dokumentacji, kodu pocztkowego/kocowego,
tablic opisowych, tak dobrze jak normalnego kodu z samych plikw rdowych,</LI>
<LI>do zwykego kodu assemblera, generowanego ze skryptw perl/shell/scheme
ktre robi przetwarzanie,</LI>
<LI>do rozchodzenia danych zdefiniowanych w jednym punkcie
w rne krzyowe wg odwoa tablice i nagwki.</LI>
<LI>itd.</LI>
</UL>

Pomyl o tym!
<P>
<P>
<H3>Cz wspomagajca z dostpnych kompilatorw</H3>

<P>Kompilatory takie jak SML/NJ, Objective CAML, MIT-Scheme, itd,
maj wasn cz wspomagajc assembler,
ktr moesz ale nie musisz wykorzystywa,
jeli zamierzasz generowa kod pautomatycznie
z wymienionych jzykw.
<P>
<P>
<H3>Zestaw narzdzi Machine-Code z New-Jersey</H3>

<P>Jest projekt, uywajcy jzyka programowania Icon,
do budowy podstawowych rzeczy do produkcji manipulacji na kodzie assemblera.
Zobacz
<A HREF="http://www.cs.virginia.edu/~nr/toolkit/">http://www.cs.virginia.edu/~nr/toolkit/</A><P>
<P>
<H3>Tunes</H3>

<P>Projekt Tunes OS rozwija swj wasny assembler
jako rozszerzenie jzyka Scheme i 
jako cz procesu rozwojowego.
Nie dziaa to jeszcze, ale pomoc jest widziana.
<P>Assembler manipuluje symbolicznymi drzewami skadni,
wic moesz prawie mie podstaw do translacji skadni assemblera, 
disassembler, wspln cz wspomagajc assembler/kompilator, itd.
Take, pena moc jzyka Scheme
czyni go nie do pokonania z makroprzetwarzaniem/metaprogramowaniem.
<P>
<A HREF="http://www.tunes.org/">http://www.tunes.org/</A><P>
<P>
<H2><A NAME="s5">5. KONWENCJE WYWOA</A></H2>

<P>
<P>
<P>
<H2>5.1 Linux</H2>

<P>
<P>
<H3>Poczenie z GCC</H3>

<P>To jest preferowany sposb.
Sprawd dokumentacj i przykady GCC z plikw <CODE>.S</CODE> jdra Linux-a
ktre s przepuszczane przez gas (nie takie, ktre s przepuszczane przez as86).
<P>32-bitowe argumenty s odkadane na stos w odwrotnej kolejnoci wystpowania
(std dostp / pobieranie jest we waciwej kolejnoci),
zwracajc bliski 32-bitowy adres. 
<CODE>%ebp</CODE>, <CODE>%esi</CODE>,
<CODE>%edi</CODE>, <CODE>%ebx</CODE> s zapamitywane, 
inne rejestry te s zapamitywane podczas wywoania;
<CODE>%eax</CODE> jest uywany do przechowywania wyniku,
a <CODE>%edx:%eax</CODE> do przechowywania wynikw 64-bitowych.
<P>FP stack: Nie jestem pewien,
ale myl e wynik jest w <CODE>st(0)</CODE>, cay stos jest zapamitany.
<P>Pamitaj, e GCC ma opcje modyfikujce konwencje wywoa
przez rezerwowanie rejestrw, przekazywanie argumentw w rejestrach,
nie uywanie FPU, itd. Sprawd strony .info i386.
<P>Pamitaj, e musisz zadeklarowa atrybut <CODE>cdecl</CODE>
dla funkcji uywajcych standardowej konwencji wywoa GCC
(nie wiem co daje uycie zmodyfikowanej konwencji wywoa).
Zobacz w stronach info GCC sekcj:
<CODE>C Extensions::Extended Asm::</CODE>
<P>
<P>
<P>
<H3>ELF kontra a.out - problemy</H3>

<P>Pewne kompilatory poprzedaj podkreleniem kady symbol,
podczas gdy inne nie.
<P>W szczeglnoci, Linux-owy GCC a.out ma takie poprzedniki,
podczas gdy Linux-owy ELF GCC nie.
<P>Jeli musisz poradzi sobie z wykorzystaniem obu formatw
zobacz jak robi to istniejce pakiety.
Dla przykadu, we stare drzewo rdowe Linux-a
z pakietami Elk, qthreads lub OCAML...
<P>Moesz take nadpisa niejawnie C<CODE>-&gt;</CODE>asm zmieniajc nazw
przez wstawienie wyrae takich jak to
<HR>
<PRE>
        void foo asm(&quot;bar&quot;) (void);
</PRE>
<HR>

by upewni si, e wywoanie funkcji C foo bdzie zabronione w assemblerze.
<P>Zapamitaj, e program <CODE>objcopy</CODE>, z pakietu <CODE>binutils</CODE>,
powinien pozwoli ci przekonwertowa obiekty a.out w obiekty ELF,
i by moe w przeciwn stron take, w pewnych wypadkach.
Bardziej oglnie, program ten realizuje konwersj formatw wielu plikw.
<P>
<P>
<H3>Bezporednie wywoania systemowe Linux-a</H3>

<P>To <EM>NIE</EM> jest rekomendowane, 
poniewa konwencje zmieniaj si od czasu do czasu
od jdra do jdra (cf L4Linux),
dodatkowo to nie jest przenone,
i niezyskowne w pisaniu biorc pod uwag libc,
I wycza poprawki i rozszerzenia ktre pojawiaj si w libc,
takie, jak np. biblioteka <CODE>zlibc</CODE>,
ktra w locie przezroczycie dekompresuje spakowane gzip-em pliki.
Standardem i rekomendowan drog wywoa systemowych usug Linux-a jest
i tak zostanie, przejcie przez libc.
<P>Obiekty dzielone powinny trzyma twoje programy maymi.
I jeli naprawd chcesz mniejszych binariw, uywaj <CODE>#!</CODE> ,
z interpretera majcego nad sob wszystko czego nie chcesz w swoich
binariach.
<P>Teraz, jeli z pewnych powodw
nie chcesz linkowa programw z libc
we si za ni i zrozum jak dziaa!
Po tym wszystkim, nadal zamierzasz zamieni j ?
<P>Moesz zerkn take jak mj
<A HREF="ftp://ftp.forth.org/pub/Forth/Compilers/native/unix/Linux/linux-eforth-1.0c.tgz">eforth 1.0c</A>
robi to.
<P>rda Linux-a s take uyteczne, 
szczeglnie plik nagwkowy asm/unistd.h 
ktry opisuje jak wywoywa funkcje systemowe...
Podstawowo, wywoujesz  <CODE>int $0x80</CODE>
z <CODE>__NR_</CODE>numerem funkcji systemowej (z <CODE>asm/unistd.h</CODE>)
w <CODE>%eax</CODE>,
i parametrami (do piciu) w 
<CODE>%ebx</CODE>, <CODE>%ecx</CODE>, <CODE>%edx</CODE>,
<CODE>%esi</CODE>, <CODE>%edi</CODE>.
Rezultat jest zwracany w <CODE>%eax</CODE> 
z wartoci ujemn w przypadku bdu
ktrej przeciwn warto libc umieszcza w errno.
Stos uytkownika jest nietknity
wic nie musisz mie go waciwego podczas wywoania systemowego.
<P>
<P>
<H3>I/O pod Linux-em</H3>

<P>Jeli chcesz korzysta bezporednio z I/O pod Linux-em
jest co prostego co nie uzalenia od OS,
i powiniene obejrze  <CODE>IO-Port-Programming</CODE> mini-HOWTO;
lub potrzebuje to sterownik urzdzenia, powiniene sprbowa nauczy si o
amaniu jdra, rozwijaniu sterownikw urzdze, moduw jdra itd,
dla ktrych s inne wspaniae HOWTO i dokumenty z LDP.
<P>W szczeglnoci, jeli chcesz zaj si programowaniem Grafiki
przycz si do projektu GGI:
<A HREF="http://www.ggi-projectorg/">http://www.ggi-projectorg/</A><P>Jakkolwiek, we wszystkich przypadkach, zrobisz lepiej uywajc GCC inline assembly
z makrami z linux/asm/*.h, ni piszc pliki rdowe w samym assemblerze.
<P>
<P>
<H3>Dostp do 16-bitowych sterownikw z Linux-a/i386</H3>

<P>Taka rzecz jest teoretycznie moliwa
(dowd: zobacz jak DOSEMU moe selektywnie dawa dostp portw do urzdze programom), i syszaem pogosk e kto gdzie ju to zrobi
(w sterowniku PCI? W dostpie do VESA ? ISA PnP ? nie wiem).
Jeli masz wicej precyzyjnych informacji na ten temat 
bda mile widziane.
Jakkolwiek, by uzyska wicej informacji dobrymi miejscami s rda jdra Linuxa,
rda DOSEMU (i innych programw w 
<A HREF="ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/">DOSEMU repository</A>),
oraz rda rnych niskopoziomowych programw dziaajcych pod Linux-em...
(by moe GGI jeli wspiera standard VESA).
<P>Zasadniczo, musisz uywa 16-bitowego trybu chronionego lub trybu vm86.
<P>Na pocztku jest w miar prosto to ustawi, ale bdzie to dziaa tylko z dobrze-zrobionym kodem
The first is simpler to setup, but only works with well-behaved code
nie wykorzystujcym jakiejkolwiek arytmetyki segmentowej
that won't do any kind of segment arithmetics
lub bezwzgldnego adresowania segmentu (w szczeglnoci adresowania segmentu 0),
or absolute segment addressing (particularly addressing segment 0),
do czasu zmian e wszystkie uywane segmenty mog by ustawione w zaawansowany
sposb w LDT.
<P>Pniej pozwala si na wiksz zgodno z vanilla 16-bitowym otoczeniem (? przyp.tum.),
ale wymaga to bardziej skomplikowanej manipulacji.
<P>W obu przypadkach, przed wykonaniem skoku do 16-bitowego kodu 
musisz
<UL>
<LI>mmap kady absolutny adres uywany w 16-bitowym kodzie
(taki jak ROM, bufory video, docelowe DMA, i mapowane-do-pamici I/O)
z /dev/mem to przestrzeni adresowej twojego procesu,</LI>
<LI>ustawi LDT i/lub monitor trybu vm86.</LI>
<LI>pobra waciwe prawa dostpu do I/O z jdra (patrz powysza sekcja)</LI>
</UL>

I znowu, ostronie czytaj rda do rzeczy zawartych
w powyszych informacjach o magazynie DOSEMU,
w szczeglnoci te mini-emulatory
do uruchomiania ELKS i/lub prostych programw .COM pod Linux-em/i386.
<P>
<P>
<H2>5.2 DOS</H2>

<P>Wikszo DOS-owych extenderw zawiera interfejs do usug DOS-a.
Poczytaj dokumentacje na ich temat,
ale czsto, symuluj one tylko <CODE>int $0x21</CODE> i inne,  
wic robisz ``jakby'' by w trybie rzeczywistym
(mam wtpliwoci czy nie s tylko cznikami
i rozszerzaj rzeczy by pracoway z 32-bitowymi operandami;
najczciej s tylko przejciem w przerwanie
do trybu rzeczywistego lub przez uchwyt vm86).
<P>Dokumentacja na temat DPMI i inne (oraz znacznie wicej) moesz znale na 
<A HREF="ftp://x2ftp.oulu.fi/pub/msdos/programming/">ftp://x2ftp.oulu.fi/pub/msdos/programming/</A><P>DJGPP przychodzi z wasn (ograniczon) glibc pochodn/podzestawem/wymienion, take.
<P>Jest moliwa cross-kompilacja z Linux-a do DOS-a,
zobacz katalog devel/msdos/ najbliszej kopii FTP serwera sunsite.unc.edu
Zobacz take ekstender-dosa MOSS z projektu Flux w utah.
<P>Inne dokumenty i FAQ s bardziej skoncentrowane na DOS-ie.
Nie zalecamy rozwoju pod DOS.
<P>
<P>
<H2>5.3 Winwybuchy i takie</H2>

<P>(od tum. Autor tego dokumentu nie przepada za Windows, susznie zreszt,
i dlatego cz tej podsekcji nie bdzie mile widziana przez zwolennikw
tego systemu :).
Hej, ten dokument zawiera tylko wolne oprogramowanie.
Zadzwo kiedy Winwybuchy stan si wolne,
lub gdzie bd dostpne wolne narzdzia do tego!
<P>No, po tym wszystkim, jest :
<A HREF="http://www.cygnus.com">Cygnus Solutions</A>
rozwijajcy bibliotek cygwin32.dll,
dla programw GNU to uruchomienia pod platformami MakroGwna.
<P>Jakkolwiek, moesz uywa GCC, GAS, wszytkich narzdzi GNU,
i wielu innych Unix-owych aplikacji.
Zerknij na ich stron domow.
Ja (Far) nie zamierzam rozszerza Losedoze (od tum. Windows -> Windoze -> 
Losedoze (Lose) - przegrywa) programowania.
ale jestem pewny e wszdzie moesz znale peno dokumentw na tem temat...
<P>
<P>
<H2>5.4 Twj wasny OS</H2>

<P>Kontrola jest tym co przyciga wielu programistw do assemblacji,
chccych najczciej rozwija OS co prowadzi lub pochodzi od amania w assemblerze.
Zapamitaj, e kady system pozwalajcy na samorozwj moe by okrelony jako "OS"
nawet mimo tego, e moe chodzi "nad" pracujcym systemem z wielozadaniowoci lub I/O (takim jak Linux na Mach lub OpenGenera na Unix-ie), itd. 
Std, dla atwiejszego usuwania bdw,
moesz rozwija twj ``OS'' najpierw jako proces chodzcy
pod Linux-em (pomimo powolnego dziaania), a potem uy
<A HREF="http://ww.cs.utah.edu/projects/flux/">Flux OS kit</A>
(co daje moliwo uycia sterownikw Linux-a i BSD w twoim wasnym OS)
by zrobi go niezalenym.
Gdy twj OS jest stabilny, jest jeszcze czas by napisa 
sterowniki jeli naprawd to lubisz.
<P>To HOWTO nie zawiera wewntrz tematw takich jak
kod Boot loadera &amp; wchodzenie w tryb 32-bitowy, 
Zarzdzanie Przerwaniami,
Podstawy o intelowskim ``trybie chronionym'' lub ``V86/R86'', 
definiowania twoich formatw obiektw i konwencji wywoa.
Gwnym miejscem gdzie moesz znale pochodne informacje o tym wszystkim
to kody rdowe istniejcych OS i bootloaderw.
Masa wskanikw jest na poniszej stronie WWW:
<A HREF="http://www.tunes.org/~tunes/doc/Review/OSes.html">http://www.tunes.org/~tunes/doc/Review/OSes.html</A><P>
<P>
<H2><A NAME="s6">6. DO ZROBIENIA &amp; WSKAZANIA</A></H2>

<P>
<P>
<UL>
<LI>wypeni niekompletne sekcje</LI>
<LI>doda wicej wskanikw na oprogramowanie i dokumentacj</LI>
<LI>doda proste przykady z ycia do zilustrowania skadni, mocy,
i ogranicze proponowanych rozwiza.</LI>
<LI>poprosi ludzi o pomoc w tym HOWTO</LI>
<LI>znale kogo kto ma czas by przej zarzdzanie tym HOWTO</LI>
<LI>by moe napisa par sw o assemblacji na innych platformach?
</LI>
<LI>Troch wskaza (dodatkowo oprcz tych ju wymienionych w tym HOWTO)
<UL>
<LI>
<A HREF="http://www.intel.com/design/pentium/manuals/">podrczniki pentium</A></LI>
<LI>
<A HREF="http://www.xs4all.nl/~feldmann">bdy cpu w rodzinie x86</A></LI>
<LI>
<A HREF="http://www.eng.ufl.edu/ftp">hornet.eng.ufl.edu dla koderw w assemblerze</A></LI>
<LI>
<A HREF="ftp://ftp.luth.se/pub/msdos/demos/code/">ftp.luth.se</A></LI>
<LI>
<A HREF="ftp://zfja-gate.fuw.edu.pl/cpu/protect.mod">PM FAQ</A></LI>
<LI>
<A HREF="http://www.fys.ruu.nl/~faber/Amain.html">Strona Assemblera 80x86</A></LI>
<LI>
<A HREF="http://www.cit.ac.nz/smac/csware.htm">Courseware</A></LI>
<LI>
<A HREF="http://www.ee.ucl.ac.uk/~phart/gameprog.html">programowanie gier</A></LI>
<LI>
<A HREF="http://bewoner.dma.be/JanW">eksperymenty z programowaniem w linux-ie w tylko-asm</A></LI>
</UL>
</LI>
<LI>I oczywicie, uywa twoich zwykych Internetowych Narzdzi Przeszukiwa
by znale wicej informacji,
i da mi zna jeli znajdziesz co interesujcego!</LI>
</UL>
<P>
<P>Author's .sig:
<PRE>
## Far | VN: Уng-V Bn   | Join the TUNES project!  http://www.tunes.org/ ##
## FR: Franois-Ren Rideau |    TUNES is a Useful, Not Expedient System     ##
## Reflection&amp;Cybernethics  | Project for a Free Reflective Computing System ##
</PRE>
<P>
<H2><A NAME="s7">7. Od tumacza</A></H2>

<P> To jest pierwsze tumaczenie tego HOWTO. Z pewnoci zawiera ono mas bdw
i niektre sentencje mog mie inne znaczenie ni ja im nadaem. Dlatego prosz o email jeli znajdziesz jakie bdy (merytoryczne, gramatyczne i inne). 
Postaram si poprawi dokument w jak najkrtszym czasie i opublikowa. 
Uwagi i komentarze lij na 
<A HREF="mailto:wegorz@bydgoszcz.pkobp.pl">Zbigniew Micha Kempczyski</A>. Szczeglne podzikowania skadam mojej koleance <EM>Annie Dzieniszewskiej</EM> za pomoc w trudnych gramatycznych kawakach tego tekstu.
Jeli kto wie jak przetumaczy <EM>Legal Blurp</EM> to prosz o email.
<P>
</BODY>
</HTML>