Asmembler liczba z DEC na ASCII

BO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 99
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:

Kopiuj
 	
    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
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Po co jest to:

Kopiuj
    MOV AX,0

skoro od razu potem robisz to:

Kopiuj
    MOV AX,[AB]

Nie wiem za bardzo po co jest to:

Kopiuj
    MOV BL,AL

ale ta instrukcja zeruje ci starszy bajt

Kopiuj
    MOV AH,0

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

Kopiuj
    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.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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
BO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 99
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

Kopiuj
 CMP AX,1000 JA range_msg 

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

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.