View Full Version : asm
pacovt87
08-01-2005, 00:29
Ciao a tutti! C'è qualcuno che potrebbe darmi una mano con asm??
pacovt87
08-01-2005, 12:01
non sapete se c'è qualcuno sul forum che conosce bene assembler?
Dipende da cosa ti serve....
pacovt87
08-01-2005, 13:24
sto studiando da una guida, ho provato a contattare l'autore per email ma non risponde. Ci so delle istruzioni che usa che non capisco, ho solo alcune domande, niente di che! Posso chiedere a te?
pacovt87
08-01-2005, 14:43
senti va bene se uso la posta? ti mando un email con un pezzo di codice e ti chiedo un paio di cose
Posta qui il codice...non sono ferratissimo sull'asm...anche se conosco abbastanza bene l'istruction set...
pacovt87
08-01-2005, 16:44
è la gestione della tastiera direttamente da hardware.
InitKbrd:
; Come al solito salviamo i registri che verranno modificati
PUSH AX ; Memorizza AX nello stack
PUSH BX ; Memorizza BX nello stack
PUSH ES ; Memorizza ES nello stack
; Carica indirizzo nuovo handler
XOR AX,AX ; Azzera AX
MOV ES,AX ; Imposta segment = 0
MOV BX,CS ; Carica Segment nuova handler
MOV AX,OFFSET NewKbrd ; Carica offset nuova handler
; Memorizza nuovo indirizzo e preleva quello vecchio
CLI ; Disattiva gli interrupts mascherabili
XCHG AX,ES:[9*4] ; Scambia Offset
XCHG BX,ES:[9*4+2] ; Scambia Segment
STI ; Attiva gli interrupts mascherabili
; Memorizza vecchio indirizzo (ci servirà per ripristire il vecchio handler)
MOV TempKbrd,AX ; Memorizza Offset vecchio handler
MOV TempKbrd+2,BX ; Memorizza Segment vecchio handler
; Ripristina i registri salvati nello stack ed esce dalla procedura
POP ES ; Ripristina ES dallo stack
POP BX ; Ripristina BX dallo stack
POP AX ; Ripristina AX dallo stack
RET ; Fine procedura
Ciao! C'è un istruzione che non riesco a capire:
XCHG BX, ES:[9*4+2] ; SCAMBIA SEGMENT
Il segment non sarebbe semplicemente ES=0?
E comunque perchè [9*4+2]?
repne scasb
08-01-2005, 20:44
fantoibed
08-01-2005, 23:16
(OT) :eek: Nel 2005 c'è ancora gente che programma software per dos in modalità reale? :eek:
repne scasb
09-01-2005, 09:14
pacovt87
09-01-2005, 11:43
grazie millem repne scasb. M'hai chiarito parecchie cose. Potrei contattarti per qualche altra cosetta? Cmq grazie ancora
fantoibed
09-01-2005, 13:58
Originariamente inviato da repne scasb
Probabilmente, non si tratta di DOS. Se si fosse trattato di DOS, la routine "sarebbe" completamente errata, in quanto "si deve" utilizzare l'INT 21h Func. 25h per settare un vettore d'interrupt, e l'INT 21h Func. 35h per leggerlo.
Credo si tratti di un handler per la gestione della tastiera di una qualche macchina operatrice di tipo industriale. Considera, che "a mio personale giudizio (si tratta di una personale casistista su lavori da me fatti)" i software embedded per macchine industriali constano di:
30% - 80186 in modalita' reale.
30% - i80486 in SMM o reale.
40% - Altre tipologie di CPU/modelli di accesso-indirizzamento.
Tutto cio' nel 2005; e non c'e' ragione che tutto cio' non perduri per i prossimi anni.
Hai ragione, non avevo pensato ai plc. :)
^TiGeRShArK^
09-01-2005, 16:37
ma i plc non vengono programmati in ladder?:confused:
Fenomeno85
09-01-2005, 20:02
Originariamente inviato da repne scasb
Si tratta di un interrupt handler in modalita' reale.
Nel primi 1024 bytes a partire da 0000:0000 in modalita' reale sono stoccati 256 interrupt; per ogni interrupt si hanno 2 byte per l'offset e 2 byte per il segmento.
L'interrupt 9h viene richiamato ogni volta che si preme un tasto (in AX e' leggiibile lo scan-code), quindi per catturare l'INT 9h, questa routine sostituisce l'offset e il segmento originario con uno "specifico", modificanto le locazioni di memoria 0000: (9*4) e 0000: (9*4+2) (offset:segment).
Questa routine presenta alcune illegalita' ed e' in sostanza migliorabile:
1) Manca il LOCK tra i due XCHG. Se si prensentasse un INT 9h tra il primo e il secondo XCHG si otterrebbe un INT 9h incoerente.
2) L'INT 9h e' un NMI e non puo' essere disattivato tramite CLI, ma tramimte l'opportuna riprogrammazione del PIC.
3) Se si vogliono fare le cose per bene, si deve rimappare l'INT 1h hardware a monte dell'INT 9h software, chiamare l'INT software rimappato che chiamera l'INT 9h.
ma quante ne sai? :eek:
~§~ Sempre E Solo Lei ~§~
repne scasb
09-01-2005, 23:50
^TiGeRShArK^
10-01-2005, 14:36
si anke x il ladder infatti usavo il simulatore sul pc e poi si trasferiva il tutto al plc.
L'sfc se non sbaglio era un linguaggio + ad alto livello però ke doveva essere convertito in ladder x essere utilizzato (potrei anke sbagliarmi xkè ora come ora non ricordo se era SFC o qualke altra cosa....)
Cmq il ladder era simpatico :p
pacovt87
10-01-2005, 20:55
domanda da ignorantone: quali sono gli interrupt mascherabili?
repne scasb
10-01-2005, 21:56
pacovt87
10-01-2005, 23:48
visto che dai certe risposte io approfitto, almeno imparo qualcosa in più:D
questo è il continuo del codice (quello sopra):
NewKbrd:
; Salviamo i registri e carichiamo l'indirizzo del Buffer
PUSH AX ; Memorizza AX nello stack
PUSH BX ; Memorizza BX nello stack
PUSH DS ; Memorizza DS nello stack
PUSH CS ; Memorizza CS nello stack
XOR AX,AX ; Azzera AX
POP DS ; Imposta segment del Buffer
MOV BX,OFFSET Buffer ; Indirizzo dati tasti
; Leggiamo il valore inviato dalla tastiera (Porta 60H) - Se >= 128 -> tasto rilasciato
IN AL,60H ; Legge dato dalla porta della tastiera
OR AL,AL ; Controlla se >= 128
JS @N1 ; Se si salta
; Impostiamo lo stato del tasto a 1 (Tasto premuto)
ADD BX,AX ; Somma indice
MOV ScanCode,AL ; Tasto premuto
MOV BYTE PTR [BX],1 ; Attiva tasto
JMP @N2 ; Salta
; Queste istruzioni invece servono quando il tasto viene rilasciato
@N1: AND AL,07FH ; Maschera tasto
ADD BX,AX ; Somma indice
MOV ScanCode,0 ; Tasto rilasciato
MOV BYTE PTR [BX],0 ; Disattiva tasto
; A questo punto bisogna disattivare la richiesta di interrupt
; (non ci interessa avere copie multiple dello stesso tasto)
@N2: IN AL,61H ; Legge dato dalla porta 61H
OR AL,80H ; Attiva bit 7
OUT 61H,AL ; Invia il nuovo dato
; Infine bisogna avvertire il processore che può interessarsi degli
; altri interrupts eventualmente presenti
MOV AL,20H ; Carica valore
OUT 20H,AL ; Invia dato
; Ripristiniamo i registri salvati nello stack
POP DS ; Ripristina DS dallo stack
POP BX ; Ripristina BX dallo stack
POP AX ; Ripristina AX dallo stack
; Usciamo dalla procedura di interrupt (Occhio! IRET e non RET)
IRET ; Fine procedura di interrupt
1) i valori da 128 a 255 rappresentano i valori dei tasti quando sono rilasciati?
2)E' troppo se ti chiedo spiegazioni su queste righe? (poi prometto che per un pò non rompo i coglioni:D )
; A questo punto bisogna disattivare la richiesta di interrupt
; (non ci interessa avere copie multiple dello stesso tasto)
@N2: IN AL,61H ; Legge dato dalla porta 61H
OR AL,80H ; Attiva bit 7
OUT 61H,AL ; Invia il nuovo dato
; Infine bisogna avvertire il processore che può interessarsi degli
; altri interrupts eventualmente presenti
MOV AL,20H ; Carica valore
OUT 20H,AL ; Invia dato
Grazie di tutto
repne scasb
11-01-2005, 00:23
pacovt87
11-01-2005, 01:15
senti, ma c'è un testo dove posso trovà tutte queste cose?
i tutorials che trovo sul web sono incompleti, superficiali, danno per scontate tante cose fondamentali, che invece secondo me non sono scontate per niente.
A me la programmazione interessa a questi livelli, sapresti consigliarmi qualche fonte?
repne scasb
11-01-2005, 08:44
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.