Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-05-2013, 20:52   #1
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
[ASSEMBLY 8086] Programma somma

Ragazzi sto provando a fare una semplice somma con l'8086,però quando arrivo a stampare mi stampa una miriade di caratteri (cuori,frecce etc..) che non ci incastrano nulla.
Il codice è questo
Codice HTML:
.model small 		  ;definisce il modello di memoria da utilizzare
.stack 200h		  	  ;dimensione massima del codice sorgente	
.data			 	  ;definizione variabili e/o costanti
num1	db ?
ris		db ?
.code
inizio:
	mov ax,@data
	mov ds,ax 			;inizializzo il segmento
	mov	ah,1			;funzione di lettura carattere
	int	21h
	mov bh,al
	mov num1,bh
	mov ah,1
	int 21h
	mov bh,al
	add bh,num1
	mov ris,bh
        ;
	;a capo
	mov AH,02h
	mov DL,13
	int 21h
	mov AH,02h
	mov DL,10
	int 21h
	;
	mov ah,9				;funzione di stampa della stringa		
	mov dx,offset ris
	int 21H
	jmp inizio
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 12:01   #2
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Hmm, non posso testare il tuo codice, e non mi ricordo bene l'8086.
Però sappi che le procedure DOS attivate attraverso l'istruzione INT 21H permettono di leggere o visualizzare esclusivamente caratteri ascii. Di conseguenza sta a te poi trasformare l'input in un vero numero.
Generalmente devi aggiungere/sottrarre ( ora non ricordo bene ) 48 ( il numero decimale che corrisponde allo 0 ascii ) perchè le somme stampate siano corrette.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 14:07   #3
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
un altra domanda,come faccio,tramite questo menù,ad andare a 4 procedure diverse?
Cioè io ero abituato a mettere il je (salta se è uguale) ma devo usare le procedure..e le procedure si richiamano solo con la call,quindi il controllo come lo faccio?

Codice HTML:
.code     					;inizio codice sorgente
inizio:
	mov ax,@data
	mov	ds,ax				;carica il segmento dati	
	;a capo
	mov AH,02h
	mov DL,13
	int 21h
	mov AH,02h
	mov DL,10
	int 21h
	mov ah,9				;funzione di stampa della stringa		
	mov dx,offset stringa	;visualizza la stringa
	int 21h
	mov dx,offset scelta1	
	int 21h
	mov dx,offset scelta2
	int 21h
	mov dx,offset scelta3
	int 21h
	mov dx,offset scelta4		
	int 21h
	mov	ah,1				;funzione di lettura carattere
	int	21h
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 15:26   #4
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Metti il codice che vuoi far eseguire dentro una procedura.
Poi se la procedura deve essere richiamata solo in certe condizioni, le anteponi un'etichetta ( label ) così puoi con un salto condizionato, andare all'etichetta ( che come prima istruzione avrà una CALL procedura ):
Codice:
CMP 0,CX
JE etichetta1
...
etichetta1: CALL procedura
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 15:45   #5
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
Quote:
Originariamente inviato da kwb Guarda i messaggi
Metti il codice che vuoi far eseguire dentro una procedura.
Poi se la procedura deve essere richiamata solo in certe condizioni, le anteponi un'etichetta ( label ) così puoi con un salto condizionato, andare all'etichetta ( che come prima istruzione avrà una CALL procedura ):
Codice:
CMP 0,CX
JE etichetta1
...
etichetta1: CALL procedura
perfetto,pensavo fosse uno spreco di codice ma non è così.
Sono arrivato a questo punto,sto facendo la potenza,nel caso specifico un numero elevato alla prima (che quindi rimane uguale).

Stampa tutto correttamente,ma insieme mi stampa una marea di caratteri (come vi dicevo ieri sera).
Il pezzetto di codice che riguarda la variabile RIS (risultato) è questo:

Codice HTML:
stampa_ris:
;a capo
	mov AH,02h
	mov DL,13
	int 21h
	mov AH,02h
	mov DL,10
	int 21h
;
	mov bl,n1
	mov ris,bl
	mov ah,9					
	mov dx,offset ris	
	int 21h
	jmp inizio
end
però come ben sapete con l'offset si stampa le stringhe e non i numeri.
Come posso stampare ris?
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 18:07   #6
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Ma per stampare un numero o un singolo carattere ( ASCII ) ti basta fare uguale a come hai fatto per stampare il line-feed e il carriage-return...

Ti consiglio di leggerti un libro sull'Assembler 8086 perchè pare tu non abbia le idee chiare
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 19:49   #7
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
Quote:
Originariamente inviato da kwb Guarda i messaggi
Ma per stampare un numero o un singolo carattere ( ASCII ) ti basta fare uguale a come hai fatto per stampare il line-feed e il carriage-return...

