Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2018
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .686
  2. .model flat
  3.  
  4. extern _ExitProcess@4 : PROC
  5. extern __read : PROC
  6. extern __write : PROC
  7. public _main
  8.  
  9. .data
  10. max dd 0
  11. ile_liczb dd 0
  12. indeks dd ?
  13. obszar db 10 dup (?)
  14. znaki db 10 dup (?)
  15. dziesiec dd 10
  16. .code
  17.  
  18. _wczytajEAX PROC  
  19.     ;-EAX bo do niego chcemy wczytac
  20.     ;-ebp bo nie modyfikujemy bazy stosu
  21.     ;-esp bo go nigdy nie modyfikujemy w podprogramie bo powrot
  22.     push ebx
  23.     push ecx
  24.     push edx
  25.     push esi
  26.     push edi
  27.    
  28.     push dword ptr 12 ;liczba znakow
  29.     push dword ptr offset obszar ;adres tekstu
  30.     push dword ptr 0 ;nr urzadzeniu tu klawiatura
  31.     call __read  
  32.     add esp,12 ;usuniecie parametrow ze stosu
  33.  
  34.     mov eax, 0 ;zerujemy eax
  35.     mov ebx, 0 ;indeks
  36.     mov ecx, 0 ;rejest do wczytywania liczby
  37.     ptl:
  38.     mov cl, obszar[ebx] ;wczytaj kolejna cyfre do cl
  39.     cmp cl, 0AH ;sprawdz czy nie enter
  40.     jz koniec ;jesli tak to koniec wczytywania
  41.     mul dziesiec ;pomnoz na poczatku razy 10
  42.     sub cl, 30H ;jesli nie to konwertuj na inta
  43.     add eax, ecx  ;dodaj do wyniku jako jednosci
  44.     inc ebx ;zwiekszamy indeks
  45.     jmp ptl
  46.  
  47.     koniec:
  48.     pop edi
  49.     pop esi
  50.     pop edx
  51.     pop ecx
  52.     pop ebx
  53.     ret
  54.  
  55. _wczytajEAX ENDP
  56.  
  57. wyswietl_EAX PROC
  58.     pusha
  59.  
  60.     mov esi,10 ;indeks w tablicy znaki
  61.     mov ebx,10 ;dzielnik
  62.  
  63. konwersja:
  64.     mov edx,0 ;wyczyszczenie reszty
  65.     div ebx ;podzielenie zawartosci rejestru eax przez dzielnik znajdujacy sie w rejestrze ebx
  66.     add dl,30h ;zamiana cyry na kod ASCII w celu jej wyswietlenia
  67.     mov znaki[esi],dl ;przesuniecie wartosci z dl do tablicy znakow pod odpowiedni indeks
  68.     dec esi ;zmniejszenie indeksu w tablicy znakow
  69.     cmp eax,0 ;porownanie eax z 0 aby sprawdzic czy jest cos jeszcze do podzielenia
  70.     jne konwersja
  71.  
  72. wyswietl:
  73.     mov byte PTR znaki[esi],0Ah ;dodanie znaku nowej linii
  74.     mov byte PTR znaki[11],0h ;dodanie identyfikatora konca ciagu znakow
  75.     lea eax,[znaki+esi] ;ustalenie adresu ostatnio wpisanej cyfry
  76.     mov edx,12
  77.     sub edx,esi ;ustalenie ilosci znakow do wyswietlenia
  78.     push  edx ;liczba znakow do wyswietlenia   
  79.     push  dword PTR eax ;adres miejsca pod ktorym znajduja sie znaki do wyswietlenia
  80.     push  1
  81.     call __write
  82.     add esp,12 ;czyszczenie stosu
  83.  
  84.     popa
  85.     ret
  86. wyswietl_EAX ENDP
  87.  
  88. _main PROC
  89.     call _wczytajEAX ;ile liczb wczytujemy
  90.     mov ile_liczb, eax ;zapisujemy
  91.     call _wczytajEAX ;ile ktory indeks wczytujemy
  92.     mov indeks, eax ;wsadzamy indeks potrzebny
  93.     mov max, 0
  94.     mov ebx, 0 ;indeks
  95.     ptl:
  96.         call _wczytajEAX
  97.         cmp ebx, indeks ;sprawdzamy czy juz zaczynamy porownywac
  98.         jb koniec ;jesli nie to zwiekszamy indeks i wczytujemy kolejna liczbe
  99.         cmp max, eax ;jesli tak to sprawdzamy czy wczytana liczba jest wieksza od obecnego maxa
  100.         ja koniec ;jesli nie to idziemy na koniec
  101.         mov max, eax ;jesli tak to przesuwamy ja do maxa
  102.         koniec:
  103.         inc ebx ;zwiekszamy indeks ebx
  104.         cmp ebx, ile_liczb ;sprawdzamy czy nie przestac wczytywac
  105.         jnz ptl
  106.     mov eax, max ;przesuwamy max do eax
  107.     call wyswietl_EAX
  108.     push 0
  109.     call _ExitProcess@4
  110. _main ENDP
  111. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement