Drukowanie liczb dwu i więcej cyfrowych w assemblerze

0

Witam, mam tutaj program do obliczania podwójnej silni, działa on poprawnie jak chodzi o logikę. Wiem to, ponieważ wartości dla 1,2,3,4 są dobrze wypisywane. Rzecz w tym, że gdy dostaję wynik w rejestrze ax, to w instrukcji add ax,30h dodaje to 30h do jednego znaku, stąd, gdy wartość dla 5 jest 15, to program drukuje jakieś krzaczki zamiast oczekiwanej liczby. Stąd moje pytanie, jak zastąpić tą instrukcję, żeby wyniki dwu i więcej cyfrowe mogłyby zostać drukowane?

I jeszcze takie pytanie, ten program poniżej ma działać na liczbach 128 bitowych, jest coś takiego w ogóle możliwe?

section	.text
   global _start         ;must be declared for using gcc
	
_start:                  ;tell linker entry point

   mov bx, 4            ;for calculating factorial 3
   call  proc_fact
   add   ax, 30h
   mov  [fact], ax
    
   mov   edx,1            ;message length
   mov	  ecx,fact       ;message to write
   mov	  ebx,1          ;file descriptor (stdout)
   mov	  eax,4          ;system call number (sys_write)
   int	  0x80           ;call kernel
    
   mov	  eax,1          ;system call number (sys_exit)
   int	  0x80           ;call kernel
	
proc_fact:
   cmp   bl, 1
   jg    do_calculation
   mov   ax, 1
   ret
	
do_calculation:
   dec   bl
   dec   bl
   call  proc_fact
   inc   bl
   inc   bl
   mul   bl        
   ret

section	.data		

section .bss
fact resb 1
0
  1. sys_write przyjmuje adres bufora w którym jest coś do wypisania (przekazujesz via ECX)
  2. sys_write przyjmuje długość bufora, który trzeba wypisać (przekazujesz via EDX)
  3. Dodanie 30h do 0..9 daje Ci wartość odpowiadającą kodowi ascii cyfr 0..9. Nie dziw się, że jak dodasz coś więcej to wyjedziesz poza zakres 0..9 :)

Obecnie Twój program może działać dla wyników, które mieszczą się w zakresie 0..9, docelowo powinieneś stworzyć fragment kodu, który wypisze Ci wartość liczby jako string.

W wersji leniwej, możesz skorzystać z printf, ale jeśli jest to program na zaliczenie, to takie podejście może być różnie oceniane przez sprawdzającego :)
https://pl.wikibooks.org/wiki/Asembler_x86/%C5%81%C4%85czenie_z_j%C4%99zykami_wysokiego_poziomu/Funkcje_zewn%C4%99trzne

0

Spokojnie, nie cisną nas z assemblera, więc powinno przejść ;) Wypisuje mi liczbę już, lecz jest ona kompletnie niepoprawna (tzn kilka milionów dla trójki na przykład), także coś tutaj musiałem skopać, ale co? Niby pushuję na stos ax a potem wynik, czyli samo "%d"

section .text
   global main         ;must be declared for using gcc
   extern printf
   
main:                  ;tell linker entry point
 
   mov bx, 3        
   call  proc_fact
   push ax
   push score
   call printf
   add esp,8
   
   mov    eax,1          ;system call number (sys_exit)
   int    0x80           ;call kernel
   
proc_fact:
   cmp   bl, 1
   jg    do_calculation
   mov   ax, 1
   ret
   
do_calculation:
   dec   bl
   dec   bl
   call  proc_fact
   inc   bl
   inc   bl
   mul   bl        
   ret
 
section .data      
score    db "%d"
        db 0x0a
        db 0

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