Re: zmniejszenie WinSxS

Autor: Grzegorz Niemirowski <gnthexfiles_at_poczta.onet.pl>
Data: Wed 02 Sep 2009 - 21:27:06 MET DST
Message-ID: <h7mgub$2fnp$1@opal.icpnet.pl>
Content-Type: text/plain; format=flowed; charset="iso-8859-2"; reply-type=response

Sempiterna <rzopa@amorki.pl> napisał(a):
> Której OIDP definicję, czy jak to się nazywa, tworzysz w deklaracji, a ma
> służyć jedynie ułatwieniu, zamiast pisać "skocz do 0x45385652", definiowac
> ten adres jako etykietę np. "Basia" i pisać "skocz do Basia". Oglądając
> asembler windziany, nie mogę się oprzeć wrażeniu, że skaczę nie do Basi,
> jak wyżej, tylko do całej procedury, która może być mi na plaster... No,
> truuudno, skoro tego wymaga wielozadaniowość...

Mieszasz różne pojęcia. Wywołanie funkci to nie jest sam skok, to też m.in.
odłożenie parametrów na stos.
Nie mam pojęcia co rozumiesz pod pojęciem windzianego asemblera. Windows nie
jest napisany w asemblerze, jedynie mały fragment jego jądra. Podobnie jest
w innych systemach. Nie wiem co ma wielozadaniowość do asemblera. Prawdę
mówiąc w ogóle nie wiem po co poruszyłeś temat tego jęzka.

>> Bardzo polecam poczytać
>> http://thedailywtf.com/Articles/That-Wouldve-Been-an-Option-Too.aspx
> To przy okazji. Mnie chodziło o to, by (nie bij, przykłady będą totalnie
> błędne, chodzi mi jednak o przedstawienie sprawy, a do tego wystarczą)
> program niej-więcek taki:
> label Basia=0x4566527
> LDA $A021 ; zaladuj akumulator wartością z komórki
> CMP $FACD ; porównaj z komórką o adresie...
> INA ; zwiększenie akumulatora o jeden
> BNE Basia ; Skocz do Basia, jeśli nie równe
> JMP $FCE2 ; Skocz do...
> Aby nie skutkowało to wynikiem o objętości wielokilobajtowej, tylko tyle,
> co wynika z kodu.
> Jak zobacze pod C (czy którąś z odmian), że kompilacja (mam na myśli
> objętość kodu wejściowego)
> main
> {
> printf (cuś tam, np. dzień dobry)
> }
> nie spowodowała doklejenia tej, tej, tamtej i jeszcze 10 innych,
> niepotrzebnych tu bibliotek.

Znów mieszasz bo porównujesz instrukcję warunkową z wywołaniem funkcji
bibliotecznej. Ponadto zapominasz chyba, że w kodzie asemblerowm również
woła się różne funkcje oferowane przez system operacyjny. To, że kod jest
napisan w asemblerze wcale nie oznacza, że wszystko robi sam. Jak chcesz z
poziomu asemblera coś wyświetlić? Będziesz mazać po pamięci karty
graficznej?
Co do linkowania bibliotek to nie widzę problemu. Co za różnica czy exe ma
10 czy 20 kB? To nie wpływa na wydajność. Odnośnie rozmiaru plików
wykonwalnch to polecam poszukać odpowiedniego wątku na pl.comp.programming

> Zdaje sobie z tego sprawę, że w zunifikowanym systemie, jakim jest
> Windows, czy nawet Linux, nie jest to takie proste, jak pod DOSem, gdzie
> program skacze do procecury, a potem instrukcją RET, albo analogiczną,
> zwraca sterowanie systemowi (nie mówię o programach rezydentnych, choć w
> C64 udało mi się już podpiąć pod obsługę klawiatury zmianę koloru brzegów
> ekranu, zależnie od naciśniętego klawisza).

A to pod Windowsem czy Linuksem jakoś inaczej się skacze? Tak samo możesz
sobie skoczyć do etykiety.

