Advertisement
plyp

Untitled

Dec 16th, 2019
215
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. hexBin macro wart                     ; binary (0/1) output of wart to screen
  7. local lup                               ; local symbol
  8.      mov ax,0000h
  9.      mov cx,0000h
  10.      mov dx,0000h
  11.       push   ax                         ; save our regs (flag reg should also be saved)
  12.       push   cx                         ;
  13.       push   dx                        ;
  14.       mov    bl, wart                ; move wart into bl reg
  15.       mov    cx, 8                    ; Loop counter, a byte has 8 bits
  16.       mov    ah, 2h                  ; DOS function to output one char from dl
  17.                                             ; the gist of the matter is the four-line lup
  18. lup:  rcl    bl, 1                      ; left-rotating bl through carry CF
  19.       mov    dl, 30h                    ; make an ASCII out of it, ascii = number + '0'
  20.       adc    dl, 0                      ; Add with carry, that is ascii=30h+0 or 30h+1
  21.       int    21h                        ; jump to DOS and execute 2h there
  22.       loop   lup                        ; dec cx and repeat until cx = 0
  23.       pop    dx                         ; revive our regs
  24.       pop    cx                         ;
  25.       pop    ax                         ;
  26. endm  hexBin
  27.  
  28. stosik segment STACK 'STACK'
  29. dw  100h    dup(?)
  30. stosik ends
  31.  
  32. data segment        ;segment danych
  33.         buf1 db "Wprowadz liczbe decymalnie : $"        ;wiadomosc 1
  34.         buf2 db 0ah, "Liczba nie jest z zakresu 0-9$"   ;wiadomosc 2
  35.         buf3 db 0ah, "Odpowiednik w zapisie hex: $" ;wiadomosc 3
  36.         buf4 db 6                                                       ;alokacja 6 jednostek pamieci
  37.              db 0
  38.              db 6 dup(0)                                                ;wypelnienie w.w jednostek zerami
  39.         buf5 db 0ah, 0dh
  40.         mnoznik db 0ah                                                  ;BLOB  
  41. data ends
  42.  
  43. code segment
  44.         assume cs:code, ds:data, ss:stosik                   ;zadeklarowanie nazw segmentow do ktorych bedziemy sie odwolywac
  45. start :
  46.         mov ax, data                                                ;do ax kopiujemy zawartosc segmentu z danycmi
  47.         mov ds, ax                                                  ;kopiujemy zaw. ax do ds[data segment]
  48.         mov es, ax                                                  ;kopiujemy zaw. ax do do es[extra segment]
  49.  
  50.         wypisz buf1                                                 ;wywolanie makra z parametrem buf1.
  51.  
  52.         mov ah, 0ah                                                 ;do rejestru ah wprowadzamy dane z klawiatury, przy pomocy rozkazu dosowego
  53.         lea dx, buf4                                                    ;limitujemy liczbe znakow wprowadzonych przez uzytkownika o wczesniej zadeklarowana ilosc
  54.         int 21h                                                         ;
  55.  
  56.         mov si, offset buf4 + 2                                 ;kopiujemy do wskaznika zrodla adres buf4 z przeniesieniem o 2
  57.         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
  58.         mov ch, 00h                                                 ;zerujemy starszy bajt rejestru C
  59. sprawdzanie :
  60.         mov al, byte ptr [si]                                       ;przenosimy wartosc ciagu znakow do rejetru aL
  61.         cmp al, 30h                                                 ;odejmujemy od pojedynczego znaku 30h(0 ascii) zeby sprawdzic czy jest cyfra 0-9
  62.         jnb sprawdzanie2                                            ;jezeli jest mniejsza (C=1 ) to wyszlismy z zakresu
  63.         wypisz buf2                                                 ;komunikat bledu
  64.         jmp stop                                                        ;skok do instrukcji przerwania programu
  65. sprawdzanie2 :
  66.         cmp al, 3ah                                                 ;odejmujemy od pojedynczego znaku 3ah(; ascii ) zebyu sprawdzic czy jest cyfra 0-9
  67.         jb cont2                                                        ;jezeli jest wieksza (C=0) to wyszlismy z zakresu
  68.         wypisz buf2                                                 ;komunikat bledu
  69.         jmp stop                                                        ;skok do instrukcji przerwania programu
  70. cont2 :
  71.         sub al, 30h                                                 ;odejmujemy od al 0 ascii
  72.         mov byte ptr [si], al                                       ;zawartosc rejestru po wykonaniu operacji odjecia kopiujemy spowrotem do wskanzika
  73.  
  74.         inc si                                                          ;wskazujemy na kolejna komorke
  75.         loop sprawdzanie                                            ;dopoki nie skonczy sie nasz lancuch, powtarzaj sprawdzanie kazdego znaku
  76.  
  77.         mov si, offset buf4 + 2                                 ;do wskaznika poczatku kopiujemy adres lancucha z przeniesieniem o 2 w prawo, powrot na poczatek tablicy
  78.         mov cl, byte ptr [si-1]                                 ;do rejestru cL kopiujemy wskaznik poczatku z przesunieciem o 1 w lewo
  79.         mov ch, 00h                                                 ;rejestr cH uzupelniamy zerami
  80.         mov ax, 0000h                                               ;wypelniamy akumulator zerami
  81. calc :
  82.         mul mnoznik                                                     ;mnozy bez znaku akumulator przez wartosc zadeklarowana w mnoznik
  83.         mov bl, byte ptr [si]                                       ;do rejestru bL kopiujemy wskaznik poczatku
  84.         mov bh, 00h                                                 ;wskaznik bH uzupelniamy zerami
  85.         add ax, bx                                                  ;do rejestru akumulatorowego aX dodajemy rejestr bX
  86.         inc si                                                          ;wskazujemy na kolejna komorke
  87.         loop calc                                                       ;powtarzaj do konca lancucha
  88.  
  89.         mov si, offset buf4 + 2                                 ;do wskaznika poczatku kopiujemy adres lancucha z przeniesieniem o 2 w prawo
  90.         mov bx, ax                                                  ;kopiujemy zawartosc akumulatora do rejestru B
  91.         mov dx, 0000h                                               ;uzupelniamy rejestr dX zerami
  92.         mov ax, 1000h                                               ;uzupelniamy rejestr aX wartoscia 1000
  93. convert :
  94.         mov cx, 0000h                                               ;uzupelniamy rejestr cX zerami
  95. conv :
  96.         cmp bx, ax                                                  ;odejmujemy od rejestru bx rejestr ax, zeby sprawdzic ktory wiekszy
  97.         jb cont3                                                        ;jezeli bX wiekszy, skaczemy do cont3
  98.         sub bx, ax                                                  ;odejmujemy od rejestru bx rejestr ax,
  99.         inc cx                                                          ;zwiekszamy cX o 1
  100.         jmp conv                                                        ;skok do conv
  101. cont3 :
  102.         cmp cx, 0ah                                                 ;porownujemy cX z wartoscia 0010, if cX<10,c=1
  103.         jb cont4                                                        ;jezeli C=1, to skok do cont4
  104.         add cl, 37h                                                 ;dodajemy do cL wartosc 7ASCII
  105.         jmp cont5                                                       ;skok bezwarunkowy do cont  5  
  106. cont4 :
  107.         add cl, 30h                                                 ;dodaj do cL wartosc 0ASCII
  108. cont5 :
  109.         mov byte ptr [si], cl                                       ;skopiuj wartosc cL do wskaznika poczatku
  110.         inc si                                                          ;si++
  111.         mov cx, 0010h                                               ;skopiuj do cX wartosc 0010
  112.         div cx                                                          ;podziel bez znaku akumulator przez cX
  113.         cmp ax, 0000h                                               ;porownaj akumulator z wartoscia 0000, jezeli aX<0000, c=1  
  114.         jnz convert                                                 ;jezeli flaga z!=0, skocz do convert
  115.  
  116.         mov byte ptr [si], '$'                                      ;przesun na koniec tablicy znak konca lini
  117.         wypisz buf3                                                 ;wyprowadz na ekran zawartosc buf3
  118.         wypisz buf4+2                                               ;wyprowadz na ekran zawartosc przekonwertowanej tablicy z przesunieciem o 2
  119.         MOV dl, 10
  120. MOV ah, 02h
  121. INT 21h
  122. MOV dl, 13
  123. MOV ah, 02h
  124. INT 21h
  125.         mov si, offset buf4 + 2
  126.         hexBin 15h
  127. stop :
  128.         mov ax, 4c00h                                               ;przerwanie programu
  129.         int 21h
  130. code ends
  131.         end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement