|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
11-04-2005, 17.39.50 | #1 |
Gold Member
Top Poster
Registrato: 04-09-2002
Loc.: Roma
Messaggi: 4.022
|
[ASSEMBLER] Salvare n valori in memoria
Come esercizio stavo tentando di inserire 5 valori da input per poi salvarli in memoria, volevo sapere se il procedimento che avevo eseguito era corretto. Codice:
0100 MOV CX,0005 // Contatore 0101 MOV SI,[1000] // Su questo registro salvo il valore immesso // Qua parte l'int 16 x l'input da tastiera 0102 MOV AH,00 0103 INT 16 0104 MOV SI,AL 0105 JNZ 0100 seuito da DEC CX (non sapevo dove meterlo) 0106 INT 20 Tnx! |
11-04-2005, 22.30.55 | #2 |
Gold Member
Top Poster
Registrato: 07-04-2000
Loc.: Padova-Vicenza
Messaggi: 4.814
|
Azz... sono anni e anni che non programmo più in assembly... comunque la documentazione sull'uso degli interrupt ce l'ho da qualche parte, prima o poi salta fuori.
Vale comunque la regola di salvare i registri che servono in quanto non è detto che la chiamata all'interrupt li conservi, in questo caso prima di INT 16 avrei fatto PUSH CX e dopo avrei messo un POP CX. Non ricordo bene ma mi pare che ci sia un'instruzione che decrementa CX e salta se non zero, comunque io prima di JNZ avrei messo un DEC CX. Non ho capito questo MOV SI,[1000], inizializzi SI con il contenuto della locazione 1000 (che avrai inizializzato prima?) o forse volevi salvare nella locazione 1000? in tal caso conveniva mettere un MOV [1000], SI subito dopo MOV SI,AL. Anzi, AL è un registro 8 bit, mentre SI è un registro 16 bit, quindi dovresti fare: MOV AH, 0 MOV SI,AX In questo modo passi nel byte più significativo di SI valore 0 e nel byte meno significativo AL. Tutto questo sperando di ricordarmi ancora qualcosa di assembly e di non sparare cavolate, sono letteralmente decenni che non ci lavoro più. Dimenticavo: devi saltare a 103 e non a 100 quindi JNZ 103 e non JNZ 100, altrimenti il loop non finisce più in quanto cx verrà sempre ad ogni giro portato a 5 e quindi non potrà raggiungere lo 0. Ah, è ovvio comunque che i valori letti dalla tastiera si sovrapporranno sempre nella locazione 1000.
___________________________________
Con il PC risolvo molti problemi che prima non avevo. - Coltiva Linux che Windows si pianta da solo! Ultima modifica di Sergio Neddi : 11-04-2005 alle ore 22.39.46 |
11-04-2005, 22.48.51 | #3 |
Gold Member
Top Poster
Registrato: 07-04-2000
Loc.: Padova-Vicenza
Messaggi: 4.814
|
Ho provato ad assemblare questo, non ho messo le istruzioni di push e pop attorno alla chiamata all'interrupt 16 e funziona (dopo 5 premute di tasto esce), quindi ciò significa che il registro CX viene preservato dalla chiamata dell'interrupt.
Potrebbe essere anche che AH rimanga invariato dopo la chiamata all'interrupt, io, per sicurezza, come dicevo nel post sopra, l'ho inizializzato nuovamente. Meglio ridondare un'istruzione in più che poi impazzire a risolvere un problema. Per il resto non ho modo di vedere se viene inserito in memoria il valore relativo ai tasti premuti, si potrebbe inserire una chiamata che fa un'eco a video. Oppure si potrebbe seguire il flusso passo passo con un debugger. Codice:
0100 B90500 MOV CX,0005 0103 B400 MOV AH,00 0105 CD16 INT 16 0107 B400 MOV AH,00 0109 89C6 MOV SI,AX 010B 89360010 MOV [1000],SI 010F 49 DEC CX 0110 75F1 JNZ 0103 0112 CD20 INT 20 Avevo dimenticato MOV [1000],SI
___________________________________
Con il PC risolvo molti problemi che prima non avevo. - Coltiva Linux che Windows si pianta da solo! Ultima modifica di Sergio Neddi : 11-04-2005 alle ore 22.55.31 |
11-04-2005, 23.04.17 | #4 |
Gold Member
Top Poster
Registrato: 04-09-2002
Loc.: Roma
Messaggi: 4.022
|
Domani me lo studicchio un po', pero che iella, mercoledi ho un compito su ste cose e sto a terra...
Tnx! |
19-04-2005, 18.55.06 | #5 |
Gold Member
Top Poster
Registrato: 04-09-2002
Loc.: Roma
Messaggi: 4.022
|
Il compito è andato benissimo, 8-!!
Meno male avevo una strizza! |
20-04-2005, 00.35.24 | #6 |
Gold Member
Top Poster
Registrato: 07-04-2000
Loc.: Padova-Vicenza
Messaggi: 4.814
|
Ottimo! (perché è 8, se era nove sarebbe stato novimo!)
___________________________________
Con il PC risolvo molti problemi che prima non avevo. - Coltiva Linux che Windows si pianta da solo! |
05-05-2005, 12.23.16 | #7 |
Senior Member
Registrato: 02-08-2003
Loc.: Lamezia Terme
Messaggi: 344
|
Salve, comunque il decremento di CX è automatico se viene usata l'istruzione loop seguita dall'etichetta a cui deve essere effettuato il salto ad ogni iterazione:
-------------- MOV CX,[0005] ETICHETTA: . . LOOP ETICHETTA -------------- Anche se non ricordo bene come viene gestito l'int 16, ma non credo dovrebbero esserci problemi. |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
compatibilita' ram | Joele1965 | Hardware e Overclock | 3 | 25-12-2008 19.00.17 |
[C] Allocatore di memoria | braian | Programmazione | 2 | 17-06-2008 15.21.47 |
memoria video condivisa o dedicata? | alconf | Hardware e Overclock | 2 | 02-03-2006 19.35.59 |
Nokia PC Suite: "la memoria non poteva essere written" | tronco | Software applicativo | 4 | 10-01-2006 16.06.55 |
Problema Pinnacle PCTV Pro e periferiche IDE | exion | Hardware e Overclock | 56 | 30-01-2005 11.44.47 |