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 © 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 <fare@tunes.org>
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&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&T </H3>
<P>W zwizku z tym, e GAS zosta pomylany by wspiera 32-bitowe kompilatory unixowe
uywa on standardowej skadni ``AT&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&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(".code16\n")</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 $<
</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) < $< > $@
</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>-></CODE>asm zmieniajc nazw
przez wstawienie wyrae takich jak to
<HR>
<PRE>
void foo asm("bar") (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 & 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 & 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&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>
|