Assembler- konwersja liczb na system szesnastkowy U2

0

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 binarny.
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,[zm1] **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
	txt1 db 'wartosc BIN: $'
	;zm1  db 7
dane ends                    

include macros.asm
                          
prog segment              
        assume cs:prog,ds:dane,ss:sts
P486N        
start:                    
        mov ax,seg dane   
        mov ds,ax   
			  
wysw_bin:       
	wyswietl txt1

	pob_znak
	
	
ety0:
	;mov bl, [zm1]
	mov bl,al
   	mov cx,8
	
	
ety1:			       
	push cx 	       
	rcl bl,1
	jc ety2 	       
	mov dl,'0'
	jmp ety3	       
ety2:			       
	mov dl,'1'
ety3:			       
	mov ah,2	       
	int 21h 	       
	pop cx		       
	loop ety1	       
	
prog ends
end start
0
  1. Jaki assembler?
  2. Jaka architektura procesora?
0

Assembler 80x86

1

Napisałem Ci wczytywanie napisu do zmiennej i wyświetlanie go.

.model small
.stack 100h
.data
msg1 db "Enter number:", 0Dh, 0Ah, '$'
mynum db 32 dup(0)

.code
main proc
	mov ax, @data
	mov ds,ax

	;wyświetl napis
	mov dx, offset msg1
	mov ah, 09h
	int 21h

	;zapisz do rejestru BX adres zmiennej mynum
	mov bx, offset mynum
	
	;wczytaj tekst znak po znaku
	;dopóki nie zostanie wciśnięty klawisz Enter
	_loop:
	mov ah, 01h
	int 21h
	cmp al, 0Dh
	je _done
	mov byte ptr [ds:bx], al
	inc bx
	jmp _loop
	
	_done:
	;dodaj znak dolara oznaczający koniec napisu
	mov byte ptr [ds:bx], '$'
	
	;TODO here...
	;(...)
	
	;wyświetl wprowadzony tekst
	mov dx, offset mynum
	mov ah, 09h
	int 21h

	;zakończ program
	mov ah, 4Ch
	mov al, 0
	int 21h

main endp
end main
0

Dziękuję bardzo, teraz już wiem jak do jednej zmiennej wprowadzić kilka cyfr wpisanych przez użytkownika!
Jednak nadal coś źle mi przelicza :/ Dla liczby 7 wynik wyszedł 1111, a powinien wyjść 111

0

Teraz zauważyłem, że w ogóle źle to robię. Myślałem najpierw, że jak muszę zamienić liczbę na system szesnastkowy to najpierw trzeba zamienić liczbę również na binarny wg innej metody.Okazuje się, że mam przykład, gdzie od razu program zamienia liczbę dziesiętną na szesnastkowy. Jednak problem pozostaje ten sam. Dopóki liczba jest podana w zmiennej wszystko działa jak należy. Jednak kiedy chcę pobrać liczbę z klawiatury, wszystko działa nie tak jak powinno.... Może macie jakieś pomysły?

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 al,[zmienna]                            ;tak działa
		mov bl, al                                         ;tak nie 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

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