Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Abbiamo provato le nuove CPU Intel Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: più core e ottimizzazioni al funzionamento interno migliorano le prestazioni, anche in virtù di prezzi annunciati interessanti. A questo si aggiungono nuove ottimizzazioni software. Purtroppo, a fronte di prestazioni di calcolo elevate, il quadro rimane incerto nel gaming, dove l'andamento rimane altalenante. Infine, rimane il problema della piattaforma a fine vita.
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-07-2006, 20:31   #1
Label84
Junior Member
 
Iscritto dal: May 2006
Messaggi: 21
[assembly]disegnare un rettangolo

Ciao a tutti!!!
ho proprio bisogno di una mano con assembly...qualcuno può darmi una mano???

Devo scrivere un programma in assembly 8086 che prenda in ingresso da tastiera le coordinate di 2 punti, e disegnare il rettangolo che ha come diagonale quei 2 punti....
Sono riuscita a fare la lettura dei dati, ho tentato di spostare il cursore in corrispondenza del primo spigolo con questa procedura: ( "ord" e "asc" contengono i valori di ingresso)

Codice:
SPOSTACURSORE	PROC	NEAR
        MOV	DH,[ORD1]
	MOV	DL,[ASC1]
	MOV	BH,00h
	MOV	AH,02h
	INT	10h

	RET
SPOSTACURSORE	ENDP
..e di stampare un * in quella posizione....ma provando il programma vedo che l'* viene stampato sempre nella stessa posizione indipendentemente dai valori di input....
qualcuno sa dirmi dove sbaglio????

Ah, uso tasm come assembler
grazie mille!!!!!
La
Label84 è offline   Rispondi citando il messaggio o parte di esso
Old 08-07-2006, 22:15   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Label84
qualcuno sa dirmi dove sbaglio????
La procedura che hai scritto mi sembra ok. Credo che il problema sia altrove. Senza vedere l'intero sorgente risulta difficile (almeno per me) capire dove sta l'errore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 08-07-2006, 23:47   #3
Paco De Luciaaaaa
Senior Member
 
L'Avatar di Paco De Luciaaaaa
 
Iscritto dal: Mar 2005
Città: Torino... ma Abruzzo rulez!
Messaggi: 613
Quote:
Originariamente inviato da Label84
Ciao a tutti!!!
ho proprio bisogno di una mano con assembly...qualcuno può darmi una mano???

Devo scrivere un programma in assembly 8086 che prenda in ingresso da tastiera le coordinate di 2 punti, e disegnare il rettangolo che ha come diagonale quei 2 punti....
Sono riuscita a fare la lettura dei dati, ho tentato di spostare il cursore in corrispondenza del primo spigolo con questa procedura: ( "ord" e "asc" contengono i valori di ingresso)

Codice:
SPOSTACURSORE	PROC	NEAR
        MOV	DH,[ORD1]
	MOV	DL,[ASC1]
	MOV	BH,00h
	MOV	AH,02h
	INT	10h

	RET
SPOSTACURSORE	ENDP
..e di stampare un * in quella posizione....ma provando il programma vedo che l'* viene stampato sempre nella stessa posizione indipendentemente dai valori di input....
qualcuno sa dirmi dove sbaglio????

Ah, uso tasm come assembler
grazie mille!!!!!
La

Beh se richiami quella procedura stessa la seconda volta è ovvio che stampi sepre lì l'"*", perchè andrà sempre a prendere il contenuto delle celle di memoria ORD1 e ASC1... secondo me le soluzioni sono:

- o fai una seconda procedura con ORD2 e ASC2 ( molto brutta come soluzione)
- fai una seconda procedura che modifica le 2 celle di memoria ORD1 e ASC1 (ancora bruttina)
- crei una procedura che prenda i parametri direttamente dallo stack previa averglieli pushati nel programma principale (la migliore soluzione secondo me perchè la procedura la puoi usare quanto ti pare con qualsiasi punto)

Ciao
__________________
Case AT big tower - Mobo XXX - amd 486DX2@66Mhz - 8 MB edo-ram - Trident SVGA 2MB - HDD 270MB Conner - CD-ROM Hitachi 4X
"Muletto": DFI Lanparty LT X38@X48 T2R - e8400@3870 1.2xV - 4GB black dragon @ 1147 - 2x320 Barracuda 0Raided - from 8800GT Club3d to 5850 Sapphire
Paco De Luciaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2006, 19:40   #4
Label84
Junior Member
 
Iscritto dal: May 2006
Messaggi: 21
Allora intanto ringrazio sia Paco che Andbin per la disponibilità!!!!

comincio a pensare che l'errore sia nella lettura dei dati in input...

