Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .686    ; bedziemy uzywac intelowskiego procka x86
  2. .model flat ; architektura pamieci - plaska. Brak rozdzielenia na segmenty
  3.                         ; FLAT oznacza ze wszystkie 3 segmenty sa sobie rowne i zaczynaja sie od 0
  4. ;CS - Code segment
  5. ;DS - Data segment
  6. ;SS - Stos segment
  7. extern _ExitProcess@4 : PROC
  8. extern __write : PROC
  9. extern __read :PROC
  10. ; obszar danych programu
  11. .data
  12.         ; deklaracja tablicy 12-bajtowej do przechowywania
  13.         ; tworzonych cyfr
  14.     znaki db 12 dup (?)
  15.     obszar db 12 dup (?)
  16.     dziesiec dd 10 ; mnożnik
  17.     dekoder db '0123456789ABCDEF'
  18. .code
  19.  
  20. wyswietl_EAX PROC
  21.     pusha
  22.    
  23.     mov esi, 10 ; indeks w tablicy 'znaki'
  24.     mov ebx, 10 ; dzielnik równy 10
  25.  
  26.     konwersja:
  27.     mov edx, 0  ; zerowanie starszej części dzielnej
  28.     div ebx     ; dzielenie przez 10, reszta w EDX,
  29.                 ; iloraz w EAX
  30.     add dl, 30H ; zamiana reszty z dzielenia na kod
  31.                 ; ASCII
  32.     mov znaki [esi], dl ; zapisanie cyfry w kodzie ASCII
  33.  
  34. dec esi         ; zmniejszenie indeksu
  35. cmp eax, 0      ; sprawdzenie czy iloraz = 0
  36. jne konwersja   ; skok, gdy iloraz niezerowy
  37.  
  38. ; wypełnienie pozostałych bajtów spacjami i wpisanie
  39. ; znaków nowego wiersza
  40. wypeln:
  41.     or esi, esi
  42.     jz wyswietl ; skok, gdy ESI = 0
  43.     mov byte PTR znaki [esi], 20H ; kod spacji
  44.  
  45. dec esi ; zmniejszenie indeksu
  46. jmp wypeln
  47.  
  48. wyswietl:
  49.     mov byte PTR znaki [0], 0AH ; kod nowego wiersza
  50.     mov byte PTR znaki [11], 0AH ; kod nowego wiersza
  51.     ; wyświetlenie cyfr na ekranie
  52.     push dword PTR 12 ; liczba wyświetlanych znaków
  53.     push dword PTR OFFSET znaki ; adres wyśw. obszaru
  54.     push dword PTR 1; numer urządzenia (ekran ma numer 1)
  55.     call __write ; wyświetlenie liczby na ekranie
  56.     add esp, 12 ; usunięcie parametrów ze stosu
  57.  
  58.     popa
  59.     ret
  60. wyswietl_EAX ENDP
  61.  
  62. wyswietl_EAX_hex PROC
  63.         ; wyświetlanie zawartości rejestru EAX
  64.         ; w postaci liczby szesnastkowej
  65.     pusha ; przechowanie rejestrów
  66.  
  67.         ; rezerwacja 12 bajtów na stosie (poprzez zmniejszenie
  68.         ; rejestru ESP) przeznaczonych na tymczasowe przechowanie
  69.         ; cyfr szesnastkowych wyświetlanej liczby
  70.     sub esp, 12
  71.     mov edi, esp ; adres zarezerwowanego obszaru pamięci
  72.  
  73.         ; przygotowanie konwersji
  74.     mov ecx, 8 ; liczba obiegów pętli konwersji
  75.     mov esi, 1 ; indeks początkowy używany przy zapisie cyfr
  76.     mov ebx, 0
  77.         ; pętla konwersji
  78. ptl3hex:
  79.         ; przesunięcie cykliczne (obrót) rejestru EAX o 4 bity w lewo
  80.         ; w szczególności, w pierwszym obiegu pętli bity nr 31 - 28
  81.         ; rejestru EAX zostaną przesunięte na pozycje 3 - 0
  82.     rol eax, 4
  83.         ; wyodrębnienie 4 najmłodszych bitów i odczytanie z tablicy
  84.         ; 'dekoder' odpowiadającej im cyfry w zapisie szesnastkowym
  85.     cmp ebx, 0
  86.     je koniec
  87.     mov ebx, eax ; kopiowanie EAX do EBX
  88.     and ebx, 0000000FH ; zerowanie bitów 31 - 4 rej.EBX
  89.     jednak_cyfra:
  90.     mov dl, dekoder[ebx] ; pobranie cyfry z tablicy
  91.         ; przesłanie cyfry do obszaru roboczego
  92.     mov ebx, 10000000H
  93.     koniec:
  94.     cmp ebx, 0
  95.     jne nierobnic
  96.     mov ebx, eax ; kopiowanie EAX do EBX
  97.     and ebx, 0000000FH ; zerowanie bitów 31 - 4 rej.EBX
  98.     cmp ebx, 0
  99.     jne jednak_cyfra
  100.     mov dl, 20H
  101.  
  102.     nierobnic:
  103.     mov [edi][esi], dl
  104. inc esi ;inkrementacja modyfikatora
  105. loop ptl3hex ; sterowanie pętlą
  106.         ; wpisanie znaku nowego wiersza przed i po cyfrach
  107.         dec esi
  108.         mov bl, 0
  109.         mov ecx, esi
  110.         mov esi, 1
  111. ;usuwanie_zer:
  112.     ;mov bl, [edi][esi]
  113.     ;cmp bl, 30H
  114.     ;jne wyskocz
  115.     ;mov byte PTR [edi][ecx], 20H
  116. ;inc esi
  117. ;loop usuwanie_zer
  118. ;wyskocz:
  119.     mov esi, ecx
  120.     add ecx, 1
  121.     mov byte PTR [edi][0], 10
  122.     mov byte PTR [edi][9], 10
  123.         ; wyświetlenie przygotowanych cyfr
  124.     push 10 ; 8 cyfr + 2 znaki nowego wiersza
  125.     push edi ; adres obszaru roboczego
  126.     push 1 ; nr urządzenia (tu: ekran)
  127.     call __write ; wyświetlenie
  128.         ; usunięcie ze stosu 24 bajtów, w tym 12 bajtów zapisanych
  129.         ; przez 3 rozkazy push przed rozkazem call
  130.         ; i 12 bajtów zarezerwowanych na początku podprogramu
  131.     add esp, 24
  132.  
  133.     popa ; odtworzenie rejestrów
  134.     ret ; powrót z podprogramu
  135. wyswietl_EAX_hex ENDP
  136.  
  137. wczytaj_do_EAX_hex PROC
  138.         ; wczytywanie liczby szesnastkowej z klawiatury – liczba po
  139.         ; konwersji na postać binarną zostaje wpisana do rejestru EAX
  140.         ; po wprowadzeniu ostatniej cyfry należy nacisnąć klawisz
  141.         ; Enter
  142.     push ebx
  143.     push ecx
  144.     push edx
  145.     push esi
  146.     push edi
  147.     push ebp
  148.         ; rezerwacja 12 bajtów na stosie przeznaczonych na tymczasowe
  149.         ; przechowanie cyfr szesnastkowych wyświetlanej liczby
  150.     sub esp, 12 ; rezerwacja poprzez zmniejszenie ESP
  151.  
  152.     mov esi, esp ; adres zarezerwowanego obszaru pamięci
  153.     push dword PTR 10 ; max ilość znaków wczytyw. liczby
  154.     push esi ; adres obszaru pamięci
  155.     push dword PTR 0; numer urządzenia (0 dla klawiatury)
  156.     call __read ; odczytywanie znaków z klawiatury
  157.         ; (dwa znaki podkreślenia przed read)
  158.     add esp, 12 ; usunięcie parametrów ze stosu
  159.     mov eax, 0 ; dotychczas uzyskany wynik
  160.  
  161. pocz_konw:
  162.     mov dl, [esi] ; pobranie kolejnego bajtu
  163.     inc esi ; inkrementacja indeksu
  164.     cmp dl, 10 ; sprawdzenie czy naciśnięto Enter
  165.     je gotowe ; skok do końca podprogramu
  166.     ; sprawdzenie czy wprowadzony znak jest cyfrą 0, 1, 2 , ..., 9
  167.     cmp dl, '0'
  168.     jb pocz_konw ; inny znak jest ignorowany
  169.     cmp dl, '9'
  170.     ja sprawdzaj_dalej
  171.     sub dl, '0' ; zamiana kodu ASCII na wartość cyfry
  172.  
  173. dopisz:
  174.     shl eax, 4 ; przesunięcie logiczne w lewo o 4 bity
  175.     or al, dl ; dopisanie utworzonego kodu 4-bitowego
  176.          ; na 4 ostatnie bity rejestru EAX
  177.     jmp pocz_konw ; skok na początek pętli konwersji
  178.         ; sprawdzenie czy wprowadzony znak jest cyfrą A, B, ..., F
  179.  
  180. sprawdzaj_dalej:
  181.     cmp dl, 'A'
  182.     jb pocz_konw ; inny znak jest ignorowany
  183.     cmp dl, 'F'
  184.     ja sprawdzaj_dalej2
  185.     sub dl, 'A' - 10 ; wyznaczenie kodu binarnego
  186.     jmp dopisz
  187.         ; sprawdzenie czy wprowadzony znak jest cyfrą a, b, ..., f
  188.  
  189. sprawdzaj_dalej2:
  190.     cmp dl, 'a'
  191.     jb pocz_konw ; inny znak jest ignorowany
  192.     cmp dl, 'f'
  193.     ja pocz_konw ; inny znak jest ignorowany
  194.     sub dl, 'a' - 10
  195.     jmp dopisz
  196. gotowe:
  197.         ; zwolnienie zarezerwowanego obszaru pamięci
  198.     add esp, 12
  199.  
  200.     pop ebp
  201.     pop edi
  202.     pop esi
  203.     pop edx
  204.     pop ecx
  205.     pop ebx
  206.     ret
  207. wczytaj_do_EAX_hex ENDP
  208.  
  209. _main PROC
  210.  
  211.     call wczytaj_do_EAX_hex
  212.  
  213.     call wyswietl_EAX
  214.  
  215.     push 0
  216.     call _ExitProcess@4
  217.  
  218.  
  219. _main ENDP
  220. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement