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