; Program wypisujacy flagi w postaci dwojkowej ; ; Autor: Bogdan D. ; kontakt: bogdandr (at) op (dot) pl ; ; kompilacja: ; nasm -f elf flagi.asm ; ld -s -o flagi flagi.o ; ; Copyright (C) 2005-2007 Bogdan 'bogdro' Drozdowski, bogdandr @ op . pl ; ; Ten program jest wolnym oprogramowaniem; mozesz go rozpowszechniac ; i/lub modyfikowac zgodnie z licencja GNU Lesser General Public License ; (GNU LGPL) w wersji wydanej przez Fundacje Wolnego Oprogramowania; ; wedlug wersji 3 Licencji lub (jesli wolisz) jednej z pozniejszych wersji. ; ; Ten program jest udostepniany z nadzieja, ze bedzie uzyteczny, lecz ; BEZ JAKIEJKOLWIEK GWARANCJI; nawet domyslnej gwarancji PRZYDATNOSCI ; HANDLOWEJ albo PRZYDATNOSCI DO OKRESLONYCH ZASTOSOWAN. W celu uzyskania ; blizszych informacji - Licencja GNU Lesser General Public License. ; ; Z pewnoscia wraz z niniejszym programem otrzymales tez egzemplarz ; Licencji GNU Lesser General Public License; jesli nie - napisz do ; Fundacji Wolnego Oprogramowania: ; Free Software Foundation ; 51 Franklin Street, Fifth Floor ; Boston, MA 02110-1301 ; USA section .text ; tu zaczyna się segment kodu, nie jest ; to potrzebne global _start ; nazwa punktu rozpoczecia programu ;CPU 386 ; będziemy tu uzywac rejestrow 32-bitowych. ; Nie jest to potrzebne, gdyz ; NASM domyslnie wlacza wszystkie mozliwe ; instrukcje. _start: ; etykieta pocztatku programu pushfd ; 32 bity flag ida na stos pop esi ; flagi ze stosu do ESI mov eax, '0' mov ebx, nasze_flagi ; EBX = adres bufora dla wartosci flag xor edi, edi ; EDI = 0 mov cx, 32 ; tyle bitow i tyle razy trzeba ; przejsc przez petle petla: ; etykieta oznaczajaca poczatek petli. and al, '0' ; upewniamy sie, ze AL zawiera tylko 30h='0', ; co zaraz sie moze zmienic. Dokladniej, ; czyscimy bity 0-3, z ktorych bit 0 moze ; sie zaraz zmienic shl esi, 1 ; Przesuwamy bity w ESI o 1 w lewo. 31-szy bit ; ESI idzie do CF adc al, 0 ; ADC-add with carry.Do AL dodaj 0+wartosc CF. ; jeśli CF (czyli 31 bit ESI)=1, to AL:=AL+1, ; inaczej AL bez zmian mov [ebx+edi], al ; zapisz AL w buforze add edi, 1 loop petla ; przejdź na początek petli, jesli ; nie skonczylismy mov eax, 4 ; funkcja zapisywania do pliku/na ekran mov ebx, 1 ; 1 = ekran mov ecx, nasze_flagi mov edx, 32 ; dlugosc tekstu int 80h ; wypisz na ekran mov byte [nasze_flagi],0ah mov eax, 4 ; funkcja zapisywania do pliku/na ekran mov ebx, 1 ; 1 = ekran mov ecx, nasze_flagi mov edx, 1 ; dlugosc tekstu int 80h ; wypisz na ekran przejście do nowej linii mov eax, 1 int 80h ; wyjscie z programu section .data ; dane juz nie moga być w sekcji kodu, gdyz ; w Linuksie sekcja kodu programu jest ; chroniona przed zapisem nasze_flagi times 32 db '0' ; '0' = 30h