Ti consiglio di leggerti un libro sull'Assembler 8086 perchè pare tu non abbia le idee chiare
mi riesce l'8086..ma non so stampare un risultato.
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 20:34   #8
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Quote:
Originariamente inviato da jyciap11 Guarda i messaggi
mi riesce l'8086..ma non so stampare un risultato.
il motivo, come detto da kwb nella prima risposta, è che un valore zero in un registro non corrispondente al simbolo zero che vedi sullo schermo

lo zero sullo schermo ha valore 48, l'uno 49, ecc....

se vuoi stampare un numero ( ad una cifra ) devi sommargli 48

se i numeri sono a più cifre va ovviamente scisso il numero nelle sue cifre costituenti e ad ognuna va sommato 48 e poi inviato alla funzione di stampa
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 21:43   #9
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
allora,comincio a capirci.
In questo caso N1 = 1 e N2 = 2
Mi stampa 3 quindi VA BENE !!!!
Codice HTML:
        MOV AL, N1		;carica N1 da RAM a registro AL
        MOV BL, N2		;carica N2 da RAM a registro BL
        ADD AL, BL	;significa AL=AL+BL, il registro AL fa da accumulatore e contiene ora la somma
		add al,48
        MOV  SOMMA, AL	;il risultato viene scritto in memoria nella variabile somma, copiato da registro AL
		mov dl,somma
		mov ah,2
		int 21h

Se io avessi però 20 + 15?Come faccio a stampare 35 e non un carattere?
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 21:54   #10
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Tramite divisioni successive per 10. Usa l'istruzione div e leggi, ad ogni divisione, il risultato in dx ( il resto ).

Ad esempio 15/10 = 1 con resto 5...1/10 = 0 con resto 1. Semplice!!
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2013, 22:01   #11
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
et voilà,siete dei geni ce l'ho fatta.
Una cosa però a me funziona SOLO se dichiaro in alto le variabili,cioè se dico db N1 3 e db N1 5 lui mi fa 3+5= 8 e va bene,però se io volessi inserire da tastiera n1 e n2 e faccio

Codice HTML:
mov n1,al
dichiarando dw n1 mi da errore,come posso fare per inserire il dato da tastiera in n1 senza errore?
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 11:13   #12
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
La variabile ( che in realtà è un indirizzo di memoria... ) deve essere sempre dichiarata prima.
Mi pare che facendo:
Codice:
variabile DW ?
Sia sufficiente.
Se poi vuoi mettere qualcosa in quella "variabile" puoi fare:
Codice:
mov variabile,AL
Dove in AL c'è un dato caricato.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 12:38   #13
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
Ragazzi un altra domanda.
Ho fatto questo codice (è una procedura).
Se volessi "trasformarla" in MACRO come faccio per richiamarla?

Codice HTML:
input_potenza proc
;--------INPUT N1--------
	mov n1, 0000h
	mov ah,9					;funzione di stampa della stringa		
	mov dx,offset mess_pot_1	;visualizza la stringa
	int 21h
mentre:      
	mov ah, 01h
	int 21h
	cmp al, 30h
	jb 	continuo
	cmp al, 39h
	ja 	continuo
    mov ah, 00h
	sub al, 30h
	mov cifra, ax
	mov ax, n1
	mov bx, 0ah
	mul bx
	add ax, cifra
	mov n1,ax
	jmp mentre
;--------INPUT N2---------
continuo:
	mov n2, 0000h
	mov ah,9					;funzione di stampa della stringa		
	mov dx,offset mess_pot_2	;visualizza la stringa
	int 21h
mentre_2:
	mov ah, 01h
	int 21h
	cmp al, 30h
	jb fine
	cmp al, 39h
	ja fine
    mov ah, 00h
	sub al, 30h
	mov cifra, ax
	mov ax, n2
	mov bx, 0ah
	mul bx
	add ax, cifra
	mov n2,ax
	jmp mentre_2
fine:
	ret
endp

Ultima modifica di jyciap11 : 14-05-2013 alle 14:50.
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 15:20   #14
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Una macro si crea nel seguente modo:
Codice:
NomeMacro MACRO valore1, valore2, ..., valoreN
...
ENDM
Per chiamarla basta semplicemente scrivere il suo nome.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505

Ultima modifica di kwb : 14-05-2013 alle 15:22.
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 16:01   #15
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
Ultima domanda.
Questo programma calcola una potenza,però con due cifre.
Qualcuno riesce a dirmi come fare per n cifre (esempio 9^9)

Codice HTML:
calcolo_potenza:
	call input_potenza
	call a_capo
	mov ax,1
    mov bx, n1
    mov cx, n2	
ciclo:		
    mul bx
    loop ciclo
istr_finali:
    mov ptz, ax
	mov ah,0	; azzero AH così AX è il risultato
	mov bl,10	; carico il divisore in BL
	div bl		; divido AX per BL(10) ed ottengo AL=quoziente (le decine) AH=resto (le unità)
	add al,30h	; le decine in ASCII
	mov ris_ascii,al
	add ah,30h 	; le untià in ASCII
	mov ris_ascii+1,ah
	lea dx, ris
	mov ah,09h
	int 21h

Ultima modifica di jyciap11 : 14-05-2013 alle 17:49.
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 18:49   #16
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Cioè tu vuoi calcolare la potenza n-esima di un numero i-esimo?
i^n?
Fa conto però che se così fosse, devi prevedere il caso in cui il risultato non sia memorizzabile in un singolo registro e attrezzarti per salvarlo in più registri.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505

Ultima modifica di kwb : 14-05-2013 alle 18:52.
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 18:54   #17
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
Quote:
Originariamente inviato da kwb Guarda i messaggi
Cioè tu vuoi calcolare la potenza n-esima di un numero i-esimo?
i^n?
Fa conto però che se così fosse, devi prevedere il caso in cui il risultato non sia memorizzabile in un singolo registro e attrezzarti per salvarlo in più registri.
si il programma deve fare quello.
Quindi fino a che il risultato è di due cifre funziona,ma dopo non funziona più
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 20:51   #18
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da jyciap11 Guarda i messaggi
si il programma deve fare quello.
Quindi fino a che il risultato è di due cifre funziona,ma dopo non funziona più
Ora non ricordo bene, ma siccome i registri sono da 16bit, dovresti poter salvare numeri fino a (2^16)-1 = 65535. Tutto ciò è valido se i numeri sono solo interi positivi.
Secondo quanto ho detto ( ammesso sia corretto, ma ho ricontrollato sul libro che avevo usato per studiare il linguaggio e pare confermarlo ) non ci dovrebbero essere problemi fino a 65535. Inoltre, trattandosi di potenze, il numero è sempre positivo.

Tra l'altro, se usi delle variabili per salvare il risultato, assicurati che siano DW ( che mi pare sia il tipo di dato da 16 bit ) così da essere grandi quanto i registri.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 21:05   #19
jyciap11
Member
 
Iscritto dal: Sep 2011
Messaggi: 72
Quote:
Originariamente inviato da kwb Guarda i messaggi
Ora non ricordo bene, ma siccome i registri sono da 16bit, dovresti poter salvare numeri fino a (2^16)-1 = 65535. Tutto ciò è valido se i numeri sono solo interi positivi.
Secondo quanto ho detto ( ammesso sia corretto, ma ho ricontrollato sul libro che avevo usato per studiare il linguaggio e pare confermarlo ) non ci dovrebbero essere problemi fino a 65535. Inoltre, trattandosi di potenze, il numero è sempre positivo.

Tra l'altro, se usi delle variabili per salvare il risultato, assicurati che siano DW ( che mi pare sia il tipo di dato da 16 bit ) così da essere grandi quanto i registri.
questo,bene o male,ero riuscito a capirlo,non riesco a capire come gestire le divisioni in modo tale da fermarmi al momento giusto e trascrivere il risultato
jyciap11 è offline   Rispondi citando il messaggio o parte di esso
Old 14-05-2013, 21:38   #20
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Quote:
Originariamente inviato da jyciap11 Guarda i messaggi
questo,bene o male,ero riuscito a capirlo,non riesco a capire come gestire le divisioni in modo tale da fermarmi al momento giusto e trascrivere il risultato
quando al contiene zero ( cioè il resto è zero ) ti fermi
pabloski è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
La fucina di stelle Sagittario B2 &egrav...
Un razzo spaziale ULA Atlas V ha portato...
Silent Hill f vi farà scoprire la...
Leapmotor ha prodotto il suo milionesimo...
PlayStation Pulse Elevate: i primi altop...
Nove banche europee sfidano Tether e Cir...
Netflix: addio al piano Base senza pubbl...
Flight Simulator su PlayStation per la p...
Bosch taglierà 13.000 posti di la...
Nothing e CMF si separano: il brand low ...
Logitech MX Master 3S a 69€ su Amazon: i...
Colpo di scena su Windows 10: gli aggior...
HONOR, il futuro è foldable, ma n...
Motorola Solutions al servizio della sic...
Dell Pro Plus Earbuds: IA e controllo da...
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: 23:54.


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