Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DOSINTR EQU 021H
- EXIT EQU 04CH
- OK EQU 000H
- CR EQU 00DH ;CARRIAGE RETURN (POWROT KARETKI)
- LF EQU 00AH ;LINE FEED (LINIA PELNA - COS TAKIEGO)
- PROGRAM SEGMENT
- ASSUME CS:PROGRAM, DS:DATA, SS:STACK_
- DATA SEGMENT
- POLECENIE DB 'PODAJ LICZBE W SYSTEMIE DEC : ',CR,LF,'$'
- BUFOR DB 6 ;TO CALE | PRZERWANIE 'WIE' ILE MOZE MAX WPISAC
- ILE DB (0) ;JEST | FAKTYCZNA LICZBA ZNAKOW
- TAB DB 6 DUP (?) ;BUFOREM | 5 ZNAKOW + CR (ENTER)
- SUMA DW (0)
- DZIESIETNIE DB CR,LF,'DZIESIETNIE : $'
- BINARNIE DB CR,LF,'BINARNIE : $'
- SZESNASTKOWO DB CR,LF,'SZESNASTKOWO : $'
- HEX DB '0123456789ABCDEF' ;NIE TRZEBA $ BO TO NIE JEST DRUKOWANE
- ZBYT_DUZA DB 'PODANA LICZBA JEST ZBYT DUZA ! PODAJ LICZBE <= 65535 DEC$'
- BRAK_DANYCH DB 'NIE WPISANO ZADNEJ WARTOSCI !$'
- ZLE_DANE DB 'PODANY CIAG ZNAKOW NIE MOZE ZOSTAC '
- DB 'ZINTERPRETOWANY JAKO LICZBA !$'
- DATA ENDS
- ;PROCEDURA (PSEUDO FUNKCJA) WYPISYWANIE LANCUCHA
- ;WYWOLANIE LEA AX,POLECENIE
- ; CALL WYPISZ
- WYPISZ PROC
- MOV DX,AX
- XOR AX,AX
- MOV AH,09H
- INT DOSINTR
- RET
- WYPISZ ENDP
- ;TO SAMO DLA WCZYTANIA
- WCZYTAJ PROC
- MOV DX,AX
- XOR AX,AX
- MOV AH,0AH
- INT DOSINTR
- RET
- WCZYTAJ ENDP
- ;TO SAMO DLA POJEDYNCZEGO ZNAKU
- ASCI_ZNAK PROC
- PUSH DX
- MOV DX,AX
- XOR AX,AX
- MOV AH,02H
- INT DOSINTR
- POP DX
- RET
- ASCI_ZNAK ENDP
- ;WYPISYWANIE BINARNIE
- PISZ_BIN PROC
- MOV CX,10H ;16 ITERACJI
- MOV DX,SUMA
- BIN: PUSH DX
- AND DX,08000H ;WYLUSKANIE BITU NAJMLODSZEGO
- CMP DX,08000H ;TEST CZY TO JEDYNKA
- JNZ ZERO
- MOV AX,'1'
- CALL ASCI_ZNAK
- JMP DAL
- ZERO: MOV AX,'0'
- CALL ASCI_ZNAK
- DAL: POP DX
- SHL DX,01H
- LOOP BIN ;PUKI CX <> 0
- RET
- PISZ_BIN ENDP
- ;WYPISYWANIE SZESNASTKOWO
- PISZ_HEX PROC
- MOV CX,04H ;4 ITERACJE
- MOV BX,SUMA
- SZESN: PUSH BX
- AND BX,0F000H ;MASKOWANIE 4 BITOW
- SHR BX,0CH ;PRZESUWANIE DO PRAWEJ
- MOV AL,HEX[BX] ;INDEXOWANIE TA LICZBA, WYPISANIE Z TABLICY HEX
- CALL ASCI_ZNAK
- POP BX
- SHL BX,04H ;PRZESUNIECIE O 4 POCZATKOWEJ WARTOSCI BX
- LOOP SZESN ;PUKI CX <> 0
- RET
- PISZ_HEX ENDP
- START: ;STANDARDOWY POCZATEK
- MOV AX,DATA
- MOV DS,AX
- MOV AX,STACK_
- MOV SS,AX
- LEA SP,TOP
- XOR AX,AX
- ;WPROWADZ LICZBE OR DIE !
- LEA AX,POLECENIE
- CALL WYPISZ
- ;WCZYTAJ DO BUF Z KONSOLI
- LEA AX,BUFOR
- CALL WCZYTAJ
- ;CZY LANCUCH JEST PUSTY
- CMP ILE,00H
- JE PUSTY
- ;BX INDEKSUJE BAJTY WEJSCIA OD 0
- XOR BX,BX
- PENTLA: ;PRZETWARZANIE CIAGU ZNAKOW - WG ALGORYTMU Z FOTY
- ;PRAWIE JAK WHILE :-D
- CMP BL,ILE
- JE DALEJ
- ;ODLOZENIE BX BO BEDZIE WYKORZYSTANY W MNOZENIU
- PUSH BX
- ;MNOZENIE SUMY * 10
- MOV AX,SUMA
- MOV BX,0AH
- MUL BX
- MOV SUMA,AX
- JC ZA_DUZY
- ;MUSI BYC TU ZCIAGNIETE !
- ;GDYBY DALEJ TO KRZAKI I NIEWIEM CZEMU :-P
- POP BX
- ;CZY ZNAK JEST CYFRA
- XOR AX,AX
- MOV AL,TAB[BX]
- SUB AX,'0'
- CMP AX,0AH
- JNC ZLY
- ;POWIEKSZENIE SUMY O CYFRE JEDNOSCI
- ADD SUMA,AX
- JC ZA_DUZY
- ;INKREMENTACJA INDEXU I POWROT
- INC BX
- JMP PENTLA
- PUSTY: ;BESZTANIE FRAJERA
- LEA AX,BRAK_DANYCH
- CALL WYPISZ
- JMP KONIEC
- ZLY: ;BESZTANIE FRAJERA
- LEA AX,ZLE_DANE
- CALL WYPISZ
- JMP KONIEC
- ZA_DUZY: ;BESZTANIE FRAJERA
- LEA AX,ZBYT_DUZA
- CALL WYPISZ
- JMP KONIEC
- DALEJ: ;DOPISANIE NA KONIEC '$' - TAM GDZIE ENTER
- XOR BX,BX
- MOV BL,ILE
- MOV TAB[BX],'$'
- ;PISZ TO CO Z WEJSCIA
- ;CZYLI DZIESIETNIE
- LEA AX,DZIESIETNIE
- CALL WYPISZ
- LEA AX,TAB
- CALL WYPISZ
- ;PISZ BINARNIE
- LEA AX,BINARNIE
- CALL WYPISZ
- CALL PISZ_BIN
- ;PISZ SZESNASTKOWO
- LEA AX,SZESNASTKOWO
- CALL WYPISZ
- CALL PISZ_HEX
- KONIEC: ;GIVE DOS HIS POWER BACK OR DIE !
- MOV AL,OK
- MOV AH,EXIT
- INT DOSINTR
- PROGRAM ENDS
- STACK_ SEGMENT
- ;STOS JEDNAK MA 1024 BAJTY BO WORD MA 16 BITOW
- DW 100H DUP (?)
- TOP LABEL WORD
- STACK_ ENDS
- END START
Add Comment
Please, Sign In to add comment