Asembler drobne poprawki

0

Witam, mam projekt z asemblera (przeliczanie liczb z systemu 10 na dowolny inny z przedzialu 2 - 16) zrobilem, teoretycznie chodzi, tylko....osoba u ktorej robie projekt chce zeby bylo dla wiekszych liczb bo na razie moj dziala do liczby 65539, przekroczenie rejestru pewnie gdzies mam, a z asemblera jestem totalnie ciemny prosilbym bym zeby ktos pomogl to poprawic...drugi problem to obsluga bledow, wykladowca nie chce zeby dalo sie wprowadzac liczby powyzej ograniczenia (czyli jak sien ie uda poprawic tego z tym rejestrem to zeby tylko zczytywal 65539, u mnie niby wyswietla blad, ale moge wpisywac kupe liczb dopoki nie wcisne entera to bedzie wczytywal, jemu chodzi oto zeby Od razu po przekroczeniu wywalil blad, czyli znak po znaku probowalem to robic ale wrzucal smieci do tablicy...bede bardzo wdzieczny za wszelka pomoc, wklejam kod (kompilator tasm)...

.model tiny
.stack 100h
.data
tekst1 db 'Podaj liczbe w systemie 10 ',10,13,'$'
tekst2 db 'Szukana liczba to: ',10,13,'$'
tekst3 db 'Maksymalna liczba jaka mozesz podac to 65539 dziesietnie',10,13,'$'
tekst4 db 'Podaj na jaki system chcesz zamienic (od 2 do 16)',10,13,'$'
tekst5 db 'Podano zla dana',10,13,'$'
en db 10,13,'$'
tablica db 100,?,102 dup('$')
tablica2 db 50,?,52 dup('$')
liczba dd 0
licznik dw 0
dzielnik dd 1

.code
start:
.486

	mov ax,@data
	mov ds,ax

	lea dx,tekst3
	mov ah,09h
	int 21h
	lea dx,en
	mov ah,09h
	int 21h

	lea dx,tekst1
	mov ah,09h
	int 21h	
	
	lea dx,tablica
	mov ah,0ah
	int 21h

	mov di,2
	mov cl,tablica[1]
	xor ch,ch

etykieta1:
	mov eax,liczba
              mov bx,10
              mul bx
              mov liczba,eax
        	mov bl, tablica[di]			
		sub bl,'0'
		xor bh,bh
                	add liczba,ebx
		inc di
loop etykieta1
poczatek:
	cmp tablica[2],'0'
	jb blad2
	cmp tablica[2],'9'
	ja blad2	

	cmp tablica[3],'9'
	ja blad2

	cmp tablica[4],'9'
	ja blad2

	cmp tablica[5],'9'
	ja blad2

	cmp tablica[6],'9'
	ja blad2

	cmp tablica[7],'0'
	jnb blad2

	cmp tablica[8],'0'
	jnb blad2

	lea dx,en
	mov ah,09h
	int 21h

	lea dx,tekst4
	mov ah,09h
	int 21h

	lea dx,tablica2
	mov ah,0ah
	int 21h

	cmp tablica2[2],'1'
	jb blad
	
	cmp tablica2[2],'9'
	ja blad

	cmp tablica2[3],'7'
	jnb blad
		
	cmp tablica2[4],'0'
	jnb blad
	
	cmp tablica2[3],'1'
	je inna
	
	cmp tablica2[3],'2'
	je inna

	cmp tablica2[3],'3'
	je inna

	cmp tablica2[3],'4'
	je inna

	cmp tablica2[3],'5'
	je inna

	cmp tablica2[3],'6'
	je inna

	mov bl,tablica2[2]
	sub bl,'0'
	xor bh,bh
	mov dzielnik,ebx
	
jakasetykieta:	
	mov eax,liczba	
	petla:	
	mov edx,0
	div dzielnik	
	push dx		
	inc licznik
	cmp ax,0
	jne petla

	lea dx,en
	mov ah,09h
	int 21h

	lea dx,tekst2
	mov ah,09h
	int 21h

	mov cx,licznik
wypisz:
	pop dx
	
        cmp dx,11
	je etyk11

	cmp dx,10
	je etyk10

	cmp dx,12
	je etyk12

	cmp dx,13
	je etyk13

	cmp dx,14
	je etyk14

	cmp dx,15
	je etyk15

	add dx,'0'
              mov ah,02h
	int 21h

	jmp koniec1

etyk10:
	mov dx,'A'
	mov ah,02h
	int 21h
	jmp koniec1

etyk11:
	mov dx,'B'
	mov ah,02h
	int 21h
	jmp koniec1

etyk12:
	mov dx,'C'
mov ah,02h
	int 21h
	jmp koniec1

etyk13:
	mov dx,'D'
mov ah,02h
	int 21h
	jmp koniec1

etyk14:
	mov dx,'E'
mov ah,02h
	int 21h
	jmp koniec1

etyk15:
	mov dx,'F'
	mov ah,02h
	int 21h
	jmp koniec1
koniec1:

loop wypisz
jmp koniec

inna:
	mov bl,tablica2[3]
	sub bl,'0'
	xor bh,bh
	add ebx,10
	mov dzielnik,ebx
jmp jakasetykieta

blad:
	lea dx,en
	mov ah,09h
	int 21h
	lea dx,tekst5
	mov ah,09h
	int 21h
jmp poczatek
jmp koniec

blad2:
	lea dx,en
	mov ah,09h
	int 21h
	lea dx,tekst5
	mov ah,09h
	int 21h
jmp koniec

koniec:
	mov ah,4ch
	int 21h
end start
end
0

Witam, mam projekt z asemblera (przeliczanie liczb z systemu 10 na dowolny inny z przedzialu 2 - 16) zrobilem, teoretycznie chodzi, tylko....osoba u ktorej robie projekt chce zeby bylo dla wiekszych liczb bo ort! moj dziala do liczby 65539, przekroczenie rejestru pewnie gdzies mam, a z asemblera jestem totalnie ciemny

Sam napisałeś ten program, czy nie? Bo nie potrafię już dojść...
No i w ogóle pytanie zasadnicze, na zaliczenie jakiego przedmiotu to ma byc zrobione, bo ja przerabiałem assemblera w technikum i na studiach i wszystko oparte było na gotowych układach mikroprocesorowych stricte czysto elektronicznych

0

Nie chce mi sie brnąć w cały ten kod .. ale pierwsze co mi do głowy przychodzi to zmiana

 mov bx,10
 mul bx

na instrukcje 32 bitowe :

 mov ebx, 10
  mul ebx

w ten sposób wynik mnożenia nie jest już w rejestrach dx:ax /32-bitach tylko w edx:eax /64-bitach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1