[ASM] Problem z wyświetleniem wyniku ze zmiennej

0

Witam,

Mam wynik w zmiennej suma w postaci HEX. W procedurze wczytaj2 próbuje ją wyświetlić, ale DOS wywala mi ślaczki. Mógłby ktoś poprawić żeby poprawnie wyświetlało. Za pomoc dzięki.

MojStos    SEGMENT STACK       
           DB      64 DUP ('Stos!!!') 
MojStos    ENDS

MojeDane     SEGMENT
Nap1       DB      "Podaj liczbe",'$'
liczba DB 16
licz DB 8
licz1 DB 8
suma DW 8


MojeDane     ENDS

MojProgram     SEGMENT
           assume CS:MojProgram,DS:MojeDane
Main       PROC

Start:     mov  AX,MojeDane   
           mov  DS,AX      
mov [licz],0h
mov [licz1],0h
mov [suma],0
           lea  DX,Nap1  
           mov AH,09H      
           int 21H   

jmp wczytaj1


wczytaj1 proc
        
mov	ah, 0
int	16h
mov AH,0
sub AL,30h
push AX
inc [licz]
cmp AL,0DDH
jne wczytaj1
pop  AX
dec [licz]
jmp dalej1
wczytaj1 endp


dalej1 proc
mov BL,[licz1]
ADD BL,1
mov BH,[licz]
cmp BL,BH
jg wczytaj2
mov AX,1h
mov cx,0h
mov cl,bl
mov bl,0Ah
cmp [licz1],0
je mnoz_0
petla:
mul bl
LOOP petla
jmp mnoz_0
mnoz_0 proc
pop BX
mul bl
INC [licz1]

ADD [suma],AX

jmp dalej1
mnoz_0 endp
dalej1 endp


wczytaj2 proc
           mov DX,offset suma
           mov AH,09H      
           int 21H   

wczytaj2 endp

           mov  AH,4CH     
           mov  AL,0      
           int  21H     

Main       ENDP

MojProgram     ENDS
           END Start
0

Czy ja rozumiem dobrze? W ds:[suma] masz LICZBĘ? Np. powiedzmy 50?
To nie wypiszesz tego tak łatwo :P
Musisz wypisywać po znaku, przeliczając co masz wyświetlić. To będzie wyglądało tak:

Jeśli liczba < 10 to ja wpisujesz i wipisujesz po kolei to co leży na stosie
jeśli liczba > 10 to :
push liczba modulo 10
liczba = liczba / 10

rozklad_cyfr:
    cmp al,10 ;czy juz cyfra?
      jb cyfra
    div dl ;w al mamy ax/dl i w ah mamy ax mod dl	
    add ah,'0' ;żeby wypisalo cyfrę a nie krzaka
    push ax ;zrzucamy cyfrę do wypisania na stos, będzie w ah
    inc cx  ;zliczamy ile cyfr należy potem zdjąć ze stosu
jne rozklad_cyfr	

cyfra: ;mamy już tylko jedną cyfrę
    mov ah,al ;żeby wszystkie cyfry na stosie były w ah
    add ah,'0'
    push ax
    inc cx
jmp wypisywanie

A wypisywanie to po prostu pętelka po CX zdejmująca po kolei ze stosu wartości i wypisujaca je.

edit: kod powyżej jest oczywiście pisany tak jakbyś miał tam liczbę DZIESIETNĄ, nie doczytałem że chodziło o hexa ;)

0

Chciałbym wrócić do mojego kodu. Zrobiłem tak jak kolega radził, ale coś mi nie wyświetla tej liczby (901 dziesttnie) a dobrze liczy, a nawet robił że wyswietlał ślaczki i komputer bipczał.

Proszę o poprawkę kodu, bo już nie daje radę, Dziękuję.

MojStos    SEGMENT STACK       
           DB      64 DUP ('Stos!!!') 
MojStos    ENDS

MojeDane     SEGMENT
Nap1       DB      "Podaj liczbe",'$'
liczba DB 16
licz DB 8
licz1 DB 8
suma DW 8


MojeDane     ENDS

MojProgram     SEGMENT
           assume CS:MojProgram,DS:MojeDane
Main       PROC

Start:     mov  AX,MojeDane   
           mov  DS,AX      

mov [suma],901d
mov AX,[suma]
mov BL,10d
licz88:
div BL
add AH,'0'
push AX
mov AH,0
inc CX
cmp AL,0
jne licz88
jmp wypisz


wypisz:

petla:
pop DX
mov AL,AH
mov  AH,09H      
int  10H  
LOOP petla




           mov  AH,4CH     
           mov  AL,0      
           int  21H     

Main       ENDP

MojProgram     ENDS
           END Start    
0

Bo źle wypisujesz. Masz wypisywać PO ZNAKU.

mov dl, znak_do_wypisania
mov ah,02h
int 21h

Podkreślam ze masz mieć wartość w DL (bo w twoim kodzie znak do wypisania lezy w AH więc pop DX spowoduje ze coś do wypisania musisz przenieść do DL z DH najpierw).

No i naucz się laskawie formatować ten kod jakoś, bo asm jest średnio czytelny w takiej postaci..

MojeDane SEGMENT
	Nap1 DB "Podaj liczbe",'$'
	liczba DB 16
	licz DB 8
	licz1 DB 8
	suma DW 8
MojeDane ENDS

MojProgram SEGMENT           
	Start:     
		mov AX,MojeDane ;ustawienie segmentu danych
		mov DS,AX      
		mov AX, seg top ;ustawienie stosu
		mov SS, AX		
		xor cx,cx ;to sobie trzeba wyzerować wcześniej jak chcesz coś zliczać w tym rejestrze
		mov ds:[suma],901d ;warto pisać ds:[suma] zamiast samego [suma] ;)
		mov AX,ds:[suma]
		mov BL,10d
		licz88:
			div BL
			add AH,'0'
			push AX
			mov AH,0
			inc CX
			cmp AL,0
		jne licz88
		petla:
			pop DX ;pobieramy znak do wypisania ze stosu
			mov DL,DH ;przenosimy ten znak do DL
			mov  AH,02H ;tryb wypisywania jednego znaku z DL
			int  21H  ;wypisanie znaku
		LOOP petla
		
        mov  AH,4CH     
        mov  AL,0      
        int  21H     
MojProgram ENDS

MojStos SEGMENT STACK       
	top DB      64 DUP ('Stos!!!') 
MojStos ENDS

END Start     

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