Assembler 80x86- konwersja liczb na system szesnastkowy

Witam. Dostałem za zadanie napisać program w assemblerze, który zamienia podane przez użytkownika liczby w linii poleceń na 16-bitowy system szesnastkowy (U2). Miałem dopiero 3 zajęcia z assemblera i tak średnio to ogarniam… Oczywiście dostałem jakieś tam przykładowy program, który zamienia podaną już z góry liczbę w systemie dziesiętnym na 8-bitowy system szesnastkowy.
I właśnie chciałem od tego przykładu sobie powoli zacząć projekt, który muszę zrobić. Jednak już na samym początku pojawił się problem, z którym nie potrafię sobie poradzić…
Otóż na samym początku chciałem ten przykładowy program przerobić tak, aby zamiast przeliczać podaną już wcześniej w zmiennej stałą liczbę, program pobierał ją od użytkownika, a następnie zamieniał.
Tak też zrobiłem, pobrałem znak, który zapisał się w rejestrze al, potem przerzuciłem tą liczbę to rejestru bl, ale niestety wyniki nie są poprawne…
Poniżej znajduje się cały kod z programu. Póki co jest możliwość wprowadzenia tylko liczby jednocyfrowej i nie ma sprawdzenia czy mieści się w przedziale itd…
Jeśli zamiast mov bl, al pojawi się tam mov bl, [zmienna] to oczywiście wszystko działa jak należy. Jeśli ktoś potrafi mi pomóc to bardzo bym prosił i odpowiedź.

    sts segment stack 'stack'
    db 512 dup(0)
sts ends       
                  
dane segment          
    tekst db 'Wartosc szesnastkowa: $'
    ;zmienna db 30
dane ends                    

include macros.asm
             
main segment   
  assume cs:main,ds:dane,ss:sts
start:  
P486N   
mov ax,seg dane  
mov ds,ax    


wyswietl tekst

wysw_hex:

	pob_znak
	
	mov bl, al                                       ;tak nie działa :(
	;mov bl,[zmienna]                         ;tak działa
	shr bl,4						;podział zmiennej na 4 pola bitowe
	cmp bl,10
	jb ety1
	add bl,55					;kody ascii liter
	jmp ety2
	

ety1:
	add bl, 30h
	
	
ety2:
	mov dl,bl					;wysw_znak
	mov ah,2
	int 21h 
	
	mov bl, al
	;mov al, [zmienna]		;druga cyfra hex
	and bl, 0Fh
	cmp bl, 10
	jb ety3
	add bl, 55					;kody ascii liter
	jmp ety4
	
	
ety3:
	add bl, 30h
	
	
ety4:
	mov dl,bl					;wysw_znak
	mov ah,2
	int 21h 
	

;proc funkcja

;ret
;endp

main ends        
end start

Może za bardzo nie pomogę, ale wpadł mi do głowy głupi pomysł po kilku godzinach od przeczytania tego tematu :P. Może będzie Ci pomocny :smiley:.

Napisz kod w C i skompiluj do tylko asm i zobacz jak to będzie wyglądało, będziesz mógł się może zainspirować podczas pisania własnego kodu. Boję się jednak, że tam się będzie grubo działo :stuck_out_tongue: i nic z tego się nie nada. Ale spróbować zawsze można :wink:.