Advertisement
Guest User

Untitled

a guest
May 28th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model tiny
  2. .386
  3. .data
  4.     ; zmienne potrzebne do realizacji makr
  5.     wiersz db 8 dup (?)     ; zmienna pomocnicza (potrzebna dla makra wczytajLiczbe)
  6.     tablica dw 1, 10, 100, 1000, 10000  ; tablica pi?ciu liczb potrzebnych do
  7.                 ; zainicjowania zmiennej "pomoc" (potrzebna dla makra wczytajLiczbe)
  8.     pomoc dw 10000          ; zmienna pomocnicza (potrzebna dla makr wczytajLiczbe i
  9.                              ; wyswietlLiczbe)    
  10.     wyswietlanieZer db 0    ; zmienna pomocnicza (potrzebna dla makra
  11.                              ; wyswietlLiczbe), znaczenie: 0 - nie, 1 - tak
  12.    
  13.     ; zmienne potrzebne do realizacji w?a?ciwego programu
  14.     tekstPodajLiczbe db "Podaj liczbe: $"
  15.     tekstKoniec db "Aby zakonczyc nacisnij dowolny klawisz...$"
  16.     liczba1 dw 0        
  17.     liczba2 dw 0        
  18. .stack 100h
  19. .code
  20. start:
  21.  
  22. ; =================== makro wyswietlTekst =======================
  23. ; wy?wietla na ekranie tekst zapisany w zmiennej A
  24. wyswietlTekst MACRO A
  25.     ; zapisanie danych na stosie
  26.     push ax         ; wrzu? na stos rejestr AX
  27.     push dx         ; wrzu? na stos rejestr DX
  28.    
  29.     mov dx, offset A
  30.     mov ah, 09h
  31.     int 21h
  32.  
  33.     ; przywr?cenie danych ze stosu
  34.     pop dx          ; pobierz ze stosu rejestr DX
  35.     pop ax          ; pobierz ze stosu rejestr AX
  36. ENDM                ; koniec makra
  37. ; =================== makro wyswietlTekst =======================
  38.  
  39. ; =================== makro wczytajLiczbe =======================
  40. ; wczytywanie liczby od 0 do maks. 65535 i zapisanie jej w zmiennej A (typu DW)
  41.  
  42.  
  43. wczytajLiczbe MACRO A
  44.     LOCAL petla
  45.     ; zapisanie danych na stosie
  46.     pushf           ; wrzu? na stos rejestr flag
  47.     push ax         ; wrzu? na stos rejestr AX
  48.     push bx         ; wrzu? na stos rejestr BX
  49.     push cx         ; wrzu? na stos rejestr CX
  50.     push dx         ; wrzu? na stos rejestr DX
  51.    
  52.     ; wczytywanie ci?gu 6 znak?w (5 cyfr i Enter)
  53.     mov dx, offset wiersz
  54.     mov (wiersz), 4    ; okre?lenie ile maksymalnie mo?e zosta? wczytanych znak?w ?
  55.                         ; pozwalamy wpisa? 5 cyfr i znak CR (Enter)
  56.     mov ah, 0Ah
  57.     int 21h
  58.    
  59.     ; wpisanie do zmiennej "pomoc" odpowiedniej warto?ci pocz?tkowej (w zale?no?ci od
  60.     ; ilo?ci wczytanych cyfr)
  61.     xor ax, ax
  62.     mov al, (wiersz+1)  ; skopiuj do rejestru AL ilo?? wczytanych znak?w (cyfr)
  63.     sub ax, 1       ; odejmij od AX jeden (bo tablica indeksowana jest od 0)
  64.     mov bl, 2      
  65.     mul bl          ; pomn?? rejestr AX razy 2 (bo tablica zawiera dwubajtowe
  66.                      ; elementy)
  67.     mov si, ax          
  68.     mov ax, (tablica+si)  ; skopiowanie warto?ci z tablicy odpowiadaj?cej ilo?ci
  69.                            ; wczytanych cyfr
  70.     mov pomoc, ax        
  71.     xor dx, dx      ; wyzerowanie rejestru DX
  72.     mov A, 0        ; wyzerowanie zmiennej A
  73.     mov si, 2       ; zmienna pomocnicza wykorzystywana do adresowania
  74.    
  75. petla:
  76.     xor ax, ax
  77.     mov al, (wiersz + si)   ; mo?na te? zapisa?: mov al, wiersz[si]
  78.     sub al, 48      ; zamie? kod cyfry w ASCII na cyfr? (np. '3' -> 3)
  79.     mul pomoc       ; AX*pomoc -> wynik: DX:AX; w AX wynik, w DX = 0
  80.     add A, ax
  81.     inc si
  82.    
  83.     ; zmniejszenie mno?nika (zmienna pomoc) 10 razy (np. z 10000 na 1000)
  84.     xor dx, dx          
  85.     mov ax, pomoc
  86.     mov bx, 10
  87.     div bx                  ; w AX wynik dzielenia (nowy dzielnik), DX = 0
  88.     mov pomoc, ax    
  89.  
  90.     ; sprawdzenie warunku zako?czenia p?tli
  91.     cmp pomoc, 0     ; sprawd? czy licznik p?tli jest wi?kszy od 0
  92.     jne petla        ; je?li jest wi?kszy od zera to wykonaj p?tl? jeszcze raz
  93.  
  94.     ; przywr?cenie danych ze stosu
  95.     pop dx          ; pobierz ze stosu rejestr DX
  96.     pop cx          ; pobierz ze stosu rejestr CX
  97.     pop bx          ; pobierz ze stosu rejestr BX
  98.     pop ax          ; pobierz ze stosu rejestr AX
  99.     popf            ; pobierz ze stosu rejestr flag
  100. ENDM                ; koniec makra
  101. ; =================== makro wczytajLiczbe =======================
  102.  
  103. ; =================== makro wyswietlLiczbe =======================
  104. ; wy?wietlenie 5-cio cyfrowej liczby na ekranie zawartej w zmiennej A
  105. wyswietlLiczbe MACRO A
  106.     LOCAL petla
  107.     LOCAL wyswietl
  108.     LOCAL niewyswietlaj
  109.     ; zapisanie danych na stosie
  110.     pushf           ; wrzu? na stos rejestr flag
  111.     push ax         ; wrzu? na stos rejestr AX
  112.     push bx         ; wrzu? na stos rejestr BX
  113.     push cx         ; wrzu? na stos rejestr CX
  114.     push dx         ; wrzu? na stos rejestr DX
  115.     mov pomoc, 10000     ; zmienna pomocnicza
  116.     mov wyswietlanieZer, 0  ; zmienna pomocnicza
  117.     xor dx, dx      ; wyzerowanie rejestru DX
  118.     mov cx, A
  119.  
  120. petla:
  121.     mov ax, cx    
  122.     div pomoc       ; DX:AX / pomoc -> wynik: AX, reszta: DX
  123.     mov cx, dx      ; CX jako bufor (do przechowania reszty z dzielenia)
  124.    
  125.     mov dx, ax      ; do rejestru DX skopiuj wynik dzielenia (cyfra w AX)
  126.     cmp dl, 0       ; czy to jest cyfra 0?
  127.     jne wyswietl    ; je?li to nie jest cyfra 0 to j? wy?wietl
  128.     cmp wyswietlanieZer, 1  ; je?li to jest cyfra zero, to sprawd? czy wy?wietlanie
  129.                               ; zer jest w??czone
  130.     jne nieWyswietlaj       ; wy?wietlanie zer nie jest w??czone - nie wy?wietlaj
  131.                               ; zera
  132.   wyswietl:
  133.     add dl, 48      ; dodaj 48 aby z cyfry zrobi? kod cyfry w ASCII (np. 3 -> '3')
  134.     mov ah, 02h     ; wy?wietl cyfr?
  135.     int 21h
  136.     mov wyswietlanieZer, 1 ; ustaw wy?wietlanie zer jako w??czone
  137.  
  138.   nieWyswietlaj:
  139.     ; zmniejszenie dzielnika (zmienna pomoc) 10 razy (np. z 10000 na 1000)
  140.     xor dx, dx      
  141.     mov ax, pomoc
  142.     mov bx, 10    
  143.     div bx                  ; w AX wynik dzielenia (nowy dzielnik), DX = 0
  144.     mov pomoc, ax
  145.  
  146.     ; sprawdzenie warunku zako?czenia p?tli
  147.     cmp pomoc, 0 ; sprawd? czy licznik p?tli jest wi?kszy od 0
  148.     jne petla        ; je?li jest wi?kszy od zera to wykonaj p?tl? jeszcze raz
  149.  
  150.     ; przywr?cenie danych ze stosu
  151.     pop dx          ; pobierz ze stosu rejestr DX
  152.     pop cx          ; pobierz ze stosu rejestr CX
  153.     pop bx          ; pobierz ze stosu rejestr BX
  154.     pop ax          ; pobierz ze stosu rejestr AX
  155.     popf            ; pobierz ze stosu rejestr flag
  156. ENDM                ; koniec makra
  157. ; =================== makro wyswietlanieLiczby =======================
  158.  
  159. ; =================== w?a?ciwy program ===============================
  160.     ; wpisanie do rejestru DS adresu segmentu danych
  161.     mov ax, @data
  162.     mov ds, ax
  163.  
  164.    
  165.     wyswietlTekst tekstPodajLiczbe
  166.     call nowaLinia
  167.     wczytajLiczbe liczba1
  168.     call nowaLinia
  169.     wczytajLiczbe liczba2
  170.    
  171.     ;dodawanko
  172.     mov ax,liczba1
  173.     mov bx,liczba2
  174.     add ax,bx
  175.    
  176.     call nowaLinia
  177.     wyswietlLiczbe ax  
  178.    
  179.     ;odejmowanko
  180.     mov ax,liczba1
  181.     mov bx,liczba2
  182.     sub bl,al
  183.    
  184.     call nowaLinia
  185.     wyswietlLiczbe bx
  186.     ;mnozonko
  187.     mov ax,liczba1
  188.     mov bx,liczba2
  189.     mul bl
  190.    
  191.    
  192.     call nowaLinia
  193.     wyswietlLiczbe ax
  194.  
  195.     ;dzielonko
  196.     mov bx,liczba1
  197.     mov ax,liczba2
  198.     div bl
  199.     xor ah,ah
  200.    
  201.    
  202.     call nowaLinia
  203.     wyswietlLiczbe ax
  204.    
  205.  
  206.    
  207.     ; zako?czenie programu
  208.     mov ah, 4Ch
  209.     int 21h
  210. ; =================== w?a?ciwy program ===============================
  211.    
  212. ; =================== procedura nowaLinia =======================
  213.     nowaLinia:
  214.     push dx
  215.     push ax
  216.  
  217.     mov dl, 0Ah
  218.     mov ah, 02h
  219.     int 21h
  220.  
  221.     pop ax
  222.     pop dx
  223.  ret
  224. ; =================== procedura nowaLinia =======================
  225. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement