PDA

Visualizza la versione completa : [asm]funzioni per gli interrupt


I'mtheleader
08-10-2004, 22:36
Ciao a tutti!
Da un po' ho inziato asm e lo trovo davvero interessante...

Volevo sapere una cosa... io sono a conoscenza di interrupt per la tasiera come la int 09h oppure per il mouse int 33h... ma il problema che non so la funzione(cio non so cosa spostare in ah) per fare determinate cose con quella periferica....(con funzioni ad esempio intendo la 09h della int 21h: mov ah,09h int 21h)....


Se qualcuno mi pi dare una mano... Ciao a tutti e grazie mille!! :unz:

internet
09-10-2004, 12:53
Hai gi provato a vedere la Interrupt List di Ralf Brown?

http://www.ctyme.com/intr/int-21.htm
http://www.ctyme.com/intr/int.htm
http://www.ctyme.com/intr/cat.htm
http://www.ctyme.com/rbrown.htm

Johnny_Depp
09-10-2004, 14:25
la trovi anche tra le pillole in rilievo su questo forum (file .zip da scaricare)

i'mshady
09-10-2004, 17:49
su un tutorial ho trovato questo codice.. in pratica emette un beep dalla tastiera ogni volta che premi un tasto


.MODEL SMALL

INTERRUPT_NUM EQU 9 ;Interrupt da intercettare


ROM_BIOS_DATA SEGMENT AT 40H ;Questi sono dati memorizzati
ORG 1AH ;nel BIOS all'ind. 0040:001A
HEAD DW ? ;Puntatore alla testa del buffer
TAIL DW ? ;Puntatore alla coda del buffer
BUFF DW 16 DUP(?);Buffer
BUFF_END LABEL WORD
ROM_BIOS_DATA ENDS

.CODE
ORG 100H
FIRST: JMP LOAD_PROG ;Carico in memoria il prg.
OLD_KEYBOARD_INT DD ? ;memorizza l'indirizzo al
;vecchio vettore di int.


PROG PROC
pusha ;salvo i registri

pushf
call OLD_KEYBOARD_INT ;chiamo la vecchia routine di int.

ASSUME ds:ROM_BIOS_DATA
push ds
mov bx,ROM_BIOS_DATA ;Questo gruppo di istruzioni
mov ds,bx ;mi serve per gestire il
mov bx,TAIL ;buffer dei caratteri letti
cmp bx,HEAD
je EXIT ;Non ci sono caratteri
sub bx,2 ;si sposta di due bytes
cmp bx,OFFSET BUFF ;controlla di non uscire
jae NO_WRAP
mov bx,OFFSET BUFF_END
sub bx,2 ;BX punta al carattere
NO_WRAP: mov dx,[bx] ;in DL c' il carattere letto


;QUI CI VA IL PROGRAMMA: In questo esempio ho deciso di emettere un BEEP ma
;si pu fare qualunque cosa. Tranne che chiamare un interrupt del DOS!!
;--------------------------------------------------------------------------

cmp dl,'b' ;il carattere letto 'b' ?
jne EXIT ;se no esci
;altrimenti suona

;routine di beep col timer vista prima
in al,61h ;Per il BEEP programmo il Timer
test al,3
jne skippa
or al,3
out 61h,al
mov al,0B6h
out 43h,al

skippa: mov al,06h ;frequenza LSB
out 42h,al
mov al,01h ;frequenza MSB
out 42h,al

mov cx,0FFFFh
wait_loop:
loop wait_loop ;ciclo di attesa

in al,61h ;silenzio
and al,0FCh
out 061h,al
;--------------------------------------------------------------------------

EXIT: pop ds
popa
iret
PROG ENDP

LOAD_PROG PROC ;Procedura che carica in memoria il prg.
mov ah,35h
mov al,INTERRUPT_NUM
int 21h ;Prelevo il vecchio vettore
mov WORD PTR OLD_KEYBOARD_INT,bx
mov WORD PTR OLD_KEYBOARD_INT[2],es

mov al,INTERRUPT_NUM
mov ah,25h
lea dx,PROG
int 21h ;Imposto quello nuovo

mov dx,OFFSET LOAD_PROG ;in DX ci va l'ultimo byte
;del prg.+1
int 27h ;Termina ma rimani in memoria
LOAD_PROG ENDP
END FIRST
ma non so dirti come funziona perch pesantino da leggere

cso
09-10-2004, 19:50
non c' niente da capire in quel programma perch sono semplicemente dei comandi gi fatti e non bisogna pensare per farli, solo copia e incolla.
Una robetta da pensare sarebbe questa.

Dato un registro (Ad esempio AL), negare il bit + significativo!

Questo uno dei pi facili esercizi che mi hanno dato in un compito!!!!!! :oVVoVe: :oVVoVe: :oVVoVe:

I'mtheleader
10-10-2004, 12:07
Grazie mille a tutti.. ciao ciao!

i'mshady
10-10-2004, 13:06
ora l'ho capito..
in pratica usi la 35h dell'int 21h per prendere il vettore interrupt e metterlo in una variablie, poi usi la 25h per intercettare un certo interrupt (es. 9h) e settare la procedura che deve eseguire.. poi con la int 27h finisci il tutto..

i'mshady
10-10-2004, 13:07
Originariamente inviato da cso
non c' niente da capire in quel programma perch sono semplicemente dei comandi gi fatti e non bisogna pensare per farli, solo copia e incolla.
Una robetta da pensare sarebbe questa.

Dato un registro (Ad esempio AL), negare il bit + significativo!

Questo uno dei pi facili esercizi che mi hanno dato in un compito!!!!!! :oVVoVe: :oVVoVe: :oVVoVe:
xor al, 10000000b
dovrebbe andare

Loading