Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-02-2009, 17:14   #1
Tamiel Longbeard
Member
 
Iscritto dal: Aug 2007
Messaggi: 30
[Assembly] Problema di visualizzazione

Salve ragazzi, fra di voi c'è un qualche esperto di Assembly? io spero ardente di si ... devo fare un simpatico programmino per l'università che calcola il prodotto di due matrici 2x2, ora il mio programma gira e fa il calcolo corretto ma quando cerco di fargli stampare i risultati mi mostra il carattere ascii associato (o nell'ultima versione addirittura nulla) ho provato a farlo dividere per 10 ma non sembra funzionare ... qualcuno mi può dare una mano magari con un esempio di procedura (anche quella con divisione per dieci va benissimo così magari guardo se ho sbagliato qualcosa) grazie.
Tamiel Longbeard è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2009, 17:44   #2
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
Che ne dici di iniziare mettendo il codice che hai già fatto?
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2009, 18:00   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Non ci hai nemmeno detto a quale assembly ti riferisci.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2009, 16:15   #4
Tamiel Longbeard
Member
 
Iscritto dal: Aug 2007
Messaggi: 30
scusate ma ho scritto il messaggio un po in fretta e si vede ... cmq è un intel 8086 emulato ...smanettando qui e la sono riuscito a far visualizzare al massimo due cifre ... ma dopo mi sbaglia perchè "credo" che mi vada in overflow ax ... in ogni caso ecco il codice che ho scritto fin'ora (tralasciate i commenti che sono scritti piuttosto a caso ...)

Codice:
TITLE - Calcolo prodotto di matrici (2x2)

;Definizione costanti
HT           	equ     09h    ;tab
LF           	equ     0Ah    ;line feed	
CR           	equ     0Dh    ;carriage return

PAGINA       	equ     00h    ;pagina corrente	
BIOS_VIDEO      equ 	10h
SET_VIDEO_MODE  equ 	00h    ;in AH
MODO_TESTO      equ  	03h    ;in AL
CLEAR		    equ 	06h    ;per usare la funzione del BIOS per pulire lo schermo
DOS         	equ     21h    ;per stampare su video
PRINT_STRING 	equ     09h    ;per stampare una stringa
SET_CURSOR   	equ     02h    ;in AH
R_KEY_CHR    	equ     01h    ;per leggere da tastiera con echo
R_KEY_CHR_NE    equ     07h    ;per leggere da tastiera senza echo
W_CHR_TTY    	equ     0Eh    ;per stampare un carattere a video (in AH)
SCREEN_ROWS     equ 	25     ;lo schermo DOS ha 25 righe
SCREEN_COLS	    equ 	80     ;e 80 colonne
GRAY            equ     07h    ;colore del font 
DECI            equ     10
CENTI           equ     100

;Definizioni variabili
dseg segment para public 'data'
CORSO	     db	   'CORSO DI CALCOLATORI ELETTRONICI A - PROGETTO NUMERO 17$'
TITOLO       db    'Calcolo del prodotto fra matrici 2x2$'
VALMATRICEA  db    CR,LF,'Inserisci i valori della Matrice A: $'
VALMATRICEB  db  CR,LF,CR,LF,'Inserisci i valori della Matrice B: $'
VALMATRICEC  db  CR,LF,CR,LF,'La matrice risultante C risulta: $'
matricea      db 4 dup (?);Definiamo prima un array multidimensionale per la matrice A
matriceb      db 4 dup (?);Definiamo prima un array multidimensionale per la matrice A

num_stampa  db 0
num_due 	     db  0

dseg ends

stackm segment para stack 'stack'
         db 64 dup('12345678')     ;64*8 bytes allocati per lo stack
stackm ends

assume cs:cseg,ds:dseg,ss:stackm

cseg segment para public 'code'

main proc far
             push ds             ;*
             mov ax,00h          ;*da mettere sempre all'inizio dei programmi
             push ax             ;*

             call init   
             call mess_valmatricea	        ;chiediamo di inserire i valori della matrice A
	         call leggi_valmatricea		    	;leggiamo i valori della matrice A
	         call mess_valmatriceb           	;chiediamo di inserire i valori della matrice B
	         call leggi_valmatriceb      		;leggiamo i valori della matrice B
	         call calcola_prodotto             ;calcoliamo (e stampiamo) il prodotto C
         ret
main endp

;PROCEDURE

init proc near
             mov ax, dseg	      ;inizializzo il data-segment	
             mov ds, ax

             mov ah, SET_VIDEO_MODE
             mov al, MODO_TESTO       ;modo testo: schermo 80*25, a colori
             int BIOS_VIDEO

             mov dx, 000Eh            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra

	     mov dx, offset CORSO     ;sceglie la stringa CORSO
             call stampa_stringa      ;e la stampa

	     mov dx, 0200h            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra

             mov dx, offset TITOLO    ;sceglie la stringa TITOLO
             call stampa_stringa      ;e la stampa

             mov dx, 0400h            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra
             ret
init endp

stampa_stringa proc near
               mov ah,PRINT_STRING   ;la stringa è puntata da ds:dx
               int DOS
               ret
stampa_stringa endp

sposta_cursore proc near
               mov bh, PAGINA        ;pagina video attiva
               mov ah, SET_CURSOR    ;set cursor position
               int BIOS_VIDEO
               ret
sposta_cursore endp

mess_valmatricea proc near
             mov dx, offset VALMATRICEA      ;sceglie la stringa di richiesta dei valori della matrice A
             call stampa_stringa      	      ;e la stampa
             ret
mess_valmatricea endp

mess_valmatriceb proc near
             mov dx, offset VALMATRICEB           ;sceglie la stringa PAROLA
             call stampa_stringa       	           ;e la stampa
             ret
mess_valmatriceb endp

mess_valmatricec proc near
             mov dx, offset VALMATRICEC      ;sceglie la stringa di richiesta dei valori della matrice A
             call stampa_stringa      	      ;e la stampa
             ret
mess_valmatricec endp

leggi_valmatricea proc near
           mov dx, 0600h            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra
ReadCharLoop:
         mov ah,R_KEY_CHR_NE           ;read keyboard char
             int DOS
	     cmp al,'0'			;se il tasto premuto è minore di 1 non lo ritiene valido.
	     jl ReadCharLoop
	     cmp al,'9'			;se il tasto premuto è maggiore di 9 lo richiede
	     jg ReadCharLoop
         call stampa_num
        mov matricea[0],al  		;metto il carattere letto nella variabile a
	     sub matricea[0],'0'		;conversione da ASCII a decimale	      
           mov dx, 0604h            ;imposta riga (DH) e colonna (DL)
           call sposta_cursore      ;alla posizione scelta sopra
ReadCharLoop2:         
         mov ah,R_KEY_CHR_NE           ;read keyboard char
             int DOS
	     cmp al,'0'			;se il tasto premuto è minore di 1 non lo ritiene valido.
	     jl ReadCharLoop2
	     cmp al,'9'			;se il tasto premuto è maggiore di 9 lo richiede
	     jg ReadCharLoop2
         call stampa_num
             mov matricea[1],al  		;metto il carattere letto nella variabile a
	     sub matricea[1],'0'		;conversione da ASCII a decimale	        
           mov dx, 0700h            ;imposta riga (DH) e colonna (DL)
          call sposta_cursore      ;alla posizione scelta sopra
ReadCharLoop3:           
         mov ah,R_KEY_CHR_NE           ;read keyboard char
             int DOS
	     cmp al,'0'			;se il tasto premuto è minore di 1 non lo ritiene valido.
	     jl ReadCharLoop3
	     cmp al,'9'			;se il tasto premuto è maggiore di 9 lo richiede
	     jg ReadCharLoop3
         call stampa_num         
         mov matricea[2],al  		;metto il carattere letto nella variabile a
	     sub matricea[2],'0'		;conversione da ASCII a decimale	        
         mov dx, 0704h            ;imposta riga (DH) e colonna (DL)
        call sposta_cursore      ;alla posizione scelta sopra
ReadCharLoop4:            
        mov ah,R_KEY_CHR_NE           ;read keyboard char
             int DOS
	     cmp al,'0'			;se il tasto premuto è minore di 1 non lo ritiene valido.
	     jl ReadCharLoop4
	     cmp al,'9'			;se il tasto premuto è maggiore di 9 lo richiede
	     jg ReadCharLoop4
         call stampa_num         
             mov matricea[3],al  		;metto il carattere letto nella variabile a
	     sub matricea[3],'0'		;conversione da ASCII a decimale	        
             ret
leggi_valmatricea endp

leggi_valmatriceb proc near
	          mov dx, 0A00h            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra
ReadCharLoopb:
         mov ah,R_KEY_CHR_NE           ;read keyboard char
             int DOS
	     cmp al,'0'			;se il tasto premuto è minore di 1 non lo ritiene valido.
	     jl ReadCharLoopb
	     cmp al,'9'			;se il tasto premuto è maggiore di 9 lo richiede
	     jg ReadCharLoopb
         call stampa_num             
             mov matriceb[0],al  		;metto il carattere letto nella variabile a
	     sub matriceb[0],'0'		;conversione da ASCII a decimale	     
         mov dx, 0A04h            ;imposta riga (DH) e colonna (DL)
        call sposta_cursore      ;alla posizione scelta sopra
ReadCharLoopb2:         
         mov ah,R_KEY_CHR_NE           ;read keyboard char
             int DOS
	     cmp al,'0'			;se il tasto premuto è minore di 1 non lo ritiene valido.
	     jl ReadCharLoopb2
	     cmp al,'9'			;se il tasto premuto è maggiore di 9 lo richiede
	     jg ReadCharLoopb2
         call stampa_num        
        mov matriceb[1],al  		;metto il carattere letto nella variabile a
	     sub matriceb[1],'0'		;conversione da ASCII a decimale	        
        mov dx, 0B00h            ;imposta riga (DH) e colonna (DL)
        call sposta_cursore      ;alla posizione scelta sopra
ReadCharLoopb3:             
         mov ah,R_KEY_CHR_NE           ;read keyboard char
             int DOS
	     cmp al,'0'			;se il tasto premuto è minore di 1 non lo ritiene valido.
	     jl ReadCharLoopb3
	     cmp al,'9'			;se il tasto premuto è maggiore di 9 lo richiede
	     jg ReadCharLoopb3
         call stampa_num         
             mov matriceb[2],al  		;metto il carattere letto nella variabile a
	     sub matriceb[2],'0'		;conversione da ASCII a decimale	        
        mov dx, 0B04h            ;imposta riga (DH) e colonna (DL)
        call sposta_cursore      ;alla posizione scelta sopra
ReadCharLoopb4:             
        mov ah,R_KEY_CHR_NE           ;read keyboard char
             int DOS
	     cmp al,'0'			;se il tasto premuto è minore di 1 non lo ritiene valido.
	     jl ReadCharLoopb4
	     cmp al,'9'			;se il tasto premuto è maggiore di 9 lo richiede
	     jg ReadCharLoopb4
         call stampa_num             
             mov matriceb[3],al  		;metto il carattere letto nella variabile a
	     sub matriceb[3],'0'		;conversione da ASCII a decimale	        
             ret
leggi_valmatriceb endp


calcola_prodotto proc near
             call mess_valmatricec
StartCal:       
             mov dx, 0E00h            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra
             mov al,matricea[0]
             mul matriceb[0]
             mov bl,al
             mov al,matricea[1]
             mul matriceb[2]
             add al,bl
	     ;call stampa_num
             call stampa_tre_cifre_uber
             
             mov dx, 0E04h            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra
             mov al,matricea[0]
             mul matriceb[1]
             mov bl,al
             mov al,matricea[1]
             mul matriceb[3]
             add al,bl
             call stampa_num
             
             mov dx, 0F00h            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra
             mov al,matricea[2]
             mul matriceb[1]
             mov bl,al
             mov al,matricea[3]
             mul matriceb[3]
             add al,bl
             call stampa_num
             
             mov dx, 0F04h            ;imposta riga (DH) e colonna (DL)
             call sposta_cursore      ;alla posizione scelta sopra
             mov al,matricea[2]
             mul matriceb[1]
             mov bl,al
             mov al,matricea[3]
             mul matriceb[3]
             add al,bl
             call stampa_num
ret
calcola_prodotto endp

stampa_num proc near              
              mov ah,W_CHR_TTY
              int BIOS_VIDEO
              ret
stampa_num endp


stampa_tre_cifre_uber proc near
	cmp al,10
	jl  una_cifra
	cmp al,100
	jl due_cifre
	jmp tre_cifre
	
una_cifra:	
	add al,'0'
    call stampa_num
	jmp fine_stampa

due_cifre:
	mov dl,DECI
	idiv dl
	
	push ax
	
	add al,'0'
    call stampa_num
	
	pop ax
	
	mov al,ah
	add al,'0'
    call stampa_num
    
	jmp fine_stampa

tre_cifre:
    mov dl, CENTI
    idiv dl
    
    push ax
     
    add al,'0'
    call stampa_num
    
    pop ax
    mov al,ah
    jmp due_cifre    
    
fine_stampa:
ret
stampa_tre_cifre_uber endp

cseg ends

end main
Lo so come codice non è un granchè però se potete darmi una mano mi fate un favore ...
Tamiel Longbeard è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2009, 17:18   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Vuoi un trucco?
Scrivilo in C, compilalo su un C vecchio per DOS (Come TurboC 2.0), disassembly e vedi cosa ti propone lui quando raggiunge il punto in cui deve stampare l'output.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 20-02-2009, 17:40   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Vuoi un trucco?
Scrivilo in C, compilalo su un C vecchio per DOS (Come TurboC 2.0), disassembly e vedi cosa ti propone lui quando raggiunge il punto in cui deve stampare l'output.
Vecchia volpe
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Dopo 23 anni di silenzio, Warcraft 3 spi...
Roblox sfida l'ecosistema gaming: app st...
OpenAI accusata di plagio dai migliori m...
Altro attacco hacker dell'IA: gli agenti...
Stiamo davvero perdendo il controllo del...
Microsoft perde un pilastro: Frank Shaw ...
Diablo V annunciato a sorpresa: il colpo...
Meno di 5 euro per il 5G: l'offerta Kena...
World of Warcraft: Forever è il Classic+...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:41.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v