> Tu jeszcze forma okienka, przyciski, kolory, kształty... ale ile to w
> sumie zje? Skoro działający program wcale nie najboższy, może mieć kilka,
> kilkanaście kilobajtów, to czemu się spotyka programy mogące tyle samo, a
> mające niekiedy po kilkaset kilobajtów, czy nawet ponad megabajt...? Co
> ten dodatkowy kod robi, chyba nie karmi procesora truskawkami? Rozumiem,
> że np. do obróbki dużych projektów trzeba zarezerwowac dużo pamieci, bo
> dane muszą się gdzieś pomieścić, ale czy od razu sam program musi od wuja
> aż tyle miejsca zajmować? Przecież to tylko dodatkowa robota dla proca, a
> jak nie, to zbędne bajty, które mogły być spożźytkowane pożyteczniej w
> innym miejscu...

To już się programistów pytaj co ten kod robi. System wcale nie każe
kompilatorowi generować wielkiego kodu. Poza tym pamiętaj, że w programie
może być nie tylko kod napisan przez Ciebie ale także sprawdzający wyjątki,
np. wyjście poza zakres tablicy.

> To nie jest problem wczorajszy, żebym był choć trochę sprawiedliwy...
> W Turbo Pascal 3.0 skompilowanie: (to już powinno działać, mimo, że
> ostatni raz macałem to jakieś 18 lat temu)
> program hej;
> begin;
> Writeln ('Dzień dobry, jak szanowne zdrowie?');
> end.
> dawało wynik ok. 30 kilobajtów kodu... po ch... ja się zapytam?
> Podobna rzecz w asemblerze zajęła cos koło 37 bajtów, może 100... A
> działała tak samo, dokładnie tak samo...
> Już Turbo 7.0 jest lepszy, bo jego kompilat, właśnie sprawdziłem, nawet
> zadzialał, zajął ok. 2.2 kB.
> Jeśli więc program może zająć 100 bajtów (dobra, dołożę drugie 100 na
> podprogramy kontrolne dołączane przez kompilator), to po co ma zajmować 30
> kilo, czy choćby 2.2?

Widocznie są linkowane statycznie jakieś biblioteki. Jak nie chcesz ich
używać to nie używaj, tylko potem będziesz musiał pisać wszystko sam. Pomyśl
co się stanie jak w swoim przkładzie dodasz jeszcze wświetlanie wartości
jakiejś zmiennej. Kod w asmie Ci się rozrośnie, w TP będzie taki sam.

Jeszcze raz napiszę, że dziwne wydaje mi się to skojarzenie: asembler -
robimy wszystko sami, język wysokiego poziomu: używam bibliotek. Jak np. w
asemblerze pod Windows wyświetlisz okienko? Korzystając z WinAPI:

 ;
 ; ===========================================================
 ; \Win32ASM\Src\SzDialog\SzDialog.asm
 ; ===========================================================
 ; Adam Błaszczyk
 ; "Win32ASM. Asembler w Windows"
 ; Wydawnictwo Helion, 2004
 ; ===========================================================
 ; Kompilacja : "r.bat", "d.bat", "nmake"
 ; Opis : Szablon programu opartego na dialogu
 ; ===========================================================

 include ..\..\makro.inc ; dołączamy definicje makr

 INCLUDEX kernel32 ; używamy KERNEL32
 INCLUDEX user32 ; używamy USER32

 ID_DLG_MAIN = 100

.data? ; dane niezainicjalizowane
 hInstance dd ?

.data ; dane zainicjalizowane

.code ; segment kodu (sekcja kodu)

   DlgProc proc hDlg,uMsg,wParam,lParam:DWORD
     pushad

     .IF uMsg==WM_CLOSE
       invoke EndDialog,hDlg,0

     .ELSEIF uMsg==WM_COMMAND

     .ENDIF

     popad
     xor eax,eax
     ret
   DlgProc endp

   Start: ; początek programu

     invoke GetModuleHandle,NULL
     mov hInstance,eax

     invoke DialogBoxParam,hInstance,ID_DLG_MAIN,0,ADDR DlgProc,0

     invoke ExitProcess,0 ; powrót z programu

END Start ; tu zaczyna się program

-- 
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i aktualności ze świata Outlook Express: grzegorz.net/oe
Uptime: 1 day, 19 hours, 52 minutes and 57 seconds 
Received on Wed Sep 2 21:30:06 2009

To archiwum zostało wygenerowane przez hypermail 2.1.8 : Wed 02 Sep 2009 - 21:42:01 MET DST