Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [asm]funzioni per gli interrupt

    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!!
    "Penso che nel mondo ci sia mercato per quattro o cinque computer"... Thomas Watson, presidente della IBM, 1943

  2. #2

  3. #3
    la trovi anche tra le pillole in rilievo su questo forum (file .zip da scaricare)
    ...Terrible warlords, good warlords, and an english song

  4. #4
    su un tutorial ho trovato questo codice.. in pratica emette un beep dalla tastiera ogni volta che premi un tasto

    codice:
    .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
    www.vape04.too.it - informatica, elettronica e tante altre cose.
    @LFEO§OFT GREEnOS

  5. #5
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    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!!!!!! VVoVe: VVoVe: VVoVe:

  6. #6
    Grazie mille a tutti.. ciao ciao!
    "Penso che nel mondo ci sia mercato per quattro o cinque computer"... Thomas Watson, presidente della IBM, 1943

  7. #7
    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..
    www.vape04.too.it - informatica, elettronica e tante altre cose.
    @LFEO§OFT GREEnOS

  8. #8
    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!!!!!! VVoVe: VVoVe: VVoVe:
    xor al, 10000000b
    dovrebbe andare
    www.vape04.too.it - informatica, elettronica e tante altre cose.
    @LFEO§OFT GREEnOS

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.