Andbin: Io posto tutto il codice che ho scritto: se hai un pò di tempo da perdere.....
solo una raccomandazione: Non ho fatto per ora nessun controllo, e non mi sono preoccupata molto dello "stile"..per ora mi interessava far funzionare il programma senza guardare troppo la forma quindi...non spaventarti!!!!
....secondo i miei calcoli il mio codice dovrebbe stampare 2 '*' in corrispondenza dei 2 spigoli di quello che in futuro diventerà il mio rettangolo!!!
....ma qualsiasi numero metto in ingresso me li stampa sempre nella stessa posizione, e per di più attaccati!!!

per Paco: Forse ho capito male, ma io per ora nn volevo stampare tutto il rettangolo (x ora) ma solo stampare '*' in corrispondenza dei punti che mandavo in ingresso....il mio problema è che eseguendo il programma più volte inserendo dati sempre diversi il risultato è sempre lo stesso!!!

....insomma, l'invito vale anche per te...
ecco il mio codice!!!

Codice:
DSEG	SEGMENT PARA PUBLIC 'DATA'
CR	EQU	0Dh
LF	EQU	0Ah
ASC1	DB	?
ASC2	DB	?
ORD1	DB	?
ORD2	DB	?
TITOLO	DB	'ESAME DI CALCOLATORI ELETTRONICI$'
INPUT1	DB	CR,LF,'Introdurre ascissa angolo alto/sinistra:$'
INPUT2	DB	CR,LF,'Introdurre ordinata angolo alto/sinistra:$'
INPUT3	DB	CR,LF,'Introdurre ascissa angolo basso/destra:$'
INPUT4	DB	CR,LF,'introdurre ordinata angolo basso/destra:$'
OR1	DB	?
SIZE1	DW	?

DSEG	ENDS



STACKM	SEGMENT PARA STACK 'STACK'
	DB 64 DUP('123456789')
STACKM	ENDS


	ASSUME CS:CSEG,DS:DSEG,SS:STACKM
CSEG	SEGMENT PARA PUBLIC 'CODE'


MAIN	PROC FAR
	PUSH	DS
	MOV	AX,00h
	PUSH	AX

	CALL	INIZIALIZZAZIONE
	CALL	LEGGIASC1
	CALL	LEGGIORD1
	CALL	LEGGIASC2
	CALL	LEGGIORD2

	MOV	AH,00h
	MOV	AL,03h
	INT	10h
	
	MOV	DH,[ORD1]	;metto le coordinate del primo punto
	MOV	DL,[ASC1]	;in DX
	CALL	SPOSTACURSORE	;e sposto il cursore in quella posiz.
	MOV	AL,'*'		
	CALL	STAMPACHAR	;stampo '*' in quella posizione
	MOV	DH,[ORD2]	;faccio la stessa cosa col secondo
	MOV	DL,[ASC2]	;punto
	CALL	STAMPACHAR

	RET
MAIN	ENDP



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;						;
;	Pulisce lo scermo e stampa il titolo	;
;						;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INIZIALIZZAZIONE PROC NEAR
	MOV 	AX,SEG DSEG
	MOV 	DS,AX

	MOV	AH,00h
	MOV	AL,03h
	INT	10h
	
	MOV 	DX,OFFSET TITOLO
	CALL 	STAMPASTRINGA
	RET
INIZIALIZZAZIONE ENDP

;-----------------------------------------------------;
;	leggo 4 interi da tastiera che corrispondono  ;
;	all'ascissa e all'ordinata dei due punti      ;
;-----------------------------------------------------;

LEGGIASC1	PROC NEAR
	MOV 	DX,OFFSET INPUT1
	CALL	STAMPASTRINGA

CICLO1:	CALL	LEGGICHAR
	CMP 	AL,CR
	JE	FINELETTURA1
	MOV	[ASC1+BX],AL
	INC	BX
	JMP	CICLO1
FINELETTURA1:	MOV SIZE1,BX
	RET
LEGGIASC1	ENDP


LEGGIORD1	PROC NEAR
	MOV 	DX,OFFSET INPUT2
	CALL	STAMPASTRINGA

CICLO2:	CALL	LEGGICHAR
	CMP 	AL,CR
	JE	FINELETTURA2
	MOV	[ORD1+BX],AL
	INC	BX
	JMP	CICLO2
FINELETTURA2:	MOV SIZE1,BX
	RET
LEGGIORD1	ENDP


LEGGIASC2	PROC NEAR
	MOV 	DX,OFFSET INPUT3
	CALL	STAMPASTRINGA

CICLO3:	CALL	LEGGICHAR
	CMP 	AL,CR
	JE	FINELETTURA3
	MOV	[ASC2+BX],AL
	INC	BX
	JMP	CICLO3
FINELETTURA3:	MOV SIZE1,BX
	RET
