Advertisement
Sylv3rWolf

zadaniezlabek1

Oct 22nd, 2015
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;Aplikacja korzystająca z otwartego okna konsoli
  2. .MODEL flat, STDCALL
  3. ;----------- stałe
  4. STD_INPUT_HANDLE                     equ -10
  5. STD_OUTPUT_HANDLE                    equ -11
  6. ;----------- koniec deklaracji stałych
  7.  
  8. ;----------- prototypy metod
  9. ExitProcess PROTO :DWORD
  10. GetStdHandle PROTO :DWORD
  11. CharToOemA    PROTO :DWORD,:DWORD
  12. WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  13. ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  14. lstrlenA PROTO :DWORD
  15. wsprintfA PROTO C :VARARG
  16. ;----------- konieć prototypów metod
  17.  
  18. ;------------- these are included by default in linker settings
  19. ;includelib .\lib\user32.lib
  20. ;includelib .\lib\kernel32.lib
  21. ;-------------
  22.  
  23.  
  24. ;------------- początek segmentu danych w kótrym alokujemy miejsca w pamięci
  25. .data
  26.     printed         dword   0 ;bufor do przechowywania liczby wyświetlonych znaków
  27.     inserted        dword   0 ;bufor do przechowywania liczby wprowadzonych znaków
  28.  
  29.  
  30.     header          byte    "Autor: Dominika Wojtaszewska",0
  31.     sizeH           dword   $ - header
  32.  
  33.     introdution1    byte    0Dh,0Ah,"Wprowadź liczbę a",0
  34.     sizeI1          dword   $ - introdution1
  35.  
  36.     introdution2    byte    0Dh,0Ah,"Wprowadź liczbę b",0
  37.     sizeI2          dword   $ - introdution2
  38.  
  39.     introdution3    byte    0Dh,0Ah,"Wprowadź liczbę c",0
  40.     sizeI3          dword   $ - introdution3
  41.  
  42.     introdution4    byte    0Dh,0Ah,"Wprowadź liczbę d",0
  43.     sizeI4          dword   $ - introdution4
  44.  
  45.     function        byte    0Dh,0Ah,"A*B-C/D = %ld",0
  46.     sizeF           dword   $ - function
  47.  
  48.     varA            dword   0
  49.     varB            dword   0
  50.     varC            dword   0
  51.     varD            dword   0
  52.  
  53.     cin             dword   ?
  54.     cout            dword   ?
  55.  
  56.     bufor           byte    128 dup(?)
  57.     rbuf            dword   128
  58.  
  59. ;------------- koniec segmentu danych
  60.  
  61. ;------------- początek segmentu kodu
  62. .code
  63.     main proc ;początek procedury głównej, której nazwe określiliśmy wcześniej w parametrach linkera
  64.            
  65.             ;pobranie uchwytów do okna
  66.             push STD_INPUT_HANDLE
  67.             call GetStdHandle
  68.             mov cin, eax
  69.    
  70.             push STD_OUTPUT_HANDLE
  71.             call GetStdHandle
  72.             mov cout, eax
  73.             ;konieć pobierania uchwytów
  74.  
  75. ;----------- wyświetlanie informacji o autorze aplikacji
  76.             push offset header
  77.             push offset header
  78.             call CharToOemA
  79.  
  80.             push 0
  81.             push offset printed
  82.             push sizeH
  83.             push offset header
  84.             push cout
  85.             call WriteConsoleA
  86. ;----------- koniec informacji o autorze aplikacji
  87.  
  88. ;----------- wyświetlenie zaproszenia do wprowadzenia parametru A
  89.             push offset introdution1
  90.             push offset introdution1
  91.             call CharToOemA
  92.  
  93.             push 0
  94.             push offset printed
  95.             push sizeI1
  96.             push offset introdution1
  97.             push cout
  98.             call WriteConsoleA
  99. ;----------- koniec wyświetlania zaproszenia
  100.  
  101. ;----------- zczytanie parametru A z klawiatury
  102.             push    0       ; rezerwa, musi być zero
  103.             push    OFFSET inserted     ; wskaźnik na faktyczną liczba wprowadzonych znaków
  104.             push    rbuf        ; rozmiar bufora
  105.             push    OFFSET bufor ;wskażnik na bufor
  106.             push    cin     ; deskryptor buforu konsoli
  107.             call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
  108.             lea   EBX,bufor
  109.             mov   EDI,inserted
  110.             mov   BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  111.         ;--- przekształcenie A
  112.             push    OFFSET bufor
  113.             call    ScanInt
  114.             mov varA, EAX
  115. ;----------- koniec zczytywania parametru A z klawiatury
  116.  
  117. ;----------- wyświetlenie zaproszenia do wprowadzenia parametru B
  118.             push offset introdution2
  119.             push offset introdution2
  120.             call CharToOemA
  121.  
  122.             push 0
  123.             push offset printed
  124.             push sizeI2
  125.             push offset introdution2
  126.             push cout
  127.             call WriteConsoleA
  128. ;----------- koniec wyświetlania zaproszenia
  129.  
  130. ;----------- zczytanie parametru B z klawiatury
  131.             push    0       ; rezerwa, musi być zero
  132.             push    OFFSET inserted     ; wskaźnik na faktyczną liczba wprowadzonych znaków
  133.             push    rbuf        ; rozmiar bufora
  134.             push    OFFSET bufor ;wskażnik na bufor
  135.             push    cin     ; deskryptor buforu konsoli
  136.             call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
  137.             lea   EBX,bufor
  138.             mov   EDI,inserted
  139.             mov   BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  140.         ;--- przekształcenie A
  141.             push    OFFSET bufor
  142.             call    ScanInt
  143.             mov varB, EAX
  144. ;----------- koniec zczytywania parametru B z klawiatury
  145.  
  146. ;----------- wyświetlenie zaproszenia do wprowadzenia parametru B
  147.             push offset introdution3
  148.             push offset introdution3
  149.             call CharToOemA
  150.  
  151.             push 0
  152.             push offset printed
  153.             push sizeI2
  154.             push offset introdution3
  155.             push cout
  156.             call WriteConsoleA
  157. ;----------- koniec wyświetlania zaproszenia
  158.  
  159. ;----------- zczytanie parametru C z klawiatury
  160.             push    0       ; rezerwa, musi być zero
  161.             push    OFFSET inserted     ; wskaźnik na faktyczną liczba wprowadzonych znaków
  162.             push    rbuf        ; rozmiar bufora
  163.             push    OFFSET bufor ;wskażnik na bufor
  164.             push    cin     ; deskryptor buforu konsoli
  165.             call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
  166.             lea   EBX,bufor
  167.             mov   EDI,inserted
  168.             mov   BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  169.         ;--- przekształcenie A
  170.             push    OFFSET bufor
  171.             call    ScanInt
  172.             mov varC, EAX
  173. ;----------- koniec zczytywania parametru C z klawiatury
  174.  
  175. ;----------- wyświetlenie zaproszenia do wprowadzenia parametru D
  176.             push offset introdution4
  177.             push offset introdution4
  178.             call CharToOemA
  179.  
  180.             push 0
  181.             push offset printed
  182.             push sizeI4
  183.             push offset introdution4
  184.             push cout
  185.             call WriteConsoleA
  186. ;----------- koniec wyświetlania zaproszenia
  187.  
  188. ;----------- zczytanie parametru D z klawiatury
  189.             push    0       ; rezerwa, musi być zero
  190.             push    OFFSET inserted     ; wskaźnik na faktyczną liczba wprowadzonych znaków
  191.             push    rbuf        ; rozmiar bufora
  192.             push    OFFSET bufor ;wskażnik na bufor
  193.             push    cin     ; deskryptor buforu konsoli
  194.             call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
  195.             lea   EBX,bufor
  196.             mov   EDI,inserted
  197.             mov   BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  198.         ;--- przekształcenie A
  199.             push    OFFSET bufor
  200.             call    ScanInt
  201.             mov varD, EAX
  202. ;----------- koniec zczytywania parametru D z klawiatury
  203.  
  204. ;----liczenie
  205.  
  206.  
  207.             mov     EAX,varA
  208.             mov     EBX,varB
  209.                         xor     EDX,EDX
  210.             mul     EBX
  211.             mov     ECX,EAX        
  212.             xor     EAX,EAX
  213.             mov     EAX,varC
  214.             mov     EBX,varD
  215.                         xor     EDX,EDX
  216.             div     EBX
  217.             sub     ECX,EAX
  218.             mov     EAX,ECX
  219.  
  220.  
  221. ;----------- Łączenie stringów
  222.             push    EAX
  223.             push    OFFSET function
  224.             push    OFFSET bufor
  225.             call    wsprintfA   ; zwraca liczbę znaków w buforze
  226.             add ESP, 12     ; czyszczenie stosu, czemu?
  227.             mov inserted, EAX   ; zapamiętywanie liczby znaków
  228. ;----------- koniec łączenia stringów
  229.  
  230. ;----------- wyświetlenie wyniku
  231.     push    0       ; rezerwa, musi być zero
  232.     push    OFFSET printed  ; wskaźnik na faktyczną liczbę wyprowadzonych znaków
  233.     push    inserted        ; liczba znaków
  234.     push    OFFSET bufor    ; wskaźnik na tekst w buforze
  235.     push    cout        ; deskryptor buforu konsoli
  236.     call    WriteConsoleA   ; wywołanie funkcji WriteConsoleA
  237. ;----------- koniec wyświetlenia wyniku
  238.  
  239.  
  240.  
  241.             push 0
  242.             call ExitProcess
  243.  
  244.     main endp ;koniec procedury głównej
  245.  
  246.     ScanInt   PROC
  247.     ;; funkcja ScanInt przekształca ciąg cyfr do liczby, którą jest zwracana przez EAX
  248.     ;; argument - zakończony zerem wiersz z cyframi
  249.     ;; rejestry: EBX - adres wiersza, EDX - znak liczby, ESI - indeks cyfry w wierszu, EDI - tymczasowy
  250.     ;--- początek funkcji
  251.        push   EBP
  252.        mov   EBP, ESP   ; wskaźnik stosu ESP przypisujemy do EBP
  253.     ;--- odkładanie na stos
  254.        push   EBX
  255.        push   ECX
  256.        push   EDX
  257.        push   ESI
  258.        push   EDI
  259.     ;--- przygotowywanie cyklu
  260.        mov   EBX, [EBP+8]
  261.        push   EBX
  262.        call   lstrlenA
  263.        mov   EDI, EAX   ;liczba znaków
  264.        mov   ECX, EAX   ;liczba powtórzeń = liczba znaków
  265.        xor   ESI, ESI   ; wyzerowanie ESI
  266.        xor   EDX, EDX   ; wyzerowanie EDX
  267.        xor   EAX, EAX   ; wyzerowanie EAX
  268.        mov   EBX, [EBP+8] ; adres tekstu
  269.     ;--- cykl --------------------------
  270.     pocz:
  271.        cmp   BYTE PTR [EBX+ESI], 0h   ;porównanie z kodem \0
  272.        jne   @F
  273.        jmp   et4
  274.     @@:
  275.        cmp   BYTE PTR [EBX+ESI], 0Dh   ;porównanie z kodem CR
  276.        jne   @F
  277.        jmp   et4
  278.     @@:
  279.        cmp   BYTE PTR [EBX+ESI], 0Ah   ;porównanie z kodem LF
  280.        jne   @F
  281.        jmp   et4
  282.     @@:
  283.        cmp   BYTE PTR [EBX+ESI], 02Dh   ;porównanie z kodem -
  284.        jne   @F
  285.        mov   EDX, 1
  286.        jmp   nast
  287.     @@:
  288.        cmp   BYTE PTR [EBX+ESI], 030h   ;porównanie z kodem 0
  289.        jae   @F
  290.        jmp   nast
  291.     @@:
  292.        cmp   BYTE PTR [EBX+ESI], 039h   ;porównanie z kodem 9
  293.        jbe   @F
  294.        jmp   nast
  295.     ;----
  296.     @@:    
  297.         push   EDX   ; do EDX procesor może zapisać wynik mnożenia
  298.        mov   EDI, 10
  299.        mul   EDI      ;mnożenie EAX * EDI
  300.        mov   EDI, EAX   ; tymczasowo z EAX do EDI
  301.        xor   EAX, EAX   ;zerowani EAX
  302.        mov   AL, BYTE PTR [EBX+ESI]
  303.        sub   AL, 030h   ; korekta: cyfra = kod znaku - kod 0    
  304.        add   EAX, EDI   ; dodanie cyfry
  305.        pop   EDX
  306.     nast:  
  307.         inc   ESI
  308.        loop   pocz
  309.     ;--- wynik
  310.        or   EDX, EDX   ;analiza znacznika EDX
  311.        jz   @F
  312.        neg   EAX
  313.     @@:    
  314.     et4:;--- zdejmowanie ze stosu
  315.        pop   EDI
  316.        pop   ESI
  317.        pop   EDX
  318.        pop   ECX
  319.        pop   EBX
  320.     ;--- powrót
  321.        mov   ESP, EBP   ; przywracamy wskaźnik stosu ESP
  322.        pop   EBP
  323.        ret  4
  324. ScanInt   ENDP
  325.  
  326. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement