Advertisement
Sylv3rWolf

AsmLab1

Oct 15th, 2015
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;Aplikacja korzystajaca z otwartego okna konsoli
  2. .386
  3. .MODEL flat, STDCALL
  4. ;--- stale ---
  5. ;--- z pliku .\include\windows.inc ---
  6. STD_INPUT_HANDLE                     equ -10
  7. STD_OUTPUT_HANDLE                    equ -11
  8. ;--- funkcje API Win32 ---
  9. ;--- z pliku  .\include\user32.inc ---
  10. CharToOemA PROTO :DWORD,:DWORD
  11. ;--- z pliku .\include\kernel32.inc ---
  12. GetStdHandle PROTO :DWORD
  13. ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  14. WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  15. ExitProcess PROTO :DWORD
  16. wsprintfA PROTO C :VARARG
  17. lstrlenA PROTO :DWORD
  18. ;-------------
  19. includelib .\lib\user32.lib
  20. includelib .\lib\kernel32.lib
  21. ;-------------
  22. _DATA SEGMENT
  23.     hout    DD  ?
  24.     hinp    DD  ?
  25.     naglow  DB  "Autor aplikacji .... TyrumYuum.",0
  26.     ALIGN   4   ; przesuniecie do adresu podzielnego na 4
  27.     rozmN   DD  $ - naglow  ;ilość znaków w tablicy
  28.     zaprA   DB  0Dh,0Ah,"Proszę wprowadzić argument A [+Enter]: ",0
  29.     ALIGN   4
  30.     rozmA   DD  $ - zaprA   ;ilość znaków w tablicy
  31.     zmA DD  1   ; argument A
  32.     zaprB   DB  0Dh,0Ah,"Proszę wprowadzić argument B [+Enter]: ",0
  33.     ALIGN   4
  34.     rozmB   DD  $ - zaprB   ;ilość znaków w tablicy
  35.     zmB DD  2   ; argument B
  36.     zaprC   DB  0Dh,0Ah,"Proszę wprowadzić argument C [+Enter]: ",0
  37.     ALIGN   4
  38.     rozmC   DD  $ - zaprC   ;ilość znaków w tablicy
  39.     zmC DD  3   ; argument C
  40.     zaprD   DB  0Dh,0Ah,"Proszę wprowadzić argument D [+Enter]: ",0
  41.     ALIGN   4
  42.     rozmD   DD  $ - zaprD   ;ilość znaków w tablicy
  43.     zmD DD  4   ; argument D
  44.     wzor    DB  0Dh,0Ah,"Funkcja f(A,B,C,D) = ...... = %ld",0
  45.     ALIGN   4
  46.     rozmW   DD  $ - wzor    ;ilość znaków w tablicy
  47.     rout    DD  0 ;faktyczna ilość wyprowadzonych znaków
  48.     rinp    DD  0 ;faktyczna ilość wprowadzonych znaków
  49.     bufor   DB  128 dup(?)
  50.     rbuf    DD  128
  51. _DATA ENDS
  52. ;------------
  53. _TEXT SEGMENT
  54. start:
  55. ;--- wywołanie funkcji GetStdHandle
  56.     push    STD_OUTPUT_HANDLE
  57.     call    GetStdHandle    ; wywołanie funkcji GetStdHandle
  58.     mov hout, EAX   ; deskryptor wyjściowego bufora konsoli
  59.     push    STD_INPUT_HANDLE
  60.     call    GetStdHandle    ; wywołanie funkcji GetStdHandle
  61.     mov hinp, EAX   ; deskryptor wejściowego bufora konsoli
  62. ;--- nagłówek ---------
  63.     push    OFFSET naglow
  64.     push    OFFSET naglow
  65.     call    CharToOemA  ; konwersja polskich znaków
  66. ;--- wyświetlenie ---------
  67.     push    0       ; rezerwa, musi być zero
  68.     push    OFFSET rout ; wskaźnik na faktyczną ilość wyprowadzonych znaków
  69.     push    rozmN       ; ilość znaków
  70.     push    OFFSET naglow   ; wskażnik na tekst
  71.     push    hout        ; deskryptor buforu konsoli
  72.     call    WriteConsoleA   ; wywołanie funkcji WriteConsoleA
  73. ;--- zaproszenie A ---------
  74.     push    OFFSET zaprA
  75.     push    OFFSET zaprA
  76.     call    CharToOemA  ; konwersja polskich znaków
  77. ;--- wyświetlenie zaproszenia A ---
  78.     push    0       ; rezerwa, musi być zero
  79.     push    OFFSET rout     ; wskaźnik na faktyczną ilość wyprowadzonych znaków
  80.     push    rozmA       ; ilość znaków
  81.     push    OFFSET zaprA    ; wskażnik na tekst
  82.     push    hout        ; deskryptor buforu konsoli
  83.     call    WriteConsoleA   ; wywołanie funkcji WriteConsoleA
  84. ;--- zerowanie bufora
  85. ;   lea   EBX,bufor
  86. ;   mov   ECX,rbuf
  87. ;@@:    mov   BYTE PTR [EBX+ECX-1],0
  88. ;   loop  @B      
  89. ;--- czekanie na wprowadzenie znaków, koniec przez Enter ---
  90.     push    0       ; rezerwa, musi być zero
  91.     push    OFFSET rinp     ; wskaźnik na faktyczną ilość wprowadzonych znaków
  92.     push    rbuf        ; rozmiar bufora
  93.     push    OFFSET bufor ;wskażnik na bufor
  94.     push    hinp        ; deskryptor buforu konsoli
  95.     call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
  96.     lea   EBX,bufor
  97.     mov   EDI,rinp
  98.     mov   BYTE PTR [EBX+EDI-1],0 ;zero na końcu tekstu
  99. ;--- przekształcenie A
  100.     push    OFFSET bufor
  101.     call    ScanInt
  102.     add ESP, 8
  103.     mov zmA, EAX
  104. ;;;........ B,
  105. ;--- zaproszenie B ---------
  106.     push    OFFSET zaprB
  107.     push    OFFSET zaprB
  108.     call    CharToOemA  ; konwersja polskich znaków
  109. ;--- wyświetlenie zaproszenia A ---
  110.     push    0       ; rezerwa, musi być zero
  111.     push    OFFSET rout     ; wskaźnik na faktyczną ilość wyprowadzonych znaków
  112.     push    rozmA       ; ilość znaków
  113.     push    OFFSET zaprB    ; wskażnik na tekst
  114.     push    hout        ; deskryptor buforu konsoli
  115.     call    WriteConsoleA   ; wywołanie funkcji WriteConsoleA
  116. ;--- zerowanie bufora
  117. ;   lea   EBX,bufor
  118. ;   mov   ECX,rbuf
  119. ;@@:    mov   BYTE PTR [EBX+ECX-1],0
  120. ;   loop  @B      
  121. ;--- czekanie na wprowadzenie znaków, koniec przez Enter ---
  122.     push    0       ; rezerwa, musi być zero
  123.     push    OFFSET rinp     ; wskaźnik na faktyczną ilość wprowadzonych znaków
  124.     push    rbuf        ; rozmiar bufora
  125.     push    OFFSET bufor ;wskażnik na bufor
  126.     push    hinp        ; deskryptor buforu konsoli
  127.     call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
  128.     lea   EBX,bufor
  129.     mov   EDI,rinp
  130.     mov   BYTE PTR [EBX+EDI-1],0 ;zero na końcu tekstu
  131. ;--- przekształcenie B
  132.     push    OFFSET bufor
  133.     call    ScanInt
  134.     add ESP, 8
  135.     mov zmA, EAX
  136.    
  137. ;;;..........C,
  138.  
  139. ;--- zaproszenie C ---------
  140.     push    OFFSET zaprC
  141.     push    OFFSET zaprC
  142.     call    CharToOemA  ; konwersja polskich znaków
  143. ;--- wyświetlenie zaproszenia A ---
  144.     push    0       ; rezerwa, musi być zero
  145.     push    OFFSET rout     ; wskaźnik na faktyczną ilość wyprowadzonych znaków
  146.     push    rozmA       ; ilość znaków
  147.     push    OFFSET zaprC    ; wskażnik na tekst
  148.     push    hout        ; deskryptor buforu konsoli
  149.     call    WriteConsoleA   ; wywołanie funkcji WriteConsoleA
  150. ;--- zerowanie bufora
  151. ;   lea   EBX,bufor
  152. ;   mov   ECX,rbuf
  153. ;@@:    mov   BYTE PTR [EBX+ECX-1],0
  154. ;   loop  @B      
  155. ;--- czekanie na wprowadzenie znaków, koniec przez Enter ---
  156.     push    0       ; rezerwa, musi być zero
  157.     push    OFFSET rinp     ; wskaźnik na faktyczną ilość wprowadzonych znaków
  158.     push    rbuf        ; rozmiar bufora
  159.     push    OFFSET bufor ;wskażnik na bufor
  160.     push    hinp        ; deskryptor buforu konsoli
  161.     call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
  162.     lea   EBX,bufor
  163.     mov   EDI,rinp
  164.     mov   BYTE PTR [EBX+EDI-1],0 ;zero na końcu tekstu
  165. ;--- przekształcenie A
  166.     push    OFFSET bufor
  167.     call    ScanInt
  168.     add ESP, 8
  169.     mov zmA, EAX
  170.  
  171. ;;;............ D
  172.  
  173. ;--- zaproszenie D ---------
  174.     push    OFFSET zaprD
  175.     push    OFFSET zaprD
  176.     call    CharToOemA  ; konwersja polskich znaków
  177. ;--- wyświetlenie zaproszenia A ---
  178.     push    0       ; rezerwa, musi być zero
  179.     push    OFFSET rout     ; wskaźnik na faktyczną ilość wyprowadzonych znaków
  180.     push    rozmA       ; ilość znaków
  181.     push    OFFSET zaprD    ; wskażnik na tekst
  182.     push    hout        ; deskryptor buforu konsoli
  183.     call    WriteConsoleA   ; wywołanie funkcji WriteConsoleA
  184. ;--- zerowanie bufora
  185. ;   lea   EBX,bufor
  186. ;   mov   ECX,rbuf
  187. ;@@:    mov   BYTE PTR [EBX+ECX-1],0
  188. ;   loop  @B      
  189. ;--- czekanie na wprowadzenie znaków, koniec przez Enter ---
  190.     push    0       ; rezerwa, musi być zero
  191.     push    OFFSET rinp     ; wskaźnik na faktyczną ilość wprowadzonych znaków
  192.     push    rbuf        ; rozmiar bufora
  193.     push    OFFSET bufor ;wskażnik na bufor
  194.     push    hinp        ; deskryptor buforu konsoli
  195.     call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
  196.     lea   EBX,bufor
  197.     mov   EDI,rinp
  198.     mov   BYTE PTR [EBX+EDI-1],0 ;zero na końcu tekstu
  199. ;--- przekształcenie D
  200.     push    OFFSET bufor
  201.     call    ScanInt
  202.     add ESP, 8
  203.     mov zmA, EAX
  204.  
  205.  
  206. ;--- obliczenia ---
  207.     mov EAX, zmA
  208. ;;;;    ................
  209. ;--- wyprowadzenie wyniku obliczeń ---
  210.     push    EAX
  211.     push    OFFSET wzor
  212.     push    OFFSET bufor
  213.     call    wsprintfA   ; zwraca ilość znaków w buforze
  214.     add ESP, 16     ; czyszczenie stosu
  215.     mov rinp, EAX   ; zapamiętywanie ilości znaków
  216. ;--- wyświetlenie wynika ---------
  217.     push    0       ; rezerwa, musi być zero
  218.     push    OFFSET rout     ; wskaźnik na faktyczną ilość wyprowadzonych znaków
  219.     push    rinp        ; ilość znaków
  220.     push    OFFSET bufor    ; wskażnik na tekst w buforze
  221.     push    hout        ; deskryptor buforu konsoli
  222.     call    WriteConsoleA   ; wywołanie funkcji WriteConsoleA
  223. ;--- zakończenie procesu ---------
  224.     push    0
  225.     call    ExitProcess ; wywołanie funkcji ExitProcess
  226. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  227. ScanInt PROC
  228. ;; funkcja ScanInt przekształca ciąg cyfr do liczby, która jest zwracana przez EAX
  229. ;; argument - zakończony zerem wiersz z cyframi
  230. ;; rejestry: EBX - adres wiersza, EDX - znak liczby, ESI - indeks cyfry w wierszu, EDI - tymczasowy
  231. ;--- początek funkcji
  232.     push    EBP
  233.     mov EBP, ESP    ; wskaźnik stosu ESP przypisujemy do EBP
  234. ;--- odkładanie na stos
  235.     push    EBX
  236.     push    ECX
  237.     push    EDX
  238.     push    ESI
  239.     push    EDI
  240. ;--- przygotowywanie cyklu
  241.     mov EBX, [EBP+8]
  242.     push    EBX
  243.     call    lstrlenA
  244.     mov EDI, EAX    ;ilość znaków
  245.     mov ECX, EAX    ;ilość powtórzeń = ilość znaków
  246.     xor ESI, ESI    ; wyzerowanie ESI
  247.     xor EDX, EDX    ; wyzerowanie EDX
  248.     xor EAX, EAX    ; wyzerowanie EAX
  249. ;--- cykl --------------------------
  250. @@pocz:
  251.     cmp BYTE PTR [EBX+ESI], 02Dh    ;porównanie z kodem -
  252.     jne @F
  253.     mov EDX, 1
  254.     jmp @@nast
  255. @@:
  256.     cmp BYTE PTR [EBX+ESI], 030h    ;porównanie z kodem 0
  257.     jae @F
  258.     jmp @@nast
  259. @@:
  260.     cmp BYTE PTR [EBX+ESI], 039h    ;porównanie z kodem 9
  261.     jbe @F
  262.     jmp @@nast
  263. ;----
  264. @@:
  265.       push  EDX ; do EDX procesor może zapisać wynik mnożenia
  266.     mov EDI, 10
  267.     mul EDI     ;mnożenie EAX * EDI
  268.     mov EDI, EAX    ; tymczasowo z EAX do EDI
  269.     xor EAX, EAX    ;zerowani EAX
  270.     mov AL, BYTE PTR [EBX+ESI]
  271.     sub AL, 030h    ; korekta: cyfra = kod znaku - kod 0   
  272.     add EAX, EDI    ; dodanie cyfry
  273.     pop EDX
  274. @@nast: inc ESI
  275.     loop    @@pocz
  276. ;--- wynik
  277.     or  EDX, EDX    ;analiza znacznika EDX
  278.     jz  @F
  279.     neg EAX
  280. @@:
  281. ;--- zdejmowanie ze stosu
  282.     pop EDI
  283.     pop ESI
  284.     pop EDX
  285.     pop ECX
  286.     pop EBX
  287. ;--- powrót
  288.     mov ESP,EBP
  289.     pop EBP
  290.     ret
  291. ScanInt ENDP
  292. _TEXT   ENDS
  293. END start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement