(Kodowanie polskich znaków diakrytycznych: UTF-8) -=(* ReverseCraft Assembler #3 - EFLAGS, skoki *)=- 1. Zgadnij liczbe! Napisz w asm x86 (32-bit) program który losuje pewną liczbę z przedziału 1 do 100, a następnie użytkownik ma zgadnąć ów liczbę. Program ma pytać użytkownika o liczbę, a następnie wypisać czy liczba którą wylosował jest mniejsza, większa czy równa tej podanej przez użytkownika, i tak dopóki użytkownik nie zgadnie liczby. Do wylosowania liczby możesz użyć funkcji rand() lub analogicznej a jakiejś biblioteki (3pkt) lub napisać własną funkcję zwracającą liczbę pseudolosowa (6pkt). Dozwolone jest również zaimplementowanie istniejącego już algorytmu PRNG (również 6pkt). Podczas pisania zwróć uwagę na komentarze oraz czytelność kodu. 2. Które z poniższych zdań są PRAWDZIWE, a które FAŁSZYWE? Uzasadnij swój wybór, tj. napisz dlaczego dane zdanie uważasz za prawdziwe/fałszywe. a) Rejestr EFLAGS jest 32-bitowy, więc jest podzielony na 32 flagi, po jeden bit każda b) Flaga OF, czyli Overflow Flag, sygnalizuje przepełnienia bufora (słynny błąd Buffer Overflow) c) Istnieją dwie różne flagi, których skrót to AF: Adjust Flag, oraz Auxilary Carry Flag d) Tylko 6 flag z rejestru EFLAGS wykorzystuje się przy instrukcjach warunkowych (Jcc, SETcc, CMOVcc, etc) e) W trybie real-mode zamiast rejestru EFLAGS używa się rejestr FLAGS, który ma 16-bitów (w kóncu real-mode jest 16-bitowy); FLAGS jest w rzeczywistości fragmentem EFLAGS f) CMP (ang. Clear Memory Protection) służy do wyłączenia ochrony pamięci przed zapisem. Przykładowo, "CMP EAX, EBX" włączy możliwość zapisu pamięci RAM od adresu zawartego w EAX, do adresu zawartego w EBX. 3. Tłumaczenia! Przetłumacz poniższe fragmenty pseudo kodu na asm x86 (32-bit): a) Zmienne: A - całkowita B - całkowita Kod: IF A > B THEN PRINT "A jest wieksze do B" ELSE IF B > A THEN PRINT "B jest wieksze od A" ELSE PRINT "A i B sa rowne" b) Zmienne: A - naturalna B - naturalna Kod: taki sam jak w a) c) Zmienne: A - naturalna B - naturalna Kod: B = 0x4040 IF AND(A,B) != 0 THEN A = 0x1234 ELSE B = 0x1234 d) Zmienne: A - naturalna B - naturalna Kod: A += B IF WYNIK NIE ZMIEŚCIŁ SIĘ W A THEN A = 1 e) Zmienne: A - całkowita B - całkowita Kod: taki sam jak w d) f) Zmienne: A - całkowita Kod: IF A < 0 THEN B = A 4. Programowanie! Napisz w assemblerze funkcję która wypisuje stan flag OF, CF, ZF, PF i SF z momentu wywołania funkcji. Pomyśl o użyciu instrukcji PUSHFD lub LAHF do zapisania stanu flag. Napisz również program który zademonstruje użycie powyższej funkcji w kilku przypadkach.