Advertisement
Guest User

Untitled

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