Miałem problem z logowaniem więc powtarzam mój post.
Posiadam i przedstawiam poniżej kod programu, który podaną z klawiatury liczbę dziesiętną przelicza na dwojkową i szesnastkową
DEC - BIN - HEX
Mam do wykonania na pierwszym semestrze nauki program, ktory podaną z klawiatury liczbe dziesiętną przelicza na dwojkową i ósemkową.
DEC - BIN - OCT
Niestety nie potrafię się w tak krótkim czasie nauczyć Assemblera i proszę o POMOC. Czy mógłby mi ktoś przesłać zmodyfikowany poniższy kod, tak aby program przeliczał z DEC na dwójkowy i ósemkowy ??? Będę ogromnie wdzięczny bo muszę wykonać zadanie na zaliczenie. Jeszcze raz ogromnie proszę o pomoc i serdecznie pozdrawiam.
ASSUME cs:prog,ds:dane,ss:stoss,es:nothing
stoss segment stack
dw 100h dup(?)
top:
stoss ENDS
dane segment
bufor db 6,?,6 dup(?) ;1-szy bit max liczba znakow do wszytania dla(f-0A,int 21h)
liczba dw 0
enter_ db 10,13,"$"
l_dec db "podaj liczbe z zakresu 0-65536:",10,13,"$"
l_bin db "binarnie:",10,13,"$"
l_hex db "heksadecymalnie:",10,13,"$"
dane ENDS
prog segment
wielkosc_liczby PROC near
push dx
mov bx,liczba
mov dx,bx
mov cx,10h
skok:
shl bx,1h
jc dalej ;sprawdza od konca na ktorej pozycji lezy jedynka
shl dx,1h
loop skok
inc cx
dalej:
mov bx,dx
pop dx
ret
wielkosc_liczby ENDP
powrot_cr PROC near
mov ah,09h
mov dx,offset enter_
int 21h
ret
powrot_cr ENDP
start:
mov ax,dane ;przypisanie segmentow
mov ds,ax
mov ax,stoss
mov ss,ax
mov sp,offset top
poczatek:
mov ah,09h ;wywolanie komunikatu na ekran
mov dx,offset l_dec ;z offsetu l_dec
int 21h
mov dx,offset bufor ;zczytanie z ekranu do bufora
mov ah,0Ah
int 21h
mov ch,0h ;wyczyszczenie gornej czesci cx
mov cl,bufor[1] ;do cx liczba znakow
mov bx,offset bufor
add bx,cx ;przesuniecie bx
inc bx ;na ostatni znak
mov ax,1h ;wrzucenie do ax jednosci
mov dh,0h
petla: ;zamiana stringa na liczbe
mov dl,[bx] ;zaladowanie znaku
cmp dl,30h ;sprawdzenie czy znak
jb blad ;nalezy do
cmp dl,39h ;zakresu od 0-9
ja blad ;dla ASCII 30=0, 39=9
jmp dobrze
blad:
call powrot_cr
mov liczba,0h
jmp poczatek
dobrze:
sub dl,30h
push ax
mul dx ;ax*dx=ax (DX:AX), jednosci, dziesiatki, itd
jc blad
clc ;czysci CF
add liczba,ax
jc blad ;jesli liczba > 64k to wraca do poczatku
pop ax
mov dx,0Ah ;mnozymy ax*10=ax zeby dodawac do wyniku
mul dx ;jednosci, dziesiatki, setki, itd
dec bx ;przesuwamy bx na kolejny znak od konca
loop petla
call powrot_cr
mov ah,09h
mov dx,offset l_bin
int 21h
call wielkosc_liczby ;zwraca w bx liczbe dosunieta do lewej
;krawedzi rejestru, a w cx ilosc cyfr
petla1: ;wypisuje binarnie liczbe
shl bx,1h
jc jeden ;sprawdza czy przeniesienie
mov dl,"0"
jmp dla_zera ;jak nie bylo przeniesienia omija jedynke
jeden:
mov dl,"1"
dla_zera:
mov ah,2h ;f-02h int 21h wywala na ekran znak DL
int 21h
loop petla1
call powrot_cr ;wywala komunikat z offsetu 1_hex
mov ah,09h
mov dx,offset l_hex
int 21h
call wielkosc_liczby ;zwraca w bx liczbe dosuniecia do lewej
;krawedzi rejestru, a w CX ilosc cyfr(bin)
mov ax,cx ;liczbe cyfr dzieli przez 4
mov cl,04h ;bo bedzie wypisana hexadecymalnie
div cl ;sprawdza czy nie ma reszty z dzielenia
cmp ah,0h ;jak nie ma to dalej
jz dalej1
mov cl,4h
sub cl,ah ;odejmuje od cl (4h w cl) reszte
shr bx,cl ;przesuwa o roznice bx (liczba w bx)
mov ch,0h ;poniewaz bity beda grupowane po 4
mov cl,al
inc cx ;zwiekszam cx bo wypisze o jeden znak wiecej
jmp dalej2
dalej1:
mov ch,0h ;zeruje CH
mov cl,al ;do CL liczba cyfr do wypisania
dalej2:
petla2: ;wypisanie heksadecymalnie
mov dl,bh ;do dl nastarszy bajt liczby
shr dl,4h ;przesuwam o 4 w prawo bo chce tylko 4 bity
cmp dl,0Ah ;sprawdzam czy litera czy cyfra do wypisania
jb dla_cyfr
add dl,7h ;jak litera to dodaje jeszcze 7 bo a-9=7
dla_cyfr:
add dl,30h ;dodaje 30 do wartosci cyfry zeby uzyskac
mov ah,2h ;odwzorowanie w ASCII
int 21h
shl bx,4h ;przesuwam w lewo liczbe o 4 bity
loop petla2 ;ktore wypisalem na ekran
mov ah,4ch ;zakonczenie programu
int 21h
prog ENDS
end start