Asmembler liczba z DEC na ASCII

0

Witam,
Mam taki problem mam zapisany wynik mnożenia dwóch liczb 8 bitowych w zmiennej (w postaci dziesiętnej ). Następnie wczytuje liczbę do AX i chcę ją przekonwertować na kod ascii i wypisać. Problem polega na tym ze jeżeli wartość jest mniejsza od 255 czyli zapisana w AL to wynik jest prawidłowy natomiast jeżeli wynik jest większy i znajduje się w na 16 bitach AX ( AH i AL ) to wypisuje mi tylko wartość z AL.
Kod wygląda tak:

 	
    MOV AX,0
    MOV AX,[AB]
	
    MOV BL,AL
    MOV AH,0
    MOV AL,BL
    MOV BL,10
    DIV BL
    MOV BL,AL
    MOV BH,AH
    ADD BH,30H      ; convert to ascii code
    MOV DH,BH

    MOV AH,0
    MOV AL,BL
    MOV BL,10
    DIV BL
    MOV BL,AL
    MOV BH,AH
    ADD BH,30h      ; convert to ascii code
    ADD BL,30h      ; convert to ascii code
	
    MOV DL,BL
    MOV AH,02H
    INT 21H
	
    MOV DL,BH
    MOV AH,02H
    INT 21H
	
    MOV DL,DH
    MOV AH,02H
    INT 21H
0

Po co jest to:

    MOV AX,0

skoro od razu potem robisz to:

    MOV AX,[AB]

Nie wiem za bardzo po co jest to:

    MOV BL,AL

ale ta instrukcja zeruje ci starszy bajt

    MOV AH,0

więc tracisz wartości większe od 255.

    MOV AL,BL

Teraz już zupełnie nie rozumiem, najpierw kopiujesz al do bl, a teraz z powrotem bl do al?
Dalej nie czytam. To jest bełkot a nie program.

0

Od razu widzę że robisz tu jakieś cuda na kiju. Napisz to jak człowiek:

  • znajdź w pętli największy wykładnik dla 10, tzn taką potęgę dziesiątki dla której div da ci 0 i tą liczbę podziel przez 10
    Na przykład jeśli liczbą jest 12345 to szukana potęga to 100000 / 10 = 10000

a potem już z górki:
dopóki liczba nie jest 0

  • zrób liczba div potęga_policzona_wcześniej
  • wypisz wynik dzielenia
  • liczba = reszta z dzielenia
  • potęga_policzona_wcześniej = potęga_policzona_wcześniej/10

Czyli dla 12345 mamy:
12345 != 0

  • 12345 / 10000 = 1 oraz 2345 reszty
  • wypisujemy 1
  • liczba = 2345
  • potęga_policzona_wcześniej = 10000/10 = 1000
    2345 !=0
  • 2345 / 1000 = 2 oraz 345 reszty
  • wypisujemy 2
  • liczba = 345
  • potęga_policzona_wcześniej = 1000/10 = 100
    345 !=0
  • 345 / 100 = 3 oraz 45 reszty
  • wypisujemy 3
  • liczba = 45
  • potęga_policzona_wcześniej = 100/10 = 10
    45 !=0
  • 45 / 10 = 4 oraz 5 reszty
  • wypisujemy 4
  • liczba = 5
  • potęga_policzona_wcześniej = 10/10 = 1
    5 !=0
  • 5 / 1 = 5 oraz 0 reszty
  • wypisujemy 5
  • liczba = 0
  • potęga_policzona_wcześniej = 1/10 = 0
    0==0 koniec pętli i koniec wypisywania
0

Już rozumiem co robiłem źle. Ale mam jeszcze jedno pytanie jeżeli chcę sprawdzić czy liczba w postaći dziesiętnej jest większa np od 1000 to jak mam zrobić? Próbuję w ten sposób

 CMP AX,1000 JA range_msg 

i nie zależnie czy liczba jest większa czy mniejsza przechodzi mi do procedury range_msg.

0

Niemożliwe. Ale rozumiem że ta etykieta nie jest czasem zdeklarowana zaraz pod tym cmp? ;]

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