LEGGIASC2	ENDP


LEGGIORD2	PROC NEAR
	MOV 	DX,OFFSET INPUT4
	CALL	STAMPASTRINGA

CICLO4:	CALL	LEGGICHAR
	CMP 	AL,CR
	JE	FINELETTURA4
	MOV	[ORD2+BX],AL
	INC	BX
	JMP	CICLO2
FINELETTURA4:	MOV SIZE1,BX
	RET
LEGGIORD2	ENDP


;-------------------------------------------------------;
;	sposto il cursore nella posizione salvata nel   ;
;	DX                                              ;
;-------------------------------------------------------;
SPOSTACURSORE	PROC	NEAR
	MOV	BH,00h
	MOV	AH,02h
	INT	10h

	RET
SPOSTACURSORE	ENDP



STAMPACHAR	PROC	NEAR
	MOV	BH,00h
	MOV	AH,0Eh
	INT	10h
	RET
STAMPACHAR	ENDP

STAMPASTRINGA	PROC NEAR
	MOV	AH,09h
	INT	21h
	RET
STAMPASTRINGA	ENDP

LEGGICHAR PROC NEAR
	MOV	AH,01h
	INT	21h
	RET
LEGGICHAR	ENDP

CSEG	ENDS
	END MAIN

vi ringrazio gia da ora!!!!! (mi basta qualche suggerimento1!!)
a presto,
La
Label84 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2006, 21:23   #5
Label84
Junior Member
 
Iscritto dal: May 2006
Messaggi: 21
Scusatemi, nel codice che ho appena postato manca una chiamata alla procedura "spostacursore" prima di stampare il secondo '*'(ecco perchè li stampava vicini!!!! )...in ogni caso anche ora mi sembra che stampi asterischi a caso....

spero che qualcuno sappia darmi qualche consiglio...
a presto
La
Label84 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2006, 21:36   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Ciao, ho letto bene il codice. Purtroppo devo dirti che la gestione dell'input delle coordinate è molto sbagliata, sopratutto a livello concettuale!

Partiamo dall'inizio: dopo aver completato l'input dei dati tu dovresti avere 4 valori numerici che (a coppie) rappresentano le 2 coordinate dei due angoli del rettangolo da disegnare.

Tu dichiari:
Codice:
ASC1	DB	?
ASC2	DB	?
ORD1	DB	?
ORD2	DB	?
Fin qui tutto ok. Lavorando con la console, non puoi certamente avere valori molto grossi delle coordinate (max 79x24 ) e quindi 1 byte è più che sufficiente.

La questione fondamentale è che l'input viene fatto digit per digit. Questo vuol dire che per inserire il valore numerico 12 devi inserire i caratteri '1' (49 / 31h) e '2' (50 / 32h). Ma tu alla fine devi avere il valore 12 / 0Ch!!!!

Devi quindi effettuare dei test per verificare se il singolo carattere digitato è compreso tra '0' e '9' e poi effettuare dei (semplici) calcoli matematici per ottenere il valore numerico del tuo input.

Visto che devi prendere in input 4 numeri, potrei consigliarti di realizzare una sola procedure che gestisce l'input di al massimo 2 digit e alla fine restituisce in un registro (es. AX) il valore numerico corrispondente.

Una descrizione del flusso di questa procedure potrebbe essere:
1) Imposta numdigit=0 e valore=0
2) Se numdigit=2, vai al punto 8
3) Input di un carattere (senza echo)
4) Se il carattere inserito è fuori dal range '0'..'9', passa al punto 3
5) Stampa carattere (echo)
6) Sottrai '0' dal valore del carattere e calcola: valore = valore*10 + digit
7) Incrementa numdigit e passa al punto 2
8) Esce con il valore

Chiedo scusa se questa descrizione del flusso non fosse molto chiara ... non sono abituato a scrivere diagrammi di flusso, pseudo-codice o qualunque altra cosa che non sia codice "reale".

Per il momento spero di averti dato le dritte giuste.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2006, 22:08   #7
repne scasb
Bannato
 
Iscritto dal: Feb 2003
Messaggi: 947
Vari errori:

1) Le quantita ASC1/ASC2/ORD1/ORD2 non sono byte ma array di byte in quanto conterranno stringhe. Poiche' in tali routine viene incrementato il registro BX tale incremento (a meno di modifiche di LEGGICHAR) sovrascrivera' il segmento dati con dati incoerenti e corrotti.
2) Nella routine LEGGICHAR non viene salvaguardato il registro BX.
3) Nelle routine LEGGIASC1/LEGGIORD1/LEGGIASC2/LEGGIORD2 manca completamente il controllo dell'input (2 caratteri e soltanto numerici.
4) Manca una routine che converta le stringhe ASC1/ASC2/ORD1/ORD2 valori numerici.
5) Manca un controllo a valle delle routine LEGGIASC1/LEGGIORD1/LEGGIASC2/LEGGIORD2 per verificare che il valore numerico inserito sia coerente (compresto per mode 3h tra 0 e 79 (x) e tra 0 e 24 (y)).
6) La routine STAMPACHAR non salvaguarda il registro AX, in questo modo nella seconda chiamata a STAMPACHAR non si puo' essere sicuri che AL='*'.
7) Non e' chiaro a cosa servano i push a inizio codice. Il codice MAIN si deve chiudere o con un int 20h o con un func 4F00h int 21h.

Non ho fatto un analisi piu' completa per mancanza di tempo, ma potrebbero esserci altri problemi/mancanze varie.
repne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2006, 22:10   #8
Label84
Junior Member
 
Iscritto dal: May 2006
Messaggi: 21
grazie mille, sei stato veramente gentile!!!!!
da domattina reimposto la lettura dei dati seguendo i tuoi consigli.
spero di riuscire a cavarmela da sola!!!
buona serata
La
Label84 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2006, 22:22   #9
Label84
Junior Member
 
Iscritto dal: May 2006
Messaggi: 21
Grazie anche a repne scasb!!!
...per i controlli mancanti...quelli li lascio sempre alla fine!!
...per i casini con i registri....domattina cercherò di fare + attenzione!!!!

scusatemi, ma è la prima volta che programmo in assembly, e devo ancora capire bene i meccanismi di base....

grazie mille per la disponibilità!!!!!
La
Label84 è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2006, 22:25   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da repne scasb
7) Non e' chiaro a cosa servano i push a inizio codice. Il codice MAIN si deve chiudere o con un int 20h o con un func 4F00h int 21h.
Anche a me non era chiaro subito il motivo delle 2 push ma poi .... mi sono ricordato! (è tanti anni che non lavoro più in DOS ... sono un po' arruginito, eh? ).

Le due push spingono sullo stack l'indirizzo DS:0000h e a quel indirizzo è presente il PSP (Program Segment Prefix) i cui primi due byte formano l'istruzione INT 20h. Quindi con la RET "far" salta a quel indirizzo ed esegue INT 20h.
Molto macchinoso, lo so .... consiglio vivamente di usare la funzione AH=4Ch del INT 21h.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2006, 00:29   #11
repne scasb
Bannato
 
Iscritto dal: Feb 2003
Messaggi: 947
L'istruzione INT 20h presente nei primi due byte del PSP (0CDh, 20h), e' disponibile ed utilizzabile solo per software scritti com modello di memoria tiny (.COM), con SS/DS/CS puntanti allo stesso segmento. In questo caso trattandosi di un .EXE con SS/DS/CS non nello stesso segmento, nonostante con il retf finale CS punti correttamente al PSP, non e' detto che l'istruzione INT 20h sia in grado di deallocare correttamente il software, e restituire il controllo a COMMAND.COM.

A questo si aggiunge che il contenuto del registro DS in un .EXE, ad inizio codice, permane "indefinito" (se si utilizzano interpreti di comandi "diversi" da COMMAND.COM DS non punta affatto al PSP), tante' che esistono le funzioni Set/Get PSP (int 21h Func. 50h/51h), percui il retf finale puo' andare a puntare ovunque.
repne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2006, 09:49   #12
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quoto quanto detto da repne scasb e suggerisco nuovamente a Label84 di usare la funzione 4Ch di int 21h per terminare un programma .exe.

Comunque ho trovato questo documento: How to Use Int 20h to Terminate an .EXE Program

@repne scasb:
Dalle specifiche che ho io, per un .exe, DS e ES puntano inizialmente al PSP. Se poi con altri interpreti diversi dal COMMAND.COM questo non è vero .... non lo so, io ho sempre usato il classico DOS e quindi COMMAND.COM.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
iPad 12 arriverà nel 2026 e sar&a...
AMD per il futuro dell'IA in Corea del S...
L'IA agentica incrementa il rischio cybe...
Rapporto Clusit 2026: finanza e infrastr...
Gli stessi sali che solidificano il tofu...
Il conflitto in Medio Oriente minaccia l...
OnlyFans, scomparso il proprietario Leon...
Le migliori offerte Amazon da leggere in...
Recensioni su Trustpilot non affidabili,...
Il CISPE denuncia Broadcom all'antitrust...
Il cyberattacco che negli Usa ha trasfor...
AI Grid Intelligent Orchestration, l'inf...
Roborock Qrevo CURV 2 Flow X: tecnologia...
Quanto viaggia il modem di iPhone Air? I...
300 GB di memoria RAM per le future gene...
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:25.


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