Newsgroup: it.istruzione.universita.ingegneria
Titolo: aiuto ASM per esame calcolatori elettronici

potete guardare un attimino questo prog??
(MASM 4.0 per 8086)
sommo 16 numeri
metto il risultato in  al
converto numero in stringa
stampo la stringa (ma la stampa invertita, quindi devo ribaltarla)
PROBLEMI: faccio casino con al,ax 
                     non riesco a ribaltare la stringa
PLease, se potete, datemi una mano, o mi buttano fuori anche al prox
esame!! :-(
COMMENT*
Programma che somma 16 numeri, presi da un vettore ;
*
title somme.asm
include dosint.mac
DATA SEGMENT ' DATA'
     numeri  db 1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
     msg1 db 'La somma  e':  ','$',10,13
     ris db ?,'$',10,13
     db '$',13,10
     temp db ?,'$',10,13
     db '$',13,10
     cont dw ?
DATA ENDS;
STACK SEGMENT STACK 'STACK'
     db 64 dup ( 'stack')
     tos label word
STACK ENDS
CODE SEGMENT 'CODE'
      assume cs:code,ds:data,ss:stack
 MAIN PROC
     mov ax,data
     mov ds ,ax
     xor ax,ax
     xor si,si
     mov cx,16  ;perche' i numeri nel vettore 'numeri'sono 16
     mov bx ,offset numeri    ;  bx<--offset numeri
 
  SOMMA:                    ;somma un numero alla volta
      add al,numeri[si] ; 
      inc si
  LOOP SOMMA
         call num_string ;chiama la routine per convertire num in
stringa
        display msg1
         display ris
 
         mov ah,4ch
         int 21h
 MAIN    ENDP 
;****************************************************************************
NUM_STRING PROC  ;converte in stringa il numero contenuto in ax;la
stringa  inizia all'indirizzo "offset ris"
 
            mov si,10;      usato per dividere per 10
            mov di,0
        converti:
              sub dx,dx
              div si    ; divido il numero contenuto in AX per 10.
                        ; il resto,numero a una cifra, e' messo in DX
                        ; numero/10 sta in AX
              mov temp[di],dl
              add temp[di],30h  ; converte il resto in un carattere
ascii
              inc di
              cmp ax,0       ;   condizione di fine ciclo
             jnz converti
 
             xor si,si
             xor ax,ax    
 
       ribalta:               ;devo stampare la stringa invertendola
            mov al,temp[di]
            mov ris[si],al
            dec di
            inc si
            cmp di,0
           jnz ribalta
 
          RET
NUM_STRING  ENDP
;*****************************************************************************
CODE ENDS
 END MAIN
 

Dov'è che non funziona?
Prima dell'inversione funziona ?
Hai fatto un bel debug?
Scusa ma sono un pò arrugginito...prova a essere + preciso
dnt
--
_______________________________________
____________________________________
Webmaster di 
http://digilander.iol.it/dNT/


Ribaltatemi la stringaaaaaaaaaa!!!!

Dunque l'errore sta qui:
 ribalta:               ;devo stampare la stringa invertendola
            mov al,temp[di]
                        ^^^^^^^
devi correggere così:
           mov al,temp[di-1]
così alla fine la 'variabile' temp sarà così:
DS:0021 ==> 31 33 36 0D 24
cioè i caratteri ==> '1' '3' '6' 'CR' 'LF'
non so com'è la funzione display, ma così dovrebbe andare, sempre che tu
debba stampare 136 e non 631 !
Se hai ancora dubbi......
ciao dnt


Se hai ancora dubbi......
bè...già che sei così disponibile...
devo fare la media su questi 16 numeri..quindi devo dividere la somma
per 16
Ora, se io faccio (ho in al  -cioè anche in ax,giusto? per lo meno, il
debug mi fa vedere il contenuto di ax, ed è quello giusto: 0088
hex..-la somma totale,e devo dividerla per 16)
[..]
mov si,16
div si
call num_string
[..]
dovrei avere in ax il risultato della divisione -e dal debug vedo che
ora in ax ho 0008, cioè ho fatto uno shr di un posto,il che vuol dire
che ho  diviso per 16..-, quindi  se procedo con la routine num_string
che usa proprio il numerino contenuto in AX,  dovrebbe andare bene,
no?
E invece non va bene, perchè se lo eseguo mi esce dal prompt del
dos(sono sotto WIN 98), mi dice che si è verificato un errore, e
consiglia il riavvio della macchina.
Perchè?
E come posso fare, allora,per dividere per 16 ?
..un 'illuminazione....
:-)

 :-)
Non sono un veggente ;-) a me capitava quando sbagliavo a fare pop e push e
quindi l'istruzione ret andava in crisi non riportando + l'istruction
pointer al posto giusto...
prova a controllare e fammi sapere...ormai sono incuriosito


prova a controllare e fammi sapere...ormai sono incuriosito
Boh?
io non pusho e non poppo niente...non so proprio cosa non va...
il prog va bene, ma entra in crisi appena provo a fare la divisione..
anche solo se metto 
mov ax,64
mov si,16
div si
call num_string.
etc..
Mi sa che qualcosa mi sfugge..... ;-P

 ha scritto nel messaggio
news:QPFROrNIAjO00X...@4ax.com...


Per favore, podresti dirmi che significa ASM?
Certo!
ASM sta per Assembler, linguaggio di programmazione.
Non ti dico alrto, anche perchè, dlale domande che faccio, si vede che
ne so poco anche io! :-P
Ciao

A me funziona... prova a spedirmi il codice (anche in privato)
ciao d.N.T.


 Non ti dico alrto, anche perchč, dlale domande che faccio, si vede che
