Asembler - wprowadzanie dwóch liczb hex na 16 bit każda

Witam, mam za zadanie wprowadzić dwie liczby hex na 16 bitach każda (czyli po 4 znaki) i je wyświetlić. Jednak przy wpisywaniu pierwszej liczby, a konkretnie jej 4 znaku, wywala mnie. Nie wiem gdzie jest przyczyna, przekraczam pamięć, źle się odwołuję?

pisz macro txt  

        lea dx, txt

        mov ah,9

        int 21h 

endm            


clrscr macro

        mov ax,3

        int 10h 

endm    


ustawKursor macro X,Y         

        mov ah,2                       

        mov bh,0                       

        mov dl,Y                       

        mov dh,X                       

        int 10h                        

endm                                  


sts segment stack 'stack'

        db 512 dup(0)

sts ends             


dane segment         


 	zmienna1 db 0

 	txt2 db 'Podaj wartosc L1 hex = $'

	txt3 db 'Podaj wartosc L2 hex = $'

	txt4 db 'Podales L1 = $'

	txt5 db 'Podales L2 = $'


dane ends                         


prog segment                      

        assume cs:prog,ds:dane,ss:sts

P486N                             

start:                            

        mov ax,seg dane           

        mov ds,ax                 

        clrscr   

		ustawKursor 3,10

		pisz txt1

        ustawKursor 4,10         

        pisz txt2                 

        call pobHex         

		ustawKursor 5,10

		pisz txt3

		call pobHex

		ustawKursor 6,10

		pisz txt4                  

		call wyswHex

		ustawKursor 7,10

		pisz txt5

		call wyswHex


		mov ah,7

		int 21h


        mov ah,4ch             

        int 21h                


pobHex proc 

        call pobHex1

        shl al,4

        push ax

        call pobHex1

		push ax

		call pobHex1

		push ax

		call pobHex1

        pop dx

        and al,0Fh

        and dl,0F0h

        add al,dl

        mov zmienna1,al

        ret

endp         


pobHex1 proc

ety1:        

        mov ah,7

        int 21h


        cmp al,'0'

        jb ety1

        cmp al,'9'

        jbe cyfr

        cmp al,'A'

        jb ety1

        cmp al,'F'

        jbe lit_d

        cmp al,'a'

        jb ety1

        cmp al,'f'

        ja ety1

lit_m:       

        push ax

        mov dl,al ; wyswietlenie

        mov ah,2

        int 21h

        pop ax       

        sub al,87

        jmp ety2

lit_d:         

        push ax

        mov dl,al ; wyswietlenie

        mov ah,2

        int 21h

        pop ax       

        sub al,55

        jmp ety2

cyfr:          

        push ax

        mov dl,al ; wyswietlenie

        mov ah,2

        int 21h

        pop ax       

        sub al,30h ; 48

ety2:          

        ret ;4 mlodsze bity rejestru al zawieraja wartosc jednej liczby hex

endp           




wyswHex proc

        mov al,zmienna1 ; pierwszy znak

        shr al,4

        cmp al,10

        jb ety4

        add al,55 ; kody ascii liter

        jmp ety5

ety4:

        add al,30h

ety5:                

        mov dl,al

        mov ah,2                           

        int 21h                            


        mov al,zmienna1 ; drugi znak

        and al,0Fh

        cmp al,10 

        jb ety6   

        add al,55 ; kody ascii liter

        jmp ety7

ety6:

        add al,30h


ety7:

		mov dl,al

        mov ah,2                           

        int 21h                            


        mov al,zmienna1 ; trzeci znak

        and al,0Fh

        cmp al,10 

        jb ety8   

        add al,55 ; kody ascii liter

        jmp ety9


ety8:

        add al,30h


ety9:		

		mov dl,al

        mov ah,2                           

        int 21h                            


        mov al,zmienna1 ; czwarty znak

        and al,0Fh

        cmp al,10 

        jb ety10   

        add al,55 ; kody ascii liter

        jmp ety11


ety10:

        add al,30h


ety11:


        mov dl,al

        mov ah,2                           

        int 21h                            

        ret                            

endp                                        



prog ends                                  

end start

W tej procedurze:

pobHex proc

            call pobHex1

            shl al,4

            push ax

            call pobHex1

          push ax

          call pobHex1

          push ax

          call pobHex1

            pop dx

            and al,0Fh

            and dl,0F0h

            add al,dl

            mov zmienna1,al

            ret

    endp

Wrzucasz na stos 3 wartości 16 bitowe, a zdejmujesz tylko jedną.

Instrukcja ret powraca z procedury zdejmując ze stosu, adres powrotu. Niestety za adres powrotu w tym przypadku robią wrzucone przez Ciebie wartości ax. Przed wywołaniem instrukcji ret należy zdjąć ze stosu wszystkie wartości umieszczone na stosie przez tę procedurę.

Domyślam się, że Twoim założeniem było zwrócenie przez stos pewnych wartości z procedury. Oczywiście można tak zrobić, ale należy zastosować tzw. ramkę stosu. Nie jest to rzecz trudna, ale myślę, że łatwiej w tej sytuacji zwrócić wartości umieszczając je po prostu w odpowiednich rejestrach ogólnego przeznaczenia.

Masz w tej funkcji cztery razy push a tylko jeden raz pop