Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model tiny
- .386
- .data
- ; zmienne potrzebne do realizacji makr
- wiersz db 8 dup (?) ; zmienna pomocnicza (potrzebna dla makra wczytajLiczbe)
- tablica dw 1, 10, 100, 1000, 10000 ; tablica pi?ciu liczb potrzebnych do
- ; zainicjowania zmiennej "pomoc" (potrzebna dla makra wczytajLiczbe)
- pomoc dw 10000 ; zmienna pomocnicza (potrzebna dla makr wczytajLiczbe i
- ; wyswietlLiczbe)
- wyswietlanieZer db 0 ; zmienna pomocnicza (potrzebna dla makra
- ; wyswietlLiczbe), znaczenie: 0 - nie, 1 - tak
- ; zmienne potrzebne do realizacji w?a?ciwego programu
- tekstPodajLiczbe db "Podaj liczbe: $"
- tekstKoniec db "Aby zakonczyc nacisnij dowolny klawisz...$"
- tekstZle db "nie istnieje taki trojkat $"
- tekstdobr db "istnieje taki trojkat $"
- liczba1 dw 0
- liczba2 dw 0
- liczba3 dw 0
- .stack 100h
- .code
- start:
- ; =================== makro wyswietlTekst =======================
- ; wy?wietla na ekranie tekst zapisany w zmiennej A
- wyswietlTekst MACRO A
- ; zapisanie danych na stosie
- push ax ; wrzu? na stos rejestr AX
- push dx ; wrzu? na stos rejestr DX
- mov dx, offset A
- mov ah, 09h
- int 21h
- ; przywr?cenie danych ze stosu
- pop dx ; pobierz ze stosu rejestr DX
- pop ax ; pobierz ze stosu rejestr AX
- ENDM ; koniec makra
- ; =================== makro wyswietlTekst =======================
- ; =================== makro wczytajLiczbe =======================
- ; wczytywanie liczby od 0 do maks. 65535 i zapisanie jej w zmiennej A (typu DW)
- wczytajLiczbe MACRO A
- LOCAL petla
- ; zapisanie danych na stosie
- pushf ; wrzu? na stos rejestr flag
- push ax ; wrzu? na stos rejestr AX
- push bx ; wrzu? na stos rejestr BX
- push cx ; wrzu? na stos rejestr CX
- push dx ; wrzu? na stos rejestr DX
- ; wczytywanie ci?gu 6 znak?w (5 cyfr i Enter)
- mov dx, offset wiersz
- mov (wiersz), 5 ; okre?lenie ile maksymalnie mo?e zosta? wczytanych znak?w ?
- ; pozwalamy wpisa? 5 cyfr i znak CR (Enter)
- mov ah, 0Ah
- int 21h
- ; wpisanie do zmiennej "pomoc" odpowiedniej warto?ci pocz?tkowej (w zale?no?ci od
- ; ilo?ci wczytanych cyfr)
- xor ax, ax
- mov al, (wiersz+1) ; skopiuj do rejestru AL ilo?? wczytanych znak?w (cyfr)
- sub ax, 1 ; odejmij od AX jeden (bo tablica indeksowana jest od 0)
- mov bl, 2
- mul bl ; pomn?? rejestr AX razy 2 (bo tablica zawiera dwubajtowe
- ; elementy)
- mov si, ax
- mov ax, (tablica+si) ; skopiowanie warto?ci z tablicy odpowiadaj?cej ilo?ci
- ; wczytanych cyfr
- mov pomoc, ax
- xor dx, dx ; wyzerowanie rejestru DX
- mov A, 0 ; wyzerowanie zmiennej A
- mov si, 2 ; zmienna pomocnicza wykorzystywana do adresowania
- petla:
- xor ax, ax
- mov al, (wiersz + si) ; mo?na te? zapisa?: mov al, wiersz[si]
- sub al, 48 ; zamie? kod cyfry w ASCII na cyfr? (np. '3' -> 3)
- mul pomoc ; AX*pomoc -> wynik: DX:AX; w AX wynik, w DX = 0
- add A, ax
- inc si
- ; zmniejszenie mno?nika (zmienna pomoc) 10 razy (np. z 10000 na 1000)
- xor dx, dx
- mov ax, pomoc
- mov bx, 10
- div bx ; w AX wynik dzielenia (nowy dzielnik), DX = 0
- mov pomoc, ax
- ; sprawdzenie warunku zako?czenia p?tli
- cmp pomoc, 0 ; sprawd? czy licznik p?tli jest wi?kszy od 0
- jne petla ; je?li jest wi?kszy od zera to wykonaj p?tl? jeszcze raz
- ; przywr?cenie danych ze stosu
- pop dx ; pobierz ze stosu rejestr DX
- pop cx ; pobierz ze stosu rejestr CX
- pop bx ; pobierz ze stosu rejestr BX
- pop ax ; pobierz ze stosu rejestr AX
- popf ; pobierz ze stosu rejestr flag
- ENDM ; koniec makra
- ; =================== makro wczytajLiczbe =======================
- ; =================== makro wyswietlLiczbe =======================
- ; wy?wietlenie 5-cio cyfrowej liczby na ekranie zawartej w zmiennej A
- wyswietlLiczbe MACRO A
- LOCAL petla
- LOCAL wyswietl
- LOCAL niewyswietlaj
- ; zapisanie danych na stosie
- pushf ; wrzu? na stos rejestr flag
- push ax ; wrzu? na stos rejestr AX
- push bx ; wrzu? na stos rejestr BX
- push cx ; wrzu? na stos rejestr CX
- push dx ; wrzu? na stos rejestr DX
- mov pomoc, 10000 ; zmienna pomocnicza
- mov wyswietlanieZer, 0 ; zmienna pomocnicza
- xor dx, dx ; wyzerowanie rejestru DX
- mov cx, A
- petla:
- mov ax, cx
- div pomoc ; DX:AX / pomoc -> wynik: AX, reszta: DX
- mov cx, dx ; CX jako bufor (do przechowania reszty z dzielenia)
- mov dx, ax ; do rejestru DX skopiuj wynik dzielenia (cyfra w AX)
- cmp dl, 0 ; czy to jest cyfra 0?
- jne wyswietl ; je?li to nie jest cyfra 0 to j? wy?wietl
- cmp wyswietlanieZer, 1 ; je?li to jest cyfra zero, to sprawd? czy wy?wietlanie
- ; zer jest w??czone
- jne nieWyswietlaj ; wy?wietlanie zer nie jest w??czone - nie wy?wietlaj
- ; zera
- wyswietl:
- add dl, 48 ; dodaj 48 aby z cyfry zrobi? kod cyfry w ASCII (np. 3 -> '3')
- mov ah, 02h ; wy?wietl cyfr?
- int 21h
- mov wyswietlanieZer, 1 ; ustaw wy?wietlanie zer jako w??czone
- nieWyswietlaj:
- ; zmniejszenie dzielnika (zmienna pomoc) 10 razy (np. z 10000 na 1000)
- xor dx, dx
- mov ax, pomoc
- mov bx, 10
- div bx ; w AX wynik dzielenia (nowy dzielnik), DX = 0
- mov pomoc, ax
- ; sprawdzenie warunku zako?czenia p?tli
- cmp pomoc, 0 ; sprawd? czy licznik p?tli jest wi?kszy od 0
- jne petla ; je?li jest wi?kszy od zera to wykonaj p?tl? jeszcze raz
- ; przywr?cenie danych ze stosu
- pop dx ; pobierz ze stosu rejestr DX
- pop cx ; pobierz ze stosu rejestr CX
- pop bx ; pobierz ze stosu rejestr BX
- pop ax ; pobierz ze stosu rejestr AX
- popf ; pobierz ze stosu rejestr flag
- ENDM ; koniec makra
- ; =================== makro wyswietlanieLiczby =======================
- ; =================== w?a?ciwy program ===============================
- ; wpisanie do rejestru DS adresu segmentu danych
- mov ax, @data
- mov ds, ax
- wyswietlTekst tekstPodajLiczbe
- call nowaLinia
- wczytajLiczbe liczba1
- call nowaLinia
- wczytajLiczbe liczba2
- call nowaLinia
- wczytajLiczbe liczba3
- call nowaLinia
- ;a < b +c
- mov ax,liczba2
- mov bx,liczba3
- add ax,bx
- cmp liczba1,ax
- ja nie
- ;b < a +c
- mov ax,liczba1
- mov bx,liczba3
- add ax,bx
- cmp liczba2,ax
- ja nie
- ;c <b + a
- mov ax,liczba1
- mov bx,liczba2
- add ax,bx
- cmp liczba3,ax
- ja nie
- wyswietlTekst tekstdobr
- jmp end
- nie:
- wyswietlTekst tekstZle
- end:
- ; zako?czenie programu
- mov ah, 4Ch
- int 21h
- ; =================== w?a?ciwy program ===============================
- ; =================== procedura nowaLinia =======================
- nowaLinia:
- push dx
- push ax
- mov dl, 0Ah
- mov ah, 02h
- int 21h
- pop ax
- pop dx
- ret
- ; =================== procedura nowaLinia =======================
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement