Advertisement
plyp

blbbbf

Dec 16th, 2019
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. wypisz macro msg       ;definiowanie makra do wypisu na ekran
  2.         mov ah, 09h             ;rozkaz wydruku stringa na wyjscie
  3.         lea dx, msg             ;przeniesienie do rejestru dx wskazanego ciagu znakow
  4.         int 21h
  5.         endm
  6.        ;segment danych
  7.         buf1 db "Wprowadz liczbe decymalnie : $"                ;wiadomosc 1
  8.         buf2 db 0ah, "Liczba nie jest z zakresu 0-9$"   ;wiadomosc 2
  9.         buf3 db 0ah, "Odpowiednik w zapisie hex: $"     ;wiadomosc 3
  10.         buf4 db 6                                                                                                               ;alokacja 6 jednostek pamieci
  11.              db 0
  12.              db 6 dup(0)                                                                                                ;wypelnienie w.w jednostek zerami
  13.                 buf5 db 0ah, 0dh
  14.         mnoznik db 0ah  
  15.         hex db '0123456789ABCDEF';BLOB
  16. data ends
  17.  
  18. code segment
  19.         assume cs:code, ds:data                  ;zadeklarowanie nazw segmentow do ktorych bedziemy sie odwolywac
  20. start :
  21.         mov ax, data                                                                                            ;do ax kopiujemy zawartosc segmentu z danycmi
  22.         mov ds, ax                                                                                                      ;kopiujemy zaw. ax do ds[data segment]
  23.         mov es, ax                                                                                                      ;kopiujemy zaw. ax do do es[extra segment]
  24.  
  25.         wypisz buf1                                                                                                     ;wywolanie makra z parametrem buf1.
  26.  
  27.         mov ah, 0ah                                                                                                     ;do rejestru ah wprowadzamy dane z klawiatury, przy pomocy rozkazu dosowego
  28.         lea dx, buf4                                                                                                    ;limitujemy liczbe znakow wprowadzonych przez uzytkownika o wczesniej zadeklarowana ilosc
  29.         int 21h                                                                                                                 ;
  30.  
  31.         mov si, offset buf4 + 2                                                                 ;kopiujemy do wskaznika zrodla adres buf4 z przeniesieniem o 2
  32.         mov cl, byte ptr [si-1]                                                                 ;do mlodszego bajtu rejestru C kopiujemy zawartosc si, zmuszamy program zeby czytal to jako wskaznik, i przypominamy ze jest to operacja na 8 bitach
  33.         mov ch, 00h                                                                                                     ;zerujemy starszy bajt rejestru C
  34. sprawdzanie :
  35.         mov al, byte ptr [si]                                                                           ;przenosimy wartosc ciagu znakow do rejetru aL
  36.         cmp al, 30h                                                                                                     ;odejmujemy od pojedynczego znaku 30h(0 ascii) zeby sprawdzic czy jest cyfra 0-9
  37.         jnb sprawdzanie2                                                                                        ;jezeli jest mniejsza (C=1 ) to wyszlismy z zakresu
  38.         wypisz buf2                                                                                                     ;komunikat bledu
  39.         jmp stop                                                                                                                ;skok do instrukcji przerwania programu
  40. sprawdzanie2 :
  41.         cmp al, 3ah                                                                                                     ;odejmujemy od pojedynczego znaku 3ah(; ascii ) zebyu sprawdzic czy jest cyfra 0-9
  42.         jb sprawdzenie3                                                                                                                ;jezeli jest wieksza (C=0) to wyszlismy z zakresu
  43.         wypisz buf2                                                                                                     ;komunikat bledu
  44.         jmp stop                                                                                                                ;skok do instrukcji przerwania programu
  45. sprawdzenie3 :
  46.         sub al, 30h                                                                                                     ;odejmujemy od al 0 ascii
  47.         mov byte ptr [si], al                                                                           ;zawartosc rejestru po wykonaniu operacji odjecia kopiujemy spowrotem do wskanzika
  48.  
  49.         inc si                                                                                                                  ;wskazujemy na kolejna komorke
  50.         loop sprawdzanie                                                                                        ;dopoki nie skonczy sie nasz lancuch, powtarzaj sprawdzanie kazdego znaku
  51.  
  52.         mov si, offset buf4 + 2                                                                 ;do wskaznika poczatku kopiujemy adres lancucha z przeniesieniem o 2 w prawo, powrot na poczatek tablicy
  53.         mov cl, byte ptr [si-1]                                                                 ;do rejestru cL kopiujemy wskaznik poczatku z przesunieciem o 1 w lewo
  54.         mov ch, 00h                                                                                                     ;rejestr cH uzupelniamy zerami
  55.         mov ax, 0000h                                                                                           ;wypelniamy akumulator zerami
  56. oblicz :
  57.         mul mnoznik                                                                                                             ;mnozy bez znaku akumulator przez wartosc zadeklarowana w mnoznik
  58.         mov bl, byte ptr [si]                                                                           ;do rejestru bL kopiujemy wskaznik poczatku
  59.         mov bh, 00h                                                                                                     ;wskaznik bH uzupelniamy zerami
  60.         add ax, bx                                                                                                      ;do rejestru akumulatorowego aX dodajemy rejestr bX
  61.         inc si                                                                                                                  ;wskazujemy na kolejna komorke
  62.         loop oblicz                                                                                                               ;powtarzaj do konca lancucha
  63.  
  64.         mov si, offset buf4 + 2                                                                 ;do wskaznika poczatku kopiujemy adres lancucha z przeniesieniem o 2 w prawo
  65.         mov bx, ax                                                                                                      ;kopiujemy zawartosc akumulatora do rejestru B
  66.         mov dx, 0000h                                                                                           ;uzupelniamy rejestr dX zerami
  67.         mov ax, 1000h                                                                                           ;uzupelniamy rejestr aX wartoscia 1000
  68. konwersja :
  69.         mov cx, 0000h                                                                                           ;uzupelniamy rejestr cX zerami
  70. konwersja1 :
  71.         cmp bx, ax                                                                                                      ;odejmujemy od rejestru bx rejestr ax, zeby sprawdzic ktory wiekszy
  72.         jb konwersja2                                                                                                                ;jezeli bX wiekszy, skaczemy do konwersja2
  73.         sub bx, ax                                                                                                      ;odejmujemy od rejestru bx rejestr ax,
  74.         inc cx                                                                                                                  ;zwiekszamy cX o 1
  75.         jmp konwersja1                                                                                                                ;skok do konwersja1
  76. konwersja2 :
  77.         cmp cx, 0ah                                                                                                     ;porownujemy cX z wartoscia 0010, if cX<10,c=1
  78.         jb konwersja3                                                                                                                ;jezeli C=1, to skok do konwersja3
  79.         add cl, 37h                                                                                                     ;dodajemy do cL wartosc 7ASCII
  80.         jmp konwersja4                                                                                                               ;skok bezwarunkowy do cont      5
  81. konwersja3 :
  82.         add cl, 30h                                                                                                     ;dodaj do cL wartosc 0ASCII
  83. konwersja4 :
  84.         mov byte ptr [si], cl                                                                           ;skopiuj wartosc cL do wskaznika poczatku
  85.         inc si                                                                                                                  ;si++
  86.         mov cx, 0010h                                                                                           ;skopiuj do cX wartosc 0010
  87.         div cx                                                                                                                  ;podziel bez znaku akumulator przez cX
  88.         cmp ax, 0000h                                                                                           ;porownaj akumulator z wartoscia 0000, jezeli aX<0000, c=1
  89.         jnz konwersja                                                                                                     ;jezeli flaga z!=0, skocz do konwersja
  90.  
  91.         mov byte ptr [si], '$'                                                                          ;przesun na koniec tablicy znak konca lini
  92.         wypisz buf3                                                                                                     ;wyprowadz na ekran zawartosc buf3
  93.         wypisz buf4+2                                                                                                                                                                   ;wyprowadz na ekran zawartosc przekonwertowanej tablicy z przesuniecie
  94.  
  95.  
  96. stop :
  97.         mov ax, 4c00h                                                                                           ;przerwanie programu
  98.         int 21h
  99. code ends
  100.